本人对游戏比较感兴趣,这次亲手做一款经典小游戏:贪吃蛇。
代码如下: (比较重点或者关键的点已经在代码中做好注释)
复制代码
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#include<graphics.h> //窗口头文件 #include<conio.h> //获取键盘按键相关操作 #include<iostream> #include<stdlib.h> //设置种子所需要的头文件 #define Snake_Max 500 //蛇的最大长度 #define Width 700 //窗口长度 #define Height 600 //窗口高 using namespace std; struct Snake { int size; int dir; int speed; POINT coor[Snake_Max]; //POINT保存的是点的坐标(一个结点有x、y坐标)、创建500个结点 }snake; struct Food { //食物结构体 int x; int y; int r; bool flag; DWORD color; //DWORD 表示 unsigned long }food; enum DIR { UP,DOWN,LEFT,RIGHT, //上下左右 }; //游戏数据初始化 void GameInit() { srand(time(NULL)); initgraph(Width, Height); //创建窗口 snake.size = 5; snake.dir = RIGHT; snake.speed = 2; for ( int i = snake .size-1; i >= 0; i--) { snake.coor[i].x = 100-10*i; snake.coor[i].y = 100; } food.x = rand() % Width; //食物初始化 food.y = rand() % Height; srand(time(NULL)); food.color = RGB(rand()%255, rand()%255, rand()%255); food.flag = true; food.r =8; } //游戏绘制 void GameDraw() { BeginBatchDraw(); //双缓冲绘图 (批量绘图) setbkcolor(RGB(215, 186, 48)); //设置背景颜色 cleardevice(); //“生成背景颜色” setfillcolor(BLUE); //设置蛇的颜色 for (int i = 0; i < snake.size; i++) { solidcircle(snake.coor[i].x, snake.coor[i].y, 5); } setfillcolor(food.color); //食物的颜色随机生成 if (food.flag) { solidcircle(food.x, food.y, food.r); } EndBatchDraw(); } //移动蛇 蛇的坐标发生改变 void SnakeMove() { for (int i = snake.size - 1; i > 0; i--) { snake.coor[i] = snake.coor[i - 1]; } switch (snake.dir) { case UP: snake.coor[0].y -= snake.speed; if (snake.coor[0].y == 0) snake.coor[0].y += Height; break; case DOWN: snake.coor[0].y+= snake.speed; if (snake.coor[0].y == Height) snake.coor[0].y -= Height; break; case LEFT: snake.coor[0].x-= snake.speed; if (snake.coor[0].x == 0) snake.coor[0].x += Width; break; case RIGHT: snake.coor[0].x+= snake.speed; if (snake.coor[0].x == Width) snake.coor[0].x -= Width; break; } } //通过按键改变蛇的移动方向 void keyControl() { if (_kbhit()) { //判断有没有按键,有就返回真值1 switch (_getch()) { case 72: case 'w': case 'W': if(snake.dir != DOWN)snake.dir = UP; break; case 80: case 's': case 'S': if (snake.dir != UP)snake.dir = DOWN; break; case 75: case 'a': case 'A': if (snake.dir != RIGHT)snake.dir = LEFT; break; case 77: case 'd': case 'D': if (snake.dir != LEFT)snake.dir = RIGHT; break; case ' ': while (1) { if (_getch() == ' ') return; } default: break; } } } //吃食物 void EatFood() { if (snake.coor[0].x >= food.x-food.r && snake.coor[0].x <= food.x + food.r && snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r &&food.flag) { food.flag = 0; snake.size++; } if (!food.flag) { food.x = rand() % Width; //食物初始化 food.y = rand() % Height; food.color = RGB(rand() % 256, rand() % 256, rand() % 256); food.flag = true; food.r = 8; } } int main() { GameInit(); while (1) { //保留窗口 GameDraw(); SnakeMove(); keyControl(); //控制蛇头方向 Sleep(10); //延迟20毫秒 EatFood(); //Stop(); }; return 0; }
效果图如下所示:
自认为的不足之处:
1.游戏总体而言做的比较单调,包括背景、边界、食物大小和颜色、蛇的形态等等,这些都可以进行改进。
2.地图太大。所设计的穿越边界也不符合游戏规则,减小了游戏难度。
3.没有添加音效。改进的话可以从添加背景音乐、吃食物之后有奖励音效入手。
4.蛇是永生的,就算是撞到自己也安然无恙。
5.等等等等。
制作本游戏仅仅是个人爱好,不喜勿喷啦~~~发现不足的地方也可以一起交流~
最后
以上就是单薄铅笔最近收集整理的关于C++贪吃蛇小游戏的全部内容,更多相关C++贪吃蛇小游戏内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复