一、贪吃蛇小游戏简介:

用上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,也不能咬到自己的身体,等到了一定的分数,就能过关。

二、函数框架

三、数据结构

typedef struct Snake
{size_t x;  //行size_t y;  //列struct Snake* next;
}Snake, *pSnake;

定义蛇的结构体,利用单链表来表示蛇,每个结点为蛇身体的一部分。

四、代码实现(vs2010  c语言)

1.Snake.h

#ifndef __SNAKE_H__
#define __SNAKE_H__#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <malloc.h>
#include <assert.h>
//标识地图大小
#define ROW_MAP 10    //地图的行
#define COL_MAP 20    //地图的列
#define SUCCESS_SCORE 10//通关分数
enum Direction //蛇行走的方向
{R, //右L, //左U, //上D  //下
}Direction;enum State
{ERROR_SELF, //咬到自己ERROR_WALL, //撞到墙NORMAL,     //正常状态SUCCESS     //通关
}State;typedef struct Snake
{size_t x;  //行size_t y;  //列struct Snake* next;
}Snake, *pSnake;void StartGame();
void RunGame();
void EndGame();#endif

2.Snake.c

#include "Snake.h"pSnake head = NULL; //定义蛇头指针
pSnake Food = NULL; //定义食物指针int sleeptime = 500;//间隔时间,用来控制速度
int Score = 0;  //总分
int everyScore = 1; //每步得分//定义游戏中用到的符号
const char food = '#';
const char snake = '*';void Pos(int x, int y)   //控制输出光标
{COORD pos;  //pos为结构体pos.X = x;  //控制列pos.Y = y;  //控制行SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);//读取标准输出句柄来控制光标为pos
}void Face()
{system("color 0C");printf("*******************************************************\n");printf("*                Welcome to Snake Game!               *\n");printf("*                                                     *\n");printf("*             ->开始游戏请按 enter键                  *\n");printf("*             ->退出游戏请按 esc键                    *\n");printf("*             ->暂停游戏请按 space键                  *\n");printf("*             ->通过上下左右键来控制蛇的移动          *\n");printf("*             ->通过F1键减速        F2键加速          *\n");printf("*******************************************************\n");
}
void Map()   //初始化地图
{int i = 0;for(i = 0; i<COL_MAP; i+=2)   //打印上下边框(每个■占用两列){Pos(i, 0);printf("■");Pos(i, ROW_MAP-1);printf("■");}for(i = 0; i<ROW_MAP; i++)   //打印左右边框{Pos(0, i);printf("■");Pos(COL_MAP-2, i);printf("■");}
}
void PrintSnake()  //打印蛇
{pSnake cur = head;while(cur){Pos(cur->y, cur->x);printf("%c", snake);cur = cur->next;}
}
void InitSnake()    //初始化蛇身
{int initNum = 3;int i = 0;pSnake cur;head = (pSnake)malloc(sizeof(Snake));head->x = 5;head->y = 10;head->next = NULL;cur = head;for(i = 1; i < initNum; i++){pSnake newNode = (pSnake)malloc(sizeof(Snake));newNode->x = 5+i;newNode->y = 10;newNode->next = NULL;cur->next = newNode;cur = cur->next;}PrintSnake();
}void CreateFood()  //在地图上随机产生一个食物
{pSnake cur = head;Food = (pSnake)malloc(sizeof(Snake));//产生x~y的随机数 k=rand()%(Y-X+1)+X;srand((unsigned)time(NULL));Food->x = rand()%(ROW_MAP-2 - 1 + 1)+1;Food->y = rand()%(COL_MAP-3 - 2 + 1)+2;Food->next = NULL;while(cur)   //检查食物是否与蛇身重合{if(cur->x == Food->x && cur->y == Food->y){free(Food);Food = NULL;CreateFood();return;}cur = cur->next;}Pos(Food->y, Food->x);printf("%c", food);
}void StartGame()  //游戏开始的所有设置
{Face();system("pause");if(GetAsyncKeyState(VK_RETURN)){system("cls");Pos(COL_MAP+5, 1);printf("当前分数/通关分数:");Pos(COL_MAP+20, 1);printf("%d/%d", Score, SUCCESS_SCORE);Pos(COL_MAP+5, 2);printf("当前分每步得分:");Pos(COL_MAP+20, 2);printf("%d", everyScore);Pos(COL_MAP+5, 3);printf("\n");Pos(COL_MAP+5, 4);printf("速度越快 得分越高哦!!\n");Map();InitSnake();CreateFood();}else if(GetAsyncKeyState(VK_ESCAPE)){exit(0);}
}int IsCrossWall()             //判断是否碰到墙
{if(head->x <= 0 || head->x >= ROW_MAP-1||head->y <= 1 || head->y >= COL_MAP-2){State = ERROR_WALL;return 0;}return 1;
}int IsEatSelf(pSnake newHead)  //判断是否咬到自己
{pSnake cur = head;assert(newHead);while(cur){if(cur->x == newHead->x && cur->y == newHead->y){State = ERROR_SELF;return 0;}cur = cur->next;}return 1;
}int IsFood(pSnake pos)  //判断该位置是不是食物
{assert(pos);if(pos->x == Food->x && pos->y == Food->y){return 1;}return 0;
}void SnakeMove()   //蛇移动一次
{pSnake newHead = NULL;newHead = (pSnake)malloc(sizeof(Snake));if(Direction == R){newHead->x = head->x;newHead->y = head->y+1;newHead->next = head;}else if(Direction == L){newHead->x = head->x;newHead->y = head->y-1;newHead->next = head;}else if(Direction == U){newHead->x = head->x-1;newHead->y = head->y;newHead->next = head;}else if(Direction == D){newHead->x = head->x+1;newHead->y = head->y;newHead->next = head;}if(IsFood(newHead)){head = newHead;PrintSnake();CreateFood();Score += everyScore;Pos(COL_MAP+20, 1);printf("%d/%d", Score, SUCCESS_SCORE);if(Score >= SUCCESS_SCORE){State = SUCCESS;}}else {if(IsCrossWall() && IsEatSelf(newHead)){pSnake cur = NULL;head = newHead;cur = head;//删除蛇尾并打印while(cur->next->next != NULL){Pos(cur->y, cur->x);printf("%c", snake);cur = cur->next;}Pos(cur->y, cur->x);printf("%c", snake);Pos(cur->next->y, cur->next->x);printf(" ");  //打印空格来覆盖频幕上的蛇尾free(cur->next);cur->next = NULL;}else{free(newHead);newHead = NULL;}}
}void Pause()
{while(1){Sleep(sleeptime);if(GetAsyncKeyState(VK_SPACE)){break;}}
}void ControlSnake() //用键盘控制游戏
{if(GetAsyncKeyState(VK_UP) && Direction!=D){Direction = U;}else if(GetAsyncKeyState(VK_DOWN) && Direction!=U){Direction = D;}else if(GetAsyncKeyState(VK_LEFT) && Direction!=R){Direction = L;}else if(GetAsyncKeyState(VK_RIGHT) && Direction!=L){Direction = R;}else if(GetAsyncKeyState(VK_F1)){if(sleeptime != 500){sleeptime = 500;everyScore = 1;Pos(COL_MAP+20, 2);printf("%d", everyScore);}}else if(GetAsyncKeyState(VK_F2)){if(sleeptime != 300){sleeptime = 300;everyScore = 2;Pos(COL_MAP+20, 2);printf("%d", everyScore);}}else if(GetAsyncKeyState(VK_SPACE)){Pause();}else if(GetAsyncKeyState(VK_ESCAPE)){exit(0);}
}void StateGame() //判断游戏失败或成功
{if(State == ERROR_SELF){system("cls");printf("很遗憾,蛇咬到自己,游戏失败!\n");}else if(State == ERROR_WALL){system("cls");printf("很遗憾,蛇碰到墙壁,游戏失败!\n");}else if(State == SUCCESS){system("cls");printf("恭喜您,已通关!!!\n");}}
void RunGame()
{Direction = R; //蛇初始行走方向为右State = NORMAL;//游戏初始为正常状态while(1){ControlSnake();SnakeMove();if(State != NORMAL){StateGame();break;}Sleep(sleeptime);}
}void EndGame()  //释放链表并恢复默认值
{pSnake cur = head;while(cur){pSnake del = cur;cur = cur->next;free(del);del = NULL;}head = NULL;if(Food != NULL){free(Food);Food = NULL;}Score = 0;everyScore = 1;sleeptime = 500;
}

3.Test.c

#include "Snake.h"int main()
{while(1){StartGame();RunGame();EndGame();}system("pause");return 0;
}

五、运行界面展示

1.欢迎界面

2.游戏界面

小小的c语言项目,用来练手,仅供参考哦!!

谢谢阅读,如有问题,欢迎提出,拜拜喽!!

C语言小项目--贪吃蛇游戏相关推荐

  1. C 语言实现经典贪吃蛇游戏

    原文链接:C语言 贪吃蛇游戏 文章目录 一.说明 二.效果 2.1 欢迎界面 2.2 游戏规则 2.3 得分排行 2.4 退出游戏 2.5 游戏界面 2.6 游戏结束 三.源码 3.1 cmd.h 3 ...

  2. 贪吃蛇c语言课程设计报告下载,c语言课程设计-贪吃蛇游戏

    c语言课程设计-贪吃蛇游戏 C 语言课程设计 1 山东交通学院 C 语言课程设计 贪吃蛇游戏 院(系)别 交通与物流工程学院 班 级 物联 131 学 号 130516122 姓 名 王赛 指导教师 ...

  3. 好玩的c语言编程游戏,C语言写个贪吃蛇游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面 ...

  4. [C语言] 自制的贪吃蛇游戏

    使用C语言自带的游戏图新库开发贪吃蛇 我看网上好多制作贪吃蛇的帖子都是对刚学习C语言的同学们很不友好,制作的都是控制台,黑窗口的贪吃蛇游戏,能做出来但是感觉很无趣,不太像正常的游戏,接下来我将制作完全 ...

  5. bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  6. C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  7. x x x x c程序语言,C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  8. 用C语言复现用贪吃蛇游戏(二)完结

    书接上回,咱们复现了贪吃蛇的页面,接下来是对游戏的操作进行复现: //移动小蛇 //第一步扫描数组canvas的所有元素,找到正数元素都加1 //找到最大元素(蛇尾巴),把其变为0 //找到等于2的元 ...

  9. Java项目:贪吃蛇游戏(java+swing)

    源码获取:博客首页 "资源" 里下载! 功能简介: 贪吃蛇游戏 大嘴鱼洁面类.完成大嘴鱼的界面的绘制: /*** 大嘴鱼洁面类.完成大嘴鱼的界面的绘制.*/ public clas ...

最新文章

  1. 从人肉到智能,阿里运维体系经历了哪些变迁?
  2. python培训中心-吴中区Python培训中心
  3. java.nio.Buffer flip()方法
  4. 新兴机器学习算法:迁移学习
  5. MPAndroidChart——饼图
  6. 实战渗透-Shiro反序列化漏洞实例
  7. 一张图片学Python
  8. 一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么?Java
  9. 多个线程访问统一对象的不同方法_分析| 你未必真的了解线程安全,别骗自己,来看下怎么实现线程安全...
  10. Hibernate原生sqlquery报错:java.math.BigDecimal cannot be cast to java.lang.Int
  11. oracle 测试坚挺,access数据库用户依然坚挺,但是面临新的对手挑战
  12. html用锚点回到顶部代码,纯css实现回到顶部-jq回到顶部方法
  13. 使用Luyten工具反编译jar包
  14. 上海道宁联合德国think-cell,为您提供更便捷高效的PowerPoint插件
  15. 如何在搜狗高速浏览器设置代理IP
  16. 随机地址生成器_Python文章自动生成器火了!没错,它的名字叫“狗屁不通”!...
  17. 依图科技CTO颜水成被曝离职,或转战东南亚独角兽Shopee
  18. ae字体预设下载_AE超强文字预设包(附插件和教程)Videohive 2D Text Preset Pack for Animation Composer Plug-in...
  19. 4399U3D笔试题
  20. Field ‘browser‘ doesn‘t contain a valid alias configuration

热门文章

  1. 解决word插入的图片不能正常显示
  2. Photoshop CC 2017 在Mac上安装报错解决办法
  3. Linux管道符|命令使用
  4. R语言outer函数应用于两个数组实战
  5. 2021-02-02
  6. 电脑上怎么发出电子版准考证
  7. Mac OS X下Adware/malware 的简单手动排除方法
  8. LRUCache的C++实现
  9. dump内存文件的方法
  10. 解决误删Android系统的tmp目录