服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c++实现俄罗斯方块游戏代码

c++实现俄罗斯方块游戏代码

2022-08-08 10:47m0_51592169 C/C++

大家好,本篇文章主要讲的是c++实现俄罗斯方块游戏代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

俄罗斯方块c++

1.创建项目
2.总共需要创建两个文件,一个main.cpp,一个是elsfk2.h。本人使用的编译器是vs2019.

3.在项目的源文件夹下创建一个文件夹image

c++实现俄罗斯方块游戏代码

4.把下面两张图片重命名好放进刚创建的文件夹

c++实现俄罗斯方块游戏代码

elsfk.jpg

c++实现俄罗斯方块游戏代码

elsfk_block.jpg

5.把下列代码分别复制到对应文件中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
-----------------------------------------------------------------------------------
以下是main.cpp 文件的内容
 
 
#include"elsfk2.h"
 
int main() {
 
 
    srand((int)time(0));
    //创建游戏窗口
    renderwindow window(videomode(col*18/*+100*/, row*18-36),"elsfk");
 
    //添加游戏背景
    texture t1,t2;
    t1.loadfromfile("image/elsfk.jpg");
    t2.loadfromfile("image/elsfk_block.jpg");
    sprite sprite_bg(t1);
    sprite sprite_block(t2);
 
    newblock();
 
    clock begin;
    float time1 = 0, time2 = 0;
 
    while (window.isopen()) {
 
        time2 = begin.getelapsedtime().asseconds();
        begin.restart();
        time1 += time2;
        //等待用户按下按键
        keyevent(&window);
 
        if (time1 > delay) {
 
            time1 = 0;
            blockdrop();
            
 
        }
 
        delay = speed_nom;
 
        window.draw(sprite_bg);
 
        drawblock(&sprite_block, &window);
 
        window.display();
    
 
    }
 
 
}
 
 
 
--------------------------------------------------------------------------------
以下为elsfk2.cpp
 
 
#pragma once
#include<sfml/graphics.hpp>               //图像处理头文件
//#include<sfml/audio.hpp>           
#include<time.h>
using namespace sf;
#define row 22                          //行
#define col 10                          //列
#define speed_nom 0.5                   //不加速运动的时间间隔
#define speed_qik 0.05                  //加速运动的时间间隔
 
 
int map[row][col] = { 0 };              //游戏区域大小
int blocktype;                          //方块类型
int delete=0;                           //删除的行数
float delay = speed_nom;                //时间间隔
 
 
void move_x(int);
void rotate();
void clearblock();
void newblock();
void blockdrop();
void keyevent(renderwindow*);
void drawblock(sprite*, renderwindow*);
bool check();
 
//存放7种方块的二维数组
int a[7][4] = {
    1,3,5,7,
    2,4,5,7,
    3,5,4,6,
    3,5,4,7,
    2,3,5,7,
    3,5,7,6,
    2,3,4,5,
};
 
//点的结构体
struct point {
 
    int x, y;
 
};
 
//当前方块
point block[4];
//方块的备份
point bakblock[4];
 
 
//处理按键
void keyevent(renderwindow *w) {
    event e;
    bool rotate = 0;
    int x = 0;
    while (w->pollevent(e)) {
 
        if (e.type == event::closed) {
            w->close();
        }
 
        if (e.type == event::keypressed) {
            switch (e.key.code) {
            case keyboard::up:
                rotate = 1;
                break;
            case keyboard::left:
                x = -1;
                break;
            case keyboard::right:
                x = 1;
                break;
            default:
                break;
            }
        }
        if (keyboard::iskeypressed(keyboard::down)) {
            delay = speed_qik;
 
        }
 
        if (x) {
            move_x(x);
        }
 
        if (rotate) {
            rotate();
        }
 
    }
 
}
 
 
 
