20221212-贪吃蛇小游戏

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

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <stdbool.h>

#define H 23
#define W 75
#define WAIT_TIME 500

//定义direction的每个值代表的方向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3

int a[H][W]; //地图数组
int s[H*W][2]; //蛇身坐标数组
int sLength; //蛇的长度
int direction; //蛇的方向
bool eated=false; //标记是否吃到食物
int score=0; //得分

void init() //程序开始时的初始化操作
{
srand((unsigned)time(NULL)); //设置随机数种子为现在的时间
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隐藏关标
int i,j;
for(i=0; i<H; i++)
{
a[i][0]=1; //让第一列为1
a[i][W-1]=1; //让最后一列为1
}
for(j=0; j<W; j++)
{
a[0][j]=1; //让第一行为1
a[H-1][j]=1; //让最后一行为1
}
sLength=4; //让蛇的最初长度为4
s[0][0]=H/2;
s[0][1]=W/2; //给蛇头坐标赋值
for(i=1; i<4; i++)
{
s[i][0]=s[0][0]+i;
s[i][1]=s[0][1]; //给刚开始的蛇身几个初始坐标
}
direction=UP;
}

void gotoxy(int i,int j) //移动光标
{
COORD position= {j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
}

int check(int ii,int jj) //判断这个点能不能放食物,可以放返回1,不能放返回0
{
if(a[ii][jj]==1) //如果有障碍物,返回0
return 0;
int i;
for(i=0; i<sLength; i++)
{
if(ii==s[i][0]&&jj==s[i][1]) //如果和其中一个蛇身重合,就返回0
return 0;
}
if(ii==0||ii==H-1||jj==0||jj==W-1) //如果在边界上面,返回0
return 0;
return 1; //最后筛选 过后的是符合条件的点
}

void food()
{
int i,j;
do
{
i=rand()%H; //生成0~H-1之间的一个数
j=rand()%W;
}
while(check(i,j)==0); //生成点直到满足条件
a[i][j]=-1; //标记为食物
gotoxy(i,j);
printf("$"); //画出食物
}

void drawMap() //画地图
{
gotoxy(0,0);
int i,j;
for(i=0; i<H; i++)
{
for(j=0; j<W; j++) //两重for循环遍历数组
{
if(a[i][j]==0) //为0输出空格
printf(" ");
else //为1输出#
printf("#");
}
printf("\n"); //别忘了换行
}
}

void move()
{
int i;
gotoxy(s[sLength-1][0],s[sLength-1][1]);
printf(" "); //在尾巴上面画空格以擦除尾巴
if(eated) //如果吃到了食物
{
sLength++;
eated=false; //设置为false,不然无限变长
}
for(i=sLength-1; i>0; i--) //从尾巴开始,每一个点的位置等于它前面一个点的位置
{
s[i][0]=s[i-1][0];
s[i][1]=s[i-1][1];
}
switch(direction)
{
case UP:
s[0][0]--;
break;
case DOWN:
s[0][0]++;
break;
case LEFT:
s[0][1]--;
break;
case RIGHT:
s[0][1]++;
break;
}

}

void drawSnake() //画蛇
{
int i;
for(i=0; i<sLength; i++)
{
gotoxy(s[i][0],s[i][1]); //移动关标到蛇的坐标
printf("@"); //在这个位置画蛇
}
}

void key()
{
if(kbhit()!=0) //如果有键盘输入
{
char in;
while(!kbhit()==0) //如果玩家输入了多个按键,以最后一个按键为准
in=getch();
switch(in)
{
case 'w':
case 'W':
if(direction!=DOWN) //不能缩头吧。。。。
direction=UP;
break;
case 's':
case 'S':
if(direction!=UP)
direction=DOWN;
break;
case 'a':
case 'A':
if(direction!=RIGHT)
direction=LEFT;
break;
case 'd':
case 'D':
if(direction!=LEFT)
direction=RIGHT;
break;
case 'p':
case 'P':
gotoxy(H,0); //将光标移动到下面
system("pause");
gotoxy(H,0);
printf(" "); //消去下面的按任意键继续
break;
}
}
}

bool gameOver()
{
bool isGameOver=false;
int sX=s[0][0],sY=s[0][1]; //蛇头的x坐标和y坐标
if(sX==0||sX==H-1||sY==0||sY==W-1)
isGameOver=true;
for(int i=1; i<sLength; i++) //判断有没有吃到自己
{
if(s[i][0]==sX&&s[i][1]==sY)
isGameOver=true;
}
return isGameOver;
}

void printScore()
{
gotoxy(0,W+2);
printf(" 贪吃蛇小游戏");
gotoxy(1,W+2);
printf(" TeX白兔 制作");
gotoxy(4,W+2);
printf(" 得分:%d",score);
}

int main()
{
init(); //程序开始时的初始化操作
drawMap(); //画地图
food();
while(1)
{
drawSnake(); //画蛇
printScore();
Sleep(WAIT_TIME); //等待一段时间
key();
move(); //移动蛇(主要是修改蛇身数组的数据)
if(gameOver())
{
system("cls"); //清除屏幕内容
printf("Game Over\n");
system("pause");
break;
}
if(a[s[0][0]][s[0][1]]==-1) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0
{
eated=true; //标记已经吃到食物
score+=10;
food();
a[s[0][0]][s[0][1]]=0; //去掉食物
}

}
return 0;
}

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 TeX_baitu
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~