Snake

Snake

snake

学年设计的时候做的贪吃蛇,只是简单的做出来基本操作,写的代码从时间和空间上看都不是很优。

这里讲一下大概思路:

一条蛇不停的移动, 玩家将控制蛇的方向,蛇在吃掉食物后,将会重新生成食物,若蛇吃到自己的身体或撞到边框则结束游戏并显示得分。

一个最简贪吃蛇游戏需要3个部分:

1.地图

2.蛇移动

3.食物

地图

地图使用了坐标函数设置,画一个框

移动

贪吃蛇的移动分为按键控制与在未有按键输入时向原方向移动。

按键控制使用kbhit()函数接受即可设置蛇的移动。

在未出现按键输入时,蛇将不停的向原方向移动(将每个蛇的坐标向前覆盖并清除最后一个坐标),还需要使用sleep()函数与循环。

sleep()函数可以在一定时间让蛇停下来(不然刚开局就死掉了)。

食物

食物需要在蛇吃掉后随机生成,且不能生成在蛇的身上。

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
291
292
293
294
295
296
#include<iostream>
#include <windows.h>
#include<ctime>
#include<queue>
#include<conio.h>//内含有kbhit()函数 在VC里面有这个头文件
#define Up 119//72
#define Down 115 //80
#define Left 97 //75
#define Right 100 //77
#define Enter 13
//上,下,左,右
//system("cls");//清屏函数
using namespace std;
//////////全局变量////////////
HANDLE hOut,hIn,hwnd;
bool alive;//是否存活
int grade=0;//得分
char key;
char direction;//方向
bool kk=false;
int length=2;//初始长度
bool f=false;//是否已经生成食物
int sx[100];//snake横坐标
int sy[100];//snake纵坐标
int food_x;//food横坐标
int food_y;//food纵坐标
int x,y,QAQ;
char QWQ;
///////////////////////////////

void HideCursor(int n) /*隐藏光标*/
{
CONSOLE_CURSOR_INFO cursor_info={1,n};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
//////////////颜色函数/////////////////
int color(int c){
hOut=GetStdHandle(STD_OUTPUT_HANDLE);//获取字符输出句柄
SetConsoleTextAttribute(hOut,c);//改变颜色
return 0;
}
void setXY(int x,int y) //移动坐标
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
/////////////////////////////////////

////////////画图///////////////////
void Interface_Design()
{
for(int i=0;i<24;i++)
{
setXY(0,i);
cout<<"#";
setXY(40,i);
cout<<"#";
}
for(int i=0;i<=40;i++)
{
setXY(i,0);
cout<<"#";
setXY(i,24);
cout<<"#";
}
setXY(50,20);
cout<<"操作";
setXY(50,22);
cout<<"w s a d 控制上下左右";
}
////////////////////////////////

/////////////////画蛇////////////////////
void snake()
{

for(int i=0;i<length;i++)
{
setXY(sx[i],sy[i]);
if(i==0) cout<<"@";
else cout<<"*";
}
}
void xY()
{
for(int i=length-1;i>=1;i--)
{
sx[i]=sx[i-1];
sy[i]=sy[i-1];
}
}//坐标移动
/////////////////////////////////////////
void food()
{
int x,y;
srand((unsigned int)time(NULL));
int ww=1;
while(ww)
{
for(int i=0;i<20;i++)
{
x=rand()%(20-4)+2;
y=rand()%(20-2)+1;
}
for(int i=0;i<length;i++)
{
ww=0;
if(sx[i]==x&&sy[i]==y)
{
ww=1;
break;
}
}//不能再蛇的身体上生成食物
}
setXY(x,y);
food_x=x;
food_y=y;
cout<<'$';
f=true;
}//食物生成函数

void L()
{
if(sx[0]==food_x&&sy[0]==food_y)
{
f=false;
length++;
sx[length-1]=sx[length-2];
sy[length-1]=sy[length-2];
}
}//对蛇是否吃掉食物进行判定,并增加蛇的长度

////////////方向控制 ////////////////
void Control_Direction()
{
switch(key)
{
case Up:
direction=Up;
L();
setXY(sx[length-1],sy[length-1]);
cout<<" ";xY();
sy[0]--;
setXY(sx[0],sy[0]);
snake();
break;
case Down:direction=Down;
L();
setXY(sx[length-1],sy[length-1]);
cout<<" "; xY();
sy[0]++;
setXY(sx[0],sy[0]);
snake();
break;
case Left:direction=Left;
L();
setXY(sx[length-1],sy[length-1]);
cout<<" ";xY();
sx[0]--;
setXY(sx[0],sy[0]);
snake();
break;
case Right:direction=Right;
L();
setXY(sx[length-1],sy[length-1]);
cout<<" ";xY();
sx[0]++;
setXY(sx[0],sy[0]);
snake();
break;
}
}
//////////////////////////////////////

////////////////死亡/////////////////
void dead()
{
if(sx[0]>39||sx[0]<1||sy[0]<1||sy[0]>23)
{

alive=false;
}
for(int i=1;i<length;i++)
{
if(sx[0]==sx[i]&&sy[0]==sy[i])
{
alive=false;
}
}
}
/////////////////////////////////////


////////////////菜单///////////////////
int menu()
{
setXY(50,5);
cout<<" 贪吃蛇游戏"<<endl<<endl<<endl;
setXY(50,10);
cout<<" 普通模式"<<endl<<endl<<endl;
setXY(50,15);
cout<<" 困难模式"<<endl;
setXY(15,25);
cout<<"w s上下选择 回车 确认选择";
setXY(30,10);

while(kbhit())
{
HideCursor(0);
QWQ=getch();
if(QWQ==Up)
{
setXY(30,15);
cout<<" ";
setXY(30,10);
cout<<"--------->>>";
x=30;
y=10;
}
else if(QWQ==Down)
{
setXY(30,10);
cout<<" ";
setXY(30,15);
cout<<"--------->>>";
x=30;
y=15;
}
else if(QWQ==13)
{
if(y==10)
return 1;
if(y==15)
return 2;

}

}
}
/////////////////////////////////////
int main()
{
int mm=1;
HideCursor(0);
x=30;y=10;
setXY(30,10);
cout<<"--------->>>";
while(QWQ!=13)
{
Sleep(200);
mm=menu();
}
system("cls");//清屏函数
setXY(5,5);
if(mm==1) QAQ=200;
else if(mm==2) QAQ=170-length*2;
color(3);
HideCursor(0);
alive=true;
srand(time(NULL));
Interface_Design(); //界面设计
sx[0]=5;
sy[0]=5;
sx[1]=4;
sy[1]=5;
snake();
key=Right;
direction=0;
while(1)
{ color(6);
if(!f)food();
color(2);
Sleep(QAQ);
if(kbhit())
{
if((key=getch())==-32) key=getch();
}
if(key==Up&&direction==Down) key=Down;
else if(key==Down&&direction==Up) key=Up;
else if(key==Right&&direction==Left) key=Left;
else if(key==Left&&direction==Right) key=Right;
Control_Direction();
dead();
if(!alive) break;
setXY(50,25);
cout<<"得分:"<<(length-2)*2<<endl;
}
color(7);
system("cls");//清屏函数
cout<<"GAME OVER"<<endl;
cout<<"得分:"<<(length-2)*2<<endl;
system("pause");
return 0;
}

这里我还加了颜色改变和主菜单,也十分简单,使用坐标函数即可。

如果想要显示最高分的话我想的是使用文件那一块的知识。

# game
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×