vlambda博客
学习文章列表

【C语言项目】贪吃蛇游戏(下)

07. 游戏逻辑

7.5 按下ESC键结束游戏

在moveKeyControl函数中添加如下代码片段

		//按下F2减速
if (GetAsyncKeyState(VK_F2))
{
speedDown();
}

//按下ESC键 结束游戏
if (GetAsyncKeyState(VK_ESCAPE))
{
endStatus = 3;

break;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

7.6 判断是否撞到墙

参考代码:

//判断是否撞墙
int isHitWall(void)
{
if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
{
return 1;
}
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

在snake.c文件moveKeyControl函数中添加如下代码

		Sleep(sleepTime);

moveSnake();

//判断是否撞墙
if (isHitWall())
{
endStatus = 1;

break;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

7.7 判断是否咬到自己

判断是否咬到自己

//判断是否咬到自己
int isBitSelf(void)
{
snake_t *tmp = NULL;

tmp = head->next;
while (NULL != tmp)
{
if (tmp->x == head->x && tmp->y == head->y)
{
return 1;
}

tmp = tmp->next;
}

return 0;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

在snake.c文件moveKeyControl函数中添加如下代码

		//判断是否撞墙
if (isHitWall())
{
endStatus = 1;

break;
}

//判断是否咬到自己
if (isBitSelf())
{
endStatus = 2;

break;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

08. 游戏失败界面设计

8.1 游戏失败界面边框设计

游戏边框失败界面分析

【C语言项目】贪吃蛇游戏(下)

参考源代码

//游戏失败界面边框
void failGameUi(void)
{
int i;

system("cls");

//显示游戏失败提示
setColor(12);
gotoXY(44, 3);
printf("游 戏 失 败!!!");

setColor(11);
gotoXY(17, 5);

//绘制上边框
printf("+----------------------------------------------------------------+");

//绘制下边框
gotoXY(17, 20);
printf("+----------------------------------------------------------------+");

//绘制左右边框
for (i = 6; i < 20; i++)
{
gotoXY(17, i);
printf("|");

gotoXY(82, i);
printf("|");
}
}
  • 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

在moveKeyControl函数中按下ESC选项中添加如下代码

		//按下ESC键 结束游戏
if (GetAsyncKeyState(VK_ESCAPE))
{
endStatus = 3;
failGameUi();
break;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

8.2 撞墙失败界面

显示效果如下:

【C语言项目】贪吃蛇游戏(下)

界面分析

【C语言项目】贪吃蛇游戏(下)

参考代码:

//结束游戏
int endGame(void)
{
int n;
int highScore;

//显示游戏失败边框
failGameUi();

setColor(12);

//根据不同的状态显示不同的失败提示
switch (endStatus)
{
//撞到墙
case 1:
gotoXY(38, 9);
printf("您撞到墙了,游戏结束!!!");
break;

//咬到自己
case 2:
break;

//用户按下ESC退出
case 3:
break;

default:
;
}

//显示您的得分
gotoXY(43, 12);
setColor(13);
printf("您的得分: %d", score);


//从文件中读取最高分
highScore = readFile();

if (score > highScore)
{
setColor(10);
gotoXY(38, 16);
printf("恭喜你, 你已经创记录了,");
//写文件
//writeFile(score);
}
else
{
setColor(10);
gotoXY(38, 16);
printf("加油哦,离最高分还差%d分", highScore - score);
}


return 0;
}
  • 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

8.3 咬到蛇身失败界面

显示效果如下:

【C语言项目】贪吃蛇游戏(下)

在endGame函数中修改代码如下

//结束游戏
int endGame(void)
{
int n;
int highScore;

//显示游戏失败边框
failGameUi();

setColor(12);
gotoXY(38, 9);

//根据不同的状态显示不同的失败提示
switch (endStatus)
{
//撞到墙
case 1:
printf("您撞到墙了,游戏结束!!!");
break;

//咬到自己
case 2:
printf("您咬到蛇身了,游戏结束!");
break;

//用户按下ESC退出
case 3:
break;

default:
;
}

//显示您的得分
gotoXY(43, 12);
setColor(13);
printf("您的得分: %d", score);


//从文件中读取最高分
highScore = readFile();

if (score > highScore)
{
setColor(10);
gotoXY(38, 16);
printf("恭喜你, 你已经创记录了,");
//写文件
//writeFile(score);
}
else
{
setColor(10);
gotoXY(38, 16);
printf("加油哦,离最高分还差%d分", highScore - score);
}

return 0;
}
  • 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

8.4 ESC结束游戏界面

显示效果:

【C语言项目】贪吃蛇游戏(下)

在endGame函数中修改代码如下

//结束游戏
int endGame(void)
{
int n;
int highScore;

//显示游戏失败边框
failGameUi();

setColor(12);
gotoXY(38, 9);

//根据不同的状态显示不同的失败提示
switch (endStatus)
{
//撞到墙
case 1:
printf("您撞到墙了,游戏结束!!!");
break;

//咬到自己
case 2:
printf("您咬到蛇身了,游戏结束!");
break;

//用户按下ESC退出
case 3:
printf("您已经结束了游戏,游戏结束");
break;

default:
;
}

//显示您的得分
gotoXY(43, 12);
setColor(13);
printf("您的得分: %d", score);


//从文件中读取最高分
highScore = readFile();

if (score > highScore)
{
setColor(10);
gotoXY(38, 16);
printf("恭喜你, 你已经创记录了,");
//写文件
//writeFile(score);
}
else
{
setColor(10);
gotoXY(38, 16);
printf("加油哦,离最高分还差%d分", highScore - score);
}

return 0;
}
  • 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

8.5 界面添加选择

显示效果如下:

界面分析

代码实现

//结束游戏
int endGame(void)
{
int n;
int highScore;

while (1)
{
//显示游戏失败边框
failGameUi();

setColor(12);
gotoXY(38, 9);

//根据不同的状态显示不同的失败提示
switch (endStatus)
{
//撞到墙
case 1:
printf("您撞到墙了,游戏结束!!!");
break;

//咬到自己
case 2:
printf("您咬到蛇身了,游戏结束!");
break;

//用户按下ESC退出
case 3:
printf("您已经结束了游戏,游戏结束");
break;

default:
;
}

//显示您的得分
gotoXY(43, 12);
setColor(13);
printf("您的得分: %d", score);


//从文件中读取最高分
highScore = readFile();

if (score > highScore)
{
setColor(10);
gotoXY(38, 16);
printf("恭喜你, 你已经创记录了,");
//写文件
//writeFile(score);
}
else
{
setColor(10);
gotoXY(38, 16);
printf("加油哦,离最高分还差%d分", highScore - score);
}

//输出用户选择信息
gotoXY(25, 23);
setColor(12);
printf("在玩一局请输入: 1");

gotoXY(52, 23);
printf("直接退出请输入:2");

gotoXY(46, 25);
setColor(11);
printf("请选择:");

scanf("%d", &n);
getchar();

if (1 == n)
{
score = 0;
sleepTime = 350;
add = 1;
break;
}
else if (2 == n)
{
exit(0);
}
else
{
gotoXY(30, 27);
setColor(12);
printf("您的输入有误, 请重新输入, 按下任意键继续");
getchar();
}
}
return 0;
}
  • 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

8.6 写文件实现

//写文件
int writeFile(int score)
{
FILE *fp = NULL;

fp = fopen("save.txt", "w+");

fprintf(fp, "%d", score);

fclose(fp);

return 0;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

在endGame函数中,如果破纪录了就写文件


if (score > highScore)
{
setColor(10);
gotoXY(38, 16);
printf("恭喜你, 你已经创记录了,");
//写文件
writeFile(score);
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

09. 一起来找茬


//销毁蛇
int destroySnake(void)
{
snake_t *tmp = NULL;
snake_t *save = NULL;

tmp = head;
while (NULL != tmp)
{
save = tmp->next;
free(tmp);
tmp = save;
}

head = NULL;

return 0;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

10. 项目扩展

  • 设置关卡

    蛇移动速度

  • 保存每一个用户的得分信息

  • 排名榜

11. 项目总结

基础知识:C语言 数据结构中简单单向链表