C语言贪吃蛇源代码收藏

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
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#define maxy 20
//设置高度
#define maxx 30
//设置宽度
void zk();//制框
void init();//初始化
void printmap();//打印
void move();//操作
int pd(int x,int y);//判断游戏结果
int food();//产生食物
int a[maxy][maxx];//地图
int headx,heady;//蛇头
int m;//是否吃到食物
int len;//蛇长
int fx;//方向
int score;//得分
int flag;//控制游戏结束
int mm;//控制食物的产生
int main()
{
while (1)
{
init();
zk();
do
{
if (mm)
{
food();
mm=0;
}
clrscr(); //清屏
move(); //移动
printmap(); //打印图
usleep(333333);//延迟
}while (flag);
printf("按任意键开始新游戏。。");
getch();
}
return 0;
}
void init() //初始化
{
headx=maxx/2-5;heady=maxy/2;
a[heady][headx]=1;
a[heady][headx-1]=2;
a[heady][headx-2]=3;
m=0;
len=3;
fx=6;
score=0;
flag=1;
mm=1;
}
void zk()//边界地图
{
int i,j;
for(i=0;i<maxy;i++)
for(j=0;j<maxx;j++)
if(i==0||i==maxy-1||j==0||j==maxx-1)
a[i][j]=-2;//边界
else a[i][j]=0;//内部
}
void printmap()//打印
{
int i,j;
for (i=0;i<maxy;i++)
{
for (j=0;j<maxx;j++)
{
if (a[i][j]==0)
printf("\033[47m \033[0m");//空白
else if (a[i][j]>1)
printf("\033[31;42m哈\033[0m");//蛇身
else if (a[i][j]==1)
printf("\033[34;45m头\033[0m");//蛇头
else if (a[i][j]==-1)
printf("\033[33;47m🍄 \033[0m");//食物
else
printf("\033[43m \033[0m");//边界
}
printf("\n");
}
printf("\033[31;47mlen:%5d score:%5d\033[0m\n",len,score);
}
int food()
{
int i,j,count=0,kk;
srand(time(NULL));//随机产生食物
kk=rand()%((maxx-2)*(maxy-2)-len-1);
for (i=1;i<maxy-1;i++)
for (j=1;j<maxx-1;j++)
if (a[i][j]==0)//空白处
{
count++;
if (count==kk)
{
a[i][j]=-1;
return 0;
}
}
return 0;
}
void move()
{
int nn=fx;
while (kbhit())//判断键盘有无输入
//修改,if->while
nn=getch()-48;//若有,由getch()读入
if (fx+nn!=10)//防止倒退致死
switch(nn)
{
case 2:pd(0,-1);fx=2;break;//蛇头上移
case 4:pd(-1,0);fx=4;break;//蛇头左移
case 6:pd(1,0);fx=6;break;//蛇头右移
case 8:pd(0,1);fx=8;break;//蛇头下移
case 5:getch();//暂停,按任意键继续
default:break;//暂停游戏
}
}
int pd(int x,int y)
{
int i,j;
headx=headx+x;
heady=heady+y;
if (a[heady][headx]==-1)
{
m=1;
len++;
mm=1;
score=score+5+(len%3);//计分
}
else if (a[heady][headx]!=0)
{
printf("GAME OVER!\n");//游戏结束
flag=0;
}
for (i=1;i<maxy-1;i++)
for (j=1;j<maxx-1;j++)
if(a[i][j]>=1)
{
a[i][j]++;//蛇尾移动
if (a[i][j]==len+1&&m==0)
a[i][j]=0;//没吃到食物,尾巴要移动
}
m=0;
a[heady][headx]=1;
return 0;
}