服务器之家

服务器之家 > 正文

C语言开发实现贪吃蛇游戏

时间:2021-09-18 15:33     来源/作者:C 小白

本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

1、最好用VS运行
2、用到的函数有:_kbhit _getch EasyX图形库内一系列函数
3、蛇身与食物用矩形画的

代码如下:

?
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
#include<stdio.h>
#include<graphics.h>   //easyx头文件
#include<conio.h>
#include<time.h>
/********************设置各种属性**********************/
//坐标属性
typedef struct point {
 int x, y;
}PYINT;
//蛇
struct snake {
 PYINT xy[100];    //蛇的每节坐标放到数组中
 int position;    //方向
 int num;       //长度
}SNAKE;
//食物
struct food{
 PYINT fdxy;
 int flag;      //是否存在
 int grade;      //成绩
}FOOD;
//枚举:方向
//也可用宏 #define
enum position
{
 up, down, left, right
};
/**********************对蛇的操作*****************************/
//初始化蛇
//蛇的每节为 10x10填充的矩形
void initsnake()
{
 SNAKE.xy[0].x = 0;
 SNAKE.xy[0].y = 0;
 //数组第一个元素为蛇头
 SNAKE.xy[1].x = 10;
 SNAKE.xy[1].y = 0;
 SNAKE.xy[2].x = 20;
 SNAKE.xy[2].y = 0;
 SNAKE.position = right; //方向  (随便给)
 SNAKE.num = 3;      //数量 (随便给)
}
//画蛇
void Drawsnake()
{
 for (int i = 0; i < SNAKE.num; i++)
 {
 setlinecolor(BLACK);
 setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
 fillrectangle(SNAKE.xy[i].x, SNAKE.xy[i].y, SNAKE.xy[i].x + 10, SNAKE.xy[i].y + 10);
 }
}
//使蛇动起来
/*
  蛇头每向前动一格,其后紧随蛇头:
  我们把蛇的每节坐标放到数组里(蛇头坐标放在数组的第一个),移动时,只需使蛇头(数组第一个元素)改变,其后与前面交换;
*/
void Movesnake()
{
 for (int i = SNAKE.num; i > 0; i--) {
 SNAKE.xy[i].x = SNAKE.xy[i - 1].x;
 SNAKE.xy[i].y = SNAKE.xy[i - 1].y;  //使每个元素向前移动
 }
 switch (SNAKE.position)
 {
 case up:         
 SNAKE.xy[0].y -= 10;
 break;
 case down:
 SNAKE.xy[0].y += 10;
 break;
 //上下移动 X坐标不发生改变
 case left:
 SNAKE.xy[0].x -= 10;
 break;
 case right:
 SNAKE.xy[0].x += 10;
 break;
  //左右移动 Y坐标不发生改变
 }
}
/******************************按键操作*****************************************/
//当蛇向上运动时,按向下键无效(其他三个相同)
void Keydown()
{
 char ch = _getch();
 switch (ch)
 {
 case 'W':
 case 'w':
 case 72:              //小键盘上的“向上”
 if (SNAKE.position != down)  //是否向下
  SNAKE.position = up;
 break;
 case 'S':
 case 's':
 case 80:              //小键盘上的“向下”
 if (SNAKE.position != up)   //是否向上
  SNAKE.position = down;
 break;
 case 'A':
 case 'a':
 case 75:             //小键盘上的“向左”
 if (SNAKE.position != right) //是否向右
  SNAKE.position = left;
 break;
 case 'D':
 case 'd':
 case 77:              //小键盘上的“向右”
 if (SNAKE.position != left)  //是否向左
  SNAKE.position = right;
 break;
 }
}
/******************************食物操作**************************************/
//初始化食物
void initfood()
{
 FOOD.fdxy.x = rand() % 60 * 10;       
 FOOD.fdxy.y = rand() % 40 * 10;           //把食物的坐标控制在游戏界面内
 FOOD.flag = 1; //1代表存在食物
 //FOOD.grade = 0;
 for (int i = 0; i < SNAKE.num; i++) {
 if (FOOD.fdxy.x == SNAKE.xy[i].x&&FOOD.fdxy.y == SNAKE.xy[i].y) //如果食物出现在蛇身上,重新产生X Y的值
 {
  FOOD.fdxy.x = rand() % 60 * 10;
  FOOD.fdxy.y = rand() % 40 * 10;
 }
 }
}
//画食物
void Drawfood()
{
 setlinecolor(BLACK);
 setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));        
 fillrectangle(FOOD.fdxy.x, FOOD.fdxy.y, FOOD.fdxy.x + 10, FOOD.fdxy.y + 10);
}
/*************************************吃食物*************************************************/
void eatfood()
{
 if (SNAKE.xy[0].x == FOOD.fdxy.x&&SNAKE.xy[0].y == FOOD.fdxy.y) {
 SNAKE.num++;
 FOOD.flag = 0;      //食物存在的标记(1:存在 0;不存在)
 FOOD.grade += 10;    //每吃一个食物分数加10 (每个食物是10分,可随意改变)
 }
}
/*************************************显示分数*************************************************/
void putgrade()
{
 char str[20] = " ";
 sprintf_s(str, "greade: %d", FOOD.grade);
 settextcolor(RED);             //设置字体颜色
 outtextxy(500, 50, str);
}
/***********************************游戏结束***************************************************/
//当蛇头撞墙(蛇头撞上自身)
//只分析一种情况
int gameover()
{
 if (SNAKE.xy[0].x > 600 || SNAKE.xy[0].x < 0 | SNAKE.xy[0].y>400 || SNAKE.xy[0].y < 0) //撞墙
 {
 initgraph(800, 600);
 settextcolor(RED);
 outtextxy(600, 400, "你撞墙了");
 settextcolor(YELLOW);
 settextstyle(50, 50, "楷体");   //字体样式
 outtextxy(200, 250, "GAME OVER"); //指定位置输出字符串
 return 1;
 }
 return 0;
}
/*****************************************************************************************/
int main()
{
 initgraph(600, 400);
 setbkcolor(BLACK); //背景颜色
 cleardevice();         //清屏:刷新屏幕
 srand((unsigned int)time(NULL)); //随机数种子
 initsnake();
 Drawsnake();
 while (1)
 {
 cleardevice(); //清屏
 Movesnake();
 Drawsnake();
 if (FOOD.flag == 0) {
  initfood();
 }
 Drawfood();
 if (_kbhit()) {   //_kbhit: 检测是否有按键动作
  Keydown();
 }
 if (gameover()) {  //若函数返回1:结束游戏
  break;
 }
 eatfood();
 putgrade();
 Sleep(100);  //延长时间 (即蛇移动的速度)
 }
 _getch();     //防止闪屏
 closegraph();   //关闭窗口
 return 0;
}
/**********************************************************/
//RGB(rand() % 255, rand() % 255, rand() % 255) 在三基色范围内随机产生
//记得安装EasyX插件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/m0_47329175/article/details/107152542

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部