//消除完成的行
void clearblock() {
    int k = row - 1;
    for (int i = row - 1; i > 0; i--) {
        int count = 0;
        for (int j = 0; j < col; j++) {
            if (map[i][j]) {
                count++;
            }
            map[k][j] = map[i][j];
 
        }
        if (count < col) {
            k--;
        }
        
    }
 
}
 
 
//检查移动合理性
bool check() {
 
    for (int i = 0; i < 4; i++){
        if(   block[i].x<0||block[i].x>=col||block[i].y>=row||
        map[block[i].y][block[i].x]){
            return 0;
        }
    }
    return 1;
 
}
 
 
//方块降落
void blockdrop() {
    
    for (int i = 0; i < 4; i++) {
        bakblock[i] = block[i];
        block[i].y++;
 
    }
 
    if (!check()) {
        for (int j = 0; j < 4; j++){
            map[bakblock[j].y][bakblock[j].x] = blocktype;
        }
 
        newblock();
        clearblock();
    }
 
}
 
 
//左右移动
void move_x(int x) {
 
    for (int  i = 0; i < 4; i++){
        bakblock[i] = block[i];
        block[i].x += x;
 
    }
    if (!check()) {
        for (int i = 0; i < 4; i++) {
            block[i] = bakblock[i];
 
        }
    }
 
}
 
 
//旋转******************************    important
void rotate() {
    if (blocktype == 7) {
        return;
    }
    point p = block[1];
    for (int i = 0; i < 4; i++) {
        bakblock[i] = block[i];
        block[i].x = p.x - bakblock[i].y + p.y;
        block[i].y = bakblock[i].x - p.x + p.y;
    }
    if (!check()) {
        for (int i = 0; i < 4; i++) {
            block[i] = bakblock[i];
        }
    }
 
}
 
 
//生成方块
void newblock() {
 
    blocktype = 1 + rand() % 7;
 
    for (int i = 0; i < 4; i++) {
        block[i].x = a[blocktype-1][i] % 2+4;
        block[i].y = a[blocktype-1][i] / 2;
    }
 
 
}
 
 
//绘制方块
void drawblock(sprite *b, renderwindow *w) {
 
    //完成的方块
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (map[i][j] != 0) {
                b->settexturerect(intrect(map[i][j]*18,0,18,18));
                b->setposition(j * 18, i * 18);
                b->move(0, -36);
                w->draw(*b);
            }
 
        }
 
    }
 
    for (int j = 0; j < 4; j++)
    {
        b->settexturerect(intrect(blocktype * 18, 0, 18, 18));
        b->setposition(block[j].x * 18, block[j].y * 18);
        b->move(0, -36);
        w->draw(*b);
    }
 
}

到此这篇关于c++实现俄罗斯方块游戏代码的文章就介绍到这了,更多相关c++俄罗斯方块内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_51592169/article/details/122302785

延伸 · 阅读

精彩推荐
  • C/C++C++基于EasyX图形库实现2048小游戏

    C++基于EasyX图形库实现2048小游戏

    这篇文章主要为大家详细介绍了C++基于EasyX图形库实现2048小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Ugex5282021-08-20
  • C/C++C语言 数据结构之中序二叉树实例详解

    C语言 数据结构之中序二叉树实例详解

    这篇文章主要介绍了C语言 数据结构之中序二叉树实例详解的相关资料,需要的朋友可以参考下...

    dread_naught6832021-04-28
  • C/C++tinyxml 常用的C++ XML解析器非常优秀

    tinyxml 常用的C++ XML解析器非常优秀

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很...

    C++教程网1812020-11-09
  • C/C++C语言 指针与二维数组详解

    C语言 指针与二维数组详解

    本文主要介绍C语言 指针与二维数组,这里整理了详细的资料及示例代码,有需要的小伙伴可以参考下...

    C语言中文网7212021-04-14
  • C/C++C++实现四则运算器(带括号)

    C++实现四则运算器(带括号)

    这篇文章主要为大家详细介绍了C++实现四则运算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    shadowgully7862021-10-07
  • C/C++深入了解C语言字符函数和字符串函数

    深入了解C语言字符函数和字符串函数

    这篇文章主要给大家介绍了关于C语言字符/字符串的相关函数,文中通过示例代码总结的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需...

    小尹同学⁣7222021-12-08
  • C/C++详解C语言位域的使用与注意事项

    详解C语言位域的使用与注意事项

    所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以...

    zhenhuaqin10162021-04-22
  • C/C++讲解C++的do while循环和循环语句的嵌套使用方法

    讲解C++的do while循环和循环语句的嵌套使用方法

    这篇文章主要介绍了讲解C++的do while循环和循环语句的嵌套使用方法,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网8622021-03-12