小时候相信大家都玩过贪吃蛇,但是自从学了编程以后我都想自己实现一下,苦于没有契机。
首先看一下游戏效果把:
接下来我们先分析一下贪吃蛇的需求有哪些:
- 用合适的数据结构表示蛇、食物
- 地图的初始化
- 蛇的移动、食物的随机生成
- 蛇的显示、食物的显示
- 贪吃蛇的规则确定(碰到食物边长、碰到边界和自己死亡等……)
主要功能需求就是上面这些,接下来我直接上C语言代码,这个游戏相信没做过的人看完之后会觉得非常简单,因为其中没什么技术点可言,最重要的就是下面这几句代码,用于控制光标的位置。
1
2
3
4
5
6
|
#include<Windows.h>
COORD cor;
cor.X = 0;
cor.Y =2;
//光标位置更新到(0,2)
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
|
源码:
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
|
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>
#define WIDE 60
# define HIGH 20
//1设置地图边界
//2初始化蛇的初始坐标、以及事务
//3、将蛇和食物显示
//4 蛇的移动(WASD)
/*
规则:
蛇碰到强死掉
蛇碰到自己死掉
蛇碰到食物,身体增长,增加分数
*/
//5.蛇死掉显示分数
//存储蛇的每一节的坐标
typedef struct _body
{
int x;
int y;
}BODY;
typedef struct _snake
{
//存储蛇的身体
BODY list[WIDE * HIGH]; //身体的每一节坐标
int size; //记录身体长度
BODY food; //食物的位置
int dx; //x移动方向
int dy; //y移动方向
//记录设尾位置
int lastx;
int lasty;
}SNAKE;
//初始化食物坐标
void initFood(SNAKE* s)
{
srand ( time (NULL));
s->food.x = rand () % WIDE;
s->food.y = rand () % HIGH;
}
//初始化蛇
void initSnake(SNAKE* s)
{
//头部
s->list[0].x = WIDE / 2;
s->list[0].y = HIGH / 2;
//第一节
s->list[1].x = WIDE / 2-1;
s->list[1].y = HIGH / 2;
//记录身体大小
s->size = 2;
//初始化食物的坐标
initFood(s);
//默认向右移动
s->dx = 1;
s->dy = 0;
}
//显示蛇
void showUi(SNAKE* s)
{
/*
每次显示都要设置光标的位置
*/
//显示蛇
COORD cor;
for ( int i = 0; i < s->size; ++i)
{
//设置光标的位置
cor.X = s->list[i].x;
cor.Y = s->list[i].y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);
//蛇头
if (i == 0)
{
printf ( "@" );
continue ;
}
printf ( "*" );
}
//显示食物
cor.X = s->food.x;
cor.Y = s->food.y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);
printf ( "#" );
//清除掉蛇尾
cor.X = s->lastx;
cor.Y = s->lasty;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
printf ( " " );
}
//更新的蛇的坐标
void moveSnake(SNAKE* s)
{
//记录下蛇尾的位置
s->lastx = s->list[s->size - 1].x;
s->lasty = s->list[s->size - 1].y;
for ( int i = s->size-1; i >0; --i)
{
s->list[i].x = s->list[i - 1].x;
s->list[i].y = s->list[i - 1].y;
}
s->list[0].x += s->dx;
s->list[0].y += s->dy;
}
void controlSnake(SNAKE* s)
{
char key=0;
//判断按键
while (_kbhit())
{
key = _getch();
}
switch (key)
{
case 'a' :
s->dx = -1;
s->dy = 0;
break ;
case 's' :
s->dx = 0;
s->dy = 1;
break ;
case 'd' :
s->dx = 1;
s->dy = 0;
break ;
case 'w' :
s->dx = 0;
s->dy = -1;
break ;
default :
break ;
}
}
//游戏结束
void gameEnd(SNAKE* s)
{
COORD cor;
cor.X = 0;
cor.Y = HIGH + 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
printf ( "游戏结束,最终得分为%d\n" , (s->size - 2) * 10);
//直接退出程序
exit (0);
}
//蛇吃到自己
void snakeEatSelf(SNAKE* s)
{
for ( int i = 1; i < s->size; ++i)
{
if (s->list[0].x == s->list[i].x && s->list[0].y == s->list[i].y)
{
gameEnd(s);
}
}
}
//吃到食物
void snakeEatFood(SNAKE* s)
{
if (s->list[0].x == s->food.x && s->list[0].y == s->food.y)
{
//食物重置
initFood(s);
//蛇加长
s->size++; //增加后的坐标在移动的时候会自己进行加长
}
}
//开始游戏
void startGame(SNAKE* s)
{
//每次对蛇头是否碰墙进行判断
while (s->list[0].x<WIDE&&s->list[0].x>=0&&s->list[0].y<HIGH&&s->list[0].y>0)
{
//控制方向
controlSnake(s);
//更新蛇的坐标
moveSnake(s);
//system("cls");//清屏
//蛇移动
showUi(s);
//判断蛇是否碰到自己
snakeEatSelf(s);
//吃到食物
snakeEatFood(s);
//蛇的速度可以通过睡眠时间进行调整
Sleep(200);
}
gameEnd(s);
}
//初始化边界
void initWall()
{
COORD cor;
for ( int i = 0; i <= WIDE; ++i)
{
for ( int j = 0; j <= HIGH; ++j)
{
if (i == 0 || i == WIDE||j==0||j==HIGH)
{
COORD cor;
cor.X = i;
cor.Y = j;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
printf ( "+" );
}
}
}
}
//隐藏光标
void hideCursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof (cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
int main()
{
//隐藏光标
hideCursor();
//初始化地图
initWall();
//蛇类型定义
SNAKE* snake = (SNAKE*) malloc ( sizeof (SNAKE));
//初始化蛇和食物
initSnake(snake);
//显示蛇
showUi(snake);
//开始游戏
startGame(snake);
free (snake);
//程序在HIGH+1行后面输出
COORD cor;
cor.X = 0;
cor.Y =HIGH+2;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
return 0;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_42214953/article/details/108960866