目录

snake.h头文件

snake.c源文件

main.c源文件


运行效果

snake.h头文件

#pragma once
#pragma warning (disable:4996) //消除警告
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>#define ROW 22
#define COL 42#define EMPTY 0
#define WALL 1
#define FOOD 2
#define HEAD 3 //标记蛇头
#define BODY 4 //标记蛇身#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27struct Body
{int x, y;
};struct Snake
{int len;int x, y;struct Body* body;
};extern int map[ROW][COL]; //地图各个位置的属性
extern int max, grade;  //声明最高分和当前得分
extern struct Snake snake;  //声明蛇void SystemSetting();  //系统设置void CursorJump(int x, int y);        //光标跳转void InitMap(int map[ROW][COL]);          //初始化界面void Color(int x);       //颜色设置void ReadGrade();     //从文件读取最高分void WriteGrade();        //更新最高分到文件void JudgeGrade(int x, int y);        //判断得分与结束void InitSnake();      //初始化蛇void RandFood();      //随机生成食物void DrawSnake(int flag);       //打印与覆盖蛇void MoveSnake(int x, int y);   //移动蛇void Run(int x, int y);            //执行按键void Game();          //游戏流程

snake.c源文件

#include "snake.h"void SystemSetting()
{system("title 贪吃蛇");system("mode con cols=84 lines=23");CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量curInfo.dwSize = 1;              //光标填充单元格的占比,不赋值的话光标隐藏无效curInfo.bVisible = FALSE;       //光标设置为不可见HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄SetConsoleCursorInfo(handle, &curInfo);                //设置光标信息ReadGrade();    //从文件读取最高分
}void CursorJump(int x, int y)
{COORD pos;     //定义光标位置的结构体变量pos.X = x;       //光标的横坐标对应地图的列 COLpos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);        //设置光标位置
}void InitMap(int map[ROW][COL])
{Color(6);  //颜色设置为土黄色int i, j;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (j == 0 || j == COL - 1){map[i][j] = WALL;CursorJump(2 * j, i);printf("■");}else if (i == 0 || i == ROW - 1){map[i][j] = WALL;printf("■");}else{map[i][j] = EMPTY;}}}Color(7); //颜色设置为白色CursorJump(0, ROW);printf("当前得分: %d", grade);CursorJump(2 * COL - 18, ROW);printf("历史最高分: %d", max);
}void Color(int x)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);//SetConsoleTextAttribute是一个API(应用程序编程接口)
}void ReadGrade()
{FILE* pf = fopen("贪吃蛇历史最高分.txt", "r");if (pf == NULL){FILE* pf = fopen("贪吃蛇历史最高分.txt", "w");fwrite(&max, sizeof(int), 1, pf);  //若文件读取失败,就将0写入文件}fseek(pf, 0, SEEK_SET); //使文件指针pf指向文件开头fread(&max, sizeof(int), 1, pf);    //读取文件中最高分到max之中fclose(pf);pf = NULL;
}void WriteGrade()
{FILE* pf = fopen("贪吃蛇历史最高分.txt", "w");if (pf == NULL){printf("更新历史最高分文件打开失败\n");exit(0);}fwrite(&grade, sizeof(1), 1, pf);fclose(pf);pf = NULL;
}void JudgeGrade(int x, int y)
{if (map[snake.y + y][snake.x + x] == FOOD) //若蛇头下一步位置是食物则得分{++snake.len;grade += 10;Color(7);CursorJump(0, ROW);printf("当前得分: %d", grade);   //重新打印当前得分RandFood();       //重新生成食物}else if (map[snake.y + y][snake.x + x] == WALL || map[snake.y + y][snake.x + x] == BODY)   //若蛇头下一步是墙或蛇身则游戏结束{Sleep(1000); //暂停一秒,留给玩家反应时间system("cls");Color(7);CursorJump(2 * COL / 3, ROW / 2 - 3);if (grade > max){printf("恭喜你创下了新纪录 %d 分", grade);WriteGrade();}else{printf("请继续加油,本次得分为 %d", grade);}CursorJump(2 * COL / 3, ROW / 2);printf("GAME OVER");while (1) //询问玩家是否再来一局{char input;CursorJump(2 * COL / 3, ROW / 2 + 3);printf("再次挑战?(y/n)");scanf("%c", &input);switch (input){case 'y':case 'Y':system("cls");main();case 'n':case 'N':CursorJump(2 * (COL / 3), ROW / 2 + 5);exit(0);default:CursorJump(2 * (COL / 3), ROW / 2 + 5);printf("选择错误,请重新输入");}}}
}void InitSnake()
{snake.len = 2;        //蛇身初始长度为2snake.x = COL / 2;snake.y = ROW / 2;    //蛇头坐标snake.body = (struct Body*)malloc(sizeof(struct Body) * ROW * COL);if (snake.body == NULL){perror("malloc");exit(0);}memset(snake.body, 0, sizeof(struct Body) * ROW * COL);snake.body[0].x = snake.x - 1;snake.body[0].y = snake.y;snake.body[1].x = snake.x - 2;snake.body[1].y = snake.y;     //初始化蛇身map[snake.y][snake.x] = HEAD;map[snake.body[0].y][snake.body[0].x] = BODY;map[snake.body[1].y][snake.body[1].x] = BODY;
}void RandFood()
{int row, col;do{row = rand() % ROW;col = rand() % COL;} while (map[row][col] != EMPTY);map[row][col] = FOOD;Color(12);     //颜色设置为红色CursorJump(2 * col, row);printf("●");
}void DrawSnake(int flag)
{if (flag == 1)   //打印蛇{Color(10);    //颜色设置为绿色CursorJump(2 * snake.x, snake.y);printf("■");    //打印蛇头int i = 0;for (i = 0; i < snake.len; i++){CursorJump(2 * snake.body[i].x, snake.body[i].y);printf("□");  //打印蛇身}}else    //覆盖蛇{if (snake.body[snake.len - 1].x != 0)    //防止len++后将(0,0)位置的墙覆盖{CursorJump(2 * snake.body[snake.len - 1].x, snake.body[snake.len - 1].y);printf("  ");     //将蛇尾覆盖为空格}}
}void MoveSnake(int x, int y)
{DrawSnake(0);  //先覆盖先前显示的蛇map[snake.body[snake.len - 1].y][snake.body[snake.len - 1].x] = EMPTY;  //蛇移动后蛇尾标记为空map[snake.y][snake.x] = BODY;  //蛇移动后蛇头变为蛇身int i = snake.len - 1;for (; i > 0; i--){snake.body[i].x = snake.body[i - 1].x;snake.body[i].y = snake.body[i - 1].y;}snake.body[0].x = snake.x;snake.body[0].y = snake.y;      //蛇身每个位置都更新snake.x += x;snake.y += y;   //蛇头位置更新DrawSnake(1);   //打印蛇
}void Run(int x, int y)
{int t = 0;while (1){if (t == 0)t = 3000;   //t越小,蛇移动越快while (--t){if (kbhit() != 0)    //键盘被敲击,退出循环break;}if (t == 0) //键盘未被敲击,判断得分与移动蛇{JudgeGrade(x, y);MoveSnake(x, y);}else{break;  //键盘被敲击,返回Game函数}}
}void Game()
{int dir = RIGHT;  //游戏开始时默认方向为向右移动int tmp = 0;   //记录蛇的移动方向goto first;while (1){dir = getch();switch (dir){case 'w':case 'W':case UP:case 's':case 'S':case DOWN:   //如果按键为 上 或 下if (tmp != LEFT && tmp != RIGHT) //并且蛇移动的方向不是 左 或 右{dir = tmp;  //则蛇移动的方向不变}break;case 'a':case 'A':case LEFT:case 'd':case 'D':case RIGHT:if (tmp != UP && tmp != DOWN){dir = tmp;}break;case SPACE:case ESC:case 'r':case 'R':break;   //这四个键无需调整default:dir = tmp;       //其它键方向不变break;}first:switch (dir){case 'w':case 'W':case UP:Run(0, -1);    //向上移动,横坐标偏移0,纵坐标偏移-1tmp = UP;break;case 's':case 'S':case DOWN:Run(0, 1);tmp = DOWN;break;case 'a':case 'A':case LEFT:Run(-1, 0);tmp = LEFT;break;case 'd':case 'D':case RIGHT:Run(1, 0);tmp = RIGHT;break;case SPACE:system("pause>nul");  //暂停后按任意键继续case ESC:system("cls");Color(7); //颜色设置为白色CursorJump(COL - 8, ROW / 2);printf("  游戏结束  ");CursorJump(COL - 8, ROW / 2 + 2);exit(0);case 'r':case 'R':system("cls");main();        //重新开始}}
}

main.c源文件

#include "snake.h"int map[ROW][COL];   //游戏地图各个位置的属性
int max = 0, grade = 0;
struct Snake snake;int main()
{srand((unsigned int)time(NULL));SystemSetting();   //初始化设置InitMap(map);        //初始化地图InitSnake();     //初始化蛇RandFood();           //随机生成食物DrawSnake(1);       //打印蛇Game();                //开始游戏return 0;
}

C语言实现贪吃蛇游戏(windows环境)相关推荐

  1. linux贪吃蛇c程序,Linux环境下C语言实现贪吃蛇游戏

    Linux环境下C语言实现贪吃蛇游戏 [liul@test snake]$ more snake.c #include #include #include #include #include #def ...

  2. 贪吃蛇c语言经典程序下载,C语言实现贪吃蛇游戏(单人版)

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 相比于第一个:贪吃蛇游戏,功能更加丰富 #include"snake.h" //蛇的移动 void m ...

  3. c语言贪吃蛇游戏的论文,基于c语言的贪吃蛇游戏论文.doc

    基于c语言的贪吃蛇游戏论文 第 PAGE \* Arabic \* MERGEFORMAT 15 页第 PAGE \* Arabic \* MERGEFORMAT 15 页 学校代码 学号 分 类 号 ...

  4. 用C++语言实现贪吃蛇游戏

    最近更了个新的关于用C/C++写贪吃蛇的blog,感觉那个帮助会更大些,这篇中用DirectX技术不适合刚开始试着写游戏的同学,传送:https://blog.csdn.net/weixin_3781 ...

  5. 【C语言】贪吃蛇游戏的实现(一)

    (注意:本代码是在VC++6.0环境下编译的,在其他环境如codeblocks下运行可能会产生意想不到的问题,请尽量使用VC.至于为什么要使用VC编译,哦,我亲爱的朋友,这只有上帝才知道) 最近由于小 ...

  6. C语言之贪吃蛇游戏源码

    贪吃蛇游戏是我编程以来做的第一个游戏,很兴奋,我记得当时我一直最求代码数量的最小化,即以最少的代码实现功能,有的时候,对换行.括号之类的都下手,呵呵,现在想想都想笑,那些年让我纠结的代码门,你们现在还 ...

  7. 纯C语言实现贪吃蛇游戏(VC6.0)

    转自C语言网 今天笔者为大家展示C语言写的贪吃蛇游戏,让大家玩一玩自己写的游戏~ 是纯C语言哦~VC6.0开发 无问题 首先,开始界面: 游戏界面如下: 代码如下: 笔者VC6.0下编写,测试无问题, ...

  8. 结对-贪吃蛇游戏-开发环境搭建过程

    结对编程成员:赵建辉,马壮 搭建环境: 会 html,css,以及java开发知识. 会应用sublime,dw等编辑软件 编写程序阶段: 1.利用html搭建前端页面,构建游戏的页面框架 2.利用j ...

  9. 使用Python语言制作贪吃蛇游戏,并制作成为exe可执行文件

    本项目为贪吃蛇游戏,上下左右控制蛇的行走路径,并将游戏打包为exe文件,可供其他没有python环境和代码的电脑 Play 游戏! 目录 一.项目成果 二.项目架构 三.项目代码 四.环境搭建 五.矢 ...

  10. c语言贪吃蛇按键,C语言实现贪吃蛇游戏(命令行)

    这是一个纯C语言写的贪吃蛇游戏,供大家参考,具体内容如下 #include #include #include #include #include #define SNAKE_LENGTH 100// ...

最新文章

  1. Rust 数据类型介绍
  2. Windows10系统的使用小技巧四 —— 剪贴板历史记录
  3. 使用eBPFbcc提取内核网络流量信息(二)
  4. [云炬创业管理笔记]第三章测试2
  5. 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)
  6. TIM SWEENEY:引擎及图形学的未来
  7. java+创建metaq生产者_微服务架构【技术点4】windows下rocketMQ配置及java端生产者消费者配置-Go语言中文社区...
  8. 经典面试题之赋值操作
  9. 小米网技术架构变迁实践
  10. VMware虚拟机中windows7系统的安装
  11. gcc 源码下载地址
  12. 网页设计_导航条_下拉菜单
  13. 安防大数据时代的IP摄像机发展
  14. 了解iOS各个版本新特性总结
  15. 介绍一下大型企业数据防泄密产品选型的思路
  16. python -m http.server 搭建一个简易web下载服务器(可用于快速发送大文件)
  17. 左外连接Left-Outer-Join的基于SQL,MapReduce,sparkRDD,sparkDataFrame以及spark SQL的实现案例及对比
  18. 【已更新】万能门店小程序独立版V5.1二开完整版 无限DIY+不限制小程序生成数量+数10款插件
  19. 视界更宽阔,青橙 VOGA V 投影手机评测
  20. Python中记录程序运行时间

热门文章

  1. 怎么下载python3.5.2_Python3.5.2
  2. win 7自带测试软件,Win 8战Win 7!专业测试软件成绩大PK
  3. 欧盟六国:启动欧盟数字身份钱包泛欧支付试点
  4. 金仓数据库KingbaseES ksql工具用户指南及参考--3. Ksql入门
  5. SDN-网络可编程-1(详述)
  6. 马尔可夫过程与泊松过程
  7. android 几款比较好用的测试工具
  8. TerminateProcess终止进程失败
  9. OpenSIP3.2系列之二(用opensips-cli创建数据库)
  10. GRE作文备考技巧怎样避免低效率重复劳动?