基于C语言的双人贪吃蛇游戏程序设计

实现目标

制作一个两个两个人一起同时玩的双人贪吃蛇游戏,有比分并记录历史成绩
(1) 打开游戏时能够自动播放背景音乐
(2) 开始菜单,显示历史用户名及其对应的成绩
(3) 开始菜单可以输入两人的用户名
(4) P1 可以通过w,s,a,d来控制蛇1的移动
(5) P2 可以通过小键盘的“上,下,左,右”来控制蛇2的移动
(6) 食物在每次被吃后都会随机出现在地图
(7) 贪吃蛇吃到食物后长度会增加1
(8) 撞墙和撞到自己就会结束游戏,下一界面能够输出死因
(9) 随着分数增加,蛇移动会越来越快
(10) 每一场的两人的分数及用户名都会被记录

系统三大界面功能示意图

函数功能设计

函数名 函数功能
welcome 打印开始界面
Finish 打印结束界面,清空贪吃蛇结构占用的内存
creatgraph 打印围墙
gotoxy 移动光标
color 设置颜色
gotoprintboundary 跳转打印边界
gotoprintsnake 打印贪吃蛇结构
gotodelete 跳转删除
creatsnake 初始化蛇
creatfood 产生食物
ClickControl 获取键盘信号
Judge 判断蛇是否死亡
MovingBody 控制蛇的移动
Eating 蛇吃到食物后的操作
ChangeBody1 蛇1的坐标变换
ChangeBody2 蛇2的坐标变换
record 文件操作记录成绩
printrecord 读取文件,输出成绩

各函数调用关系如图所示:

该程序中的数据结构与算法

  • 数据结构

  1. 结构体:
struct Food
{int x;int y;
} food;
//这是产生食物的结构体
  1. 结构体数组:
typedef struct
{char name[10];int score;
} Rank;Rank rank[2];
//这是保存用户名及其对应分数的结构体数组
  1. 链表:
typedef struct Snakes
{int x;int y;struct Snakes* next;
} snake;snake* head;
snake* head2;
//本程序中两条蛇的产生及控制均使用链表存储
  • 算法

  1. 文件输入操作:
void record()
{FILE *fp;fp = fopen("data.txt", "a");for (int i = 0; i < 2; i++){fprintf(fp, "%85s|%10d\n", (rank + i)->name, (rank + i)->score);}fclose(fp);
}
//这是创建文件,并且保存用户的用户名及相应的分数
  1. 文件读取操作:
int  printrecord()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);gotoxy(75, 15);printf("%10s|%10s\n", "玩家", "分数");FILE *pfile = fopen("data.txt", "rb");if (pfile == NULL) {return 0;}//读取文件长度,读完后把文件指针复位到开头fseek(pfile, 0, SEEK_END);int file_length = ftell(pfile);rewind(pfile);//申请一段内存空间用来放文件中的文本内容,并置零int text_length = file_length * sizeof(char) + 1;char* text_buffer = (char*)malloc(text_length);memset(text_buffer, 0, text_length);//把文件文本内容读到申请的内存空间中int read_length = fread(text_buffer, 1, file_length, pfile);if (read_length != file_length) {return 0;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);//打印文件文本内容,释放申请的内存空间,关闭文件流printf(text_buffer);free(text_buffer);fclose(pfile);return 0;
}
//这是读取文件
用到了多种数据结构
  1. 添加音效
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")
//分别使用这两个头文件和外部库文件
PlaySound("music.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
//使用PlaySound函数播放音乐
  1. 使用了链表的尾插法操作

函数流程图举例

  • 蛇移动函数的流程图:
  • 判断蛇是否死亡的流程图:

部分结构的测试案例

  1. 左侧提示输入两个人的用户名,按空格确定。右侧在第一次未创建成绩文件是为空,不会输出乱码

  2. 两位玩家的“wasd”、“上下左右”都可以成功控制方向

  3. 在输出与蛇运动方向相反的按键时,蛇保持原来方向运动

  4. 食物被吃后自动再生成,蛇边长,并且分数增加显示在下面

  5. 蛇撞墙后死亡,显示死因

  6. 蛇撞到自己后死亡,显示死因。

  7. 在非第一次玩此游戏时,打开游戏会在右下角输出历史用户及成绩:

宏定义、头文件、全局变量及调用函数

#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
/*地图参数*/
#define height 26
#define wide 116void welcome();                     // 开始界面
void  Finish(int x);                // 结束界面
void creatgraph();                  // 围墙打印
//***
void gotoxy(int x, int y);          // 光标跳转
void color(short x);
void gotoprintboundary(int x, int y);   // 跳转打印边界
void gotoprintsnake(int x, int y);      //打印蛇
void gotodelete(int x, int y);          // 跳转删除蛇
void creatsnake();
//***
void creatfood();                 // 食物产生
int  ClickControl();             // 获取蛇1键盘信号
int  Judge();                   // 游戏结束判断void MovingBody();               // 蛇的移动
void Eating();                  // 蛇吃到东西后的操作(伸长)
void ChangeBody(int x, int y); // 蛇的坐标变换
void ChangeBody2(int x, int y);
void record();                 //文件操作记录成绩
int printrecord();            //读取文件,打印成绩//蛇结构体
typedef struct Snakes
{int x;int y;struct Snakes* next;
} snake;snake* head;
snake* head2;
// 申明并定义食物
struct Food
{int x;int y;
} food;
//用户数据
typedef struct
{char name[10];int score;
} Rank;Rank rank[2];char click = 1; // 记录敲下的键盘按键
char foreclick = 1;//键盘按键的历史记录值
char foreclick2 = 1;
char click2 = 1;
int speed;      // 延迟的毫秒数

源代码下载

下载链接如下:

https://download.csdn.net/download/qq_25591221/14504516

基于C语言的双人贪吃蛇游戏程序设计相关推荐

  1. 【C语言项目】贪吃蛇游戏(上)

    00. 目录 文章目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) ...

  2. 【去后厂村开游戏厅吧】基于pp-tinypose的体感贪吃蛇游戏

    [去后厂村开游戏厅吧]基于pp-tinypose的体感贪吃蛇游戏 你是否也被腰痛所困扰!你是否也是久坐一族!你是否也是网瘾少年! 来玩体感贪吃蛇吧!只需要电脑上有摄像头就可以玩体感游戏啦~远离屏幕,扭 ...

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

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

  4. c语言设计贪吃蛇实验报告,贪吃蛇游戏程序设计实验报告

    <贪吃蛇游戏程序设计实验报告>由会员分享,可在线阅读,更多相关<贪吃蛇游戏程序设计实验报告(11页珍藏版)>请在人人文库网上搜索. 1.Windows编程大作业贪吃蛇设计与实现 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 别再SOTA了,那叫“微调”!Science发文炮轰论文灌水
  2. 用python画漂亮图片-使用 Python/matplotlib 画出漂亮的论文插图
  3. Walking on the path of Redis --- Redis configuration
  4. IT 人士如何避免中年危机?
  5. 读书笔记 23种设计模式总结
  6. 未处理sqlexception中value_plsql异常处理
  7. Python模块学习 - 用tinify模块压缩和优化图片
  8. SharePoint2007安装图文详解四:安装.NET Framework 3.0和SharePoint 2007
  9. 面试官这Redis夺命连环12问,谁顶得住?
  10. cpp 编译dll_GCC编译基础
  11. [dlang](二)用vibe.d+thrift做网络编程
  12. oracle清除过期备份,rman delete obsolete删除过期备份集问题
  13. Surfaceview调用Camera实现拍照
  14. python填写问卷星_Python填写问卷星
  15. vue实现下拉二级联动_select下拉菜单实现二级联动效果
  16. Rebranding (字典序替换 思维)
  17. html轮播鼠标悬停效果,jQuery图片轮播加悬停效果
  18. java mysql 订单表设计
  19. 《指定一个用户只能在特定的时间里不能登陆》『罗斌原创』
  20. PV270R1K1T1NMMC派克柱塞泵_应用

热门文章

  1. LeetCode Golang 答案
  2. Java毕设项目航空订票系统火车票订购系统(2021最新)
  3. 初学STM32之使用STM32CubeMX编写跑马灯程序
  4. 中值滤波器及均值滤波器
  5. c语言运算程序示例,C语言算术运算示例程序
  6. KL散度、JS散度 的理解以及一些问题
  7. linux vim删除单个字符串,LINUX vim替换字符串指令
  8. Word2016中出现多级标题自动编号不连续问题
  9. 思科模拟器实验7:OSPF配置命令
  10. 羊毛之家,青龙脚本,几乎全部可用