C语言贪吃蛇项目

今天给分享一下使用C语言写个贪吃蛇小游戏,主要包含以下10部分内容:

1、windows光标定位与隐藏

2、欢迎界面

3、打印围墙

4、产生食物

5、初始化蛇身

6、响应按键

7、蛇身运动

8、碰撞检测

9、结束界面

10、程序运行

  1. windows光标定位与隐藏

COORD 是window API中定义的一种结构体,表示一个字符在控制台屏幕上的坐标。定义为:

typedef struct_COORD{

SHORT X;  横坐标

SHORT Y;  纵坐标

}COORD;

定位函数gotoxy,gotoDelete

void gotoprint(int x, int y)

{

gotoxy(x, y);

printf("■");

}

// 删除蛇尾

void gotoDelete(int x, int y)

{

gotoxy(x, y);

printf("  ");

}

2. 欢迎界面

使用gotoxy函数将光标定义到页面相应的位置输出欢迎信息,页面左上角为(0,0)坐标。

将用户输入的姓名信息保存下来以便后面使用。

用户输入姓名后清屏,进入游戏界面。

void welcome()

{

gotoxy(10, 5);

printf("/**********************************************/");

gotoxy(14, 8);

printf("WELCOME TO THE GAME OF RETRO SNAKE");

gotoxy(14, 12);

printf("wasd控制蛇身上下左右运动,反向移动等同于吃到自己导致游戏结束,除了wasd任意键暂停");

gotoxy(10, 20);

printf("/**********************************************/");

gotoxy(14, 16);

printf("请输入姓名:");

scanf("%s",username);

system("cls");

}

​​​​​​​3.打印围墙

贪吃蛇围墙只需要定位到相应位置输出"■"即可,本次游戏的围墙为57*27

坐标图如下图所示:

void creatgraph()

{

int i;

// 横向围墙 58 / 2 == 29列

for (i = 0; i < 58; i += 2)

{

gotoprint(i, 0);

gotoprint(i, 26);

}

// 竖向围墙  1-25中间有25行 + 头尾两行  27行

for (i = 1; i < 26; i++)

{

gotoprint(0, i);

gotoprint(56, i);

}

// 游戏信息

gotoxy(60,5);

printf("hello,%s",username);

gotoxy(60,15);

printf("您当前的得分为:");

gotoxy(76,15);

printf("%d",score);

}

打印完后显示一下游戏信息。

注意:

汉字宽度是字符宽度的两倍,高度相等。即一个汉字占两个字节,一个英文字母占一个字节。

因此,"■"输出一次占两个字节,纵向上占一个字节,底部自身携带一些空隙。

​​​​​​​4.产生食物

1、构造食物

struct Food

{

int x;

int y;

}food;

2、定位食物

保证食物必须在围墙内:

x坐标范围: [2,54] -- 并且只要偶数部分,不是偶数部分需要转化为接近的偶数

y坐标范围: [1,25]

保证食物和蛇身没有重合,如果重合需要再次生成新的位置。

3、输出食物

void creatfood()

{

// 随机产生一个食物的位置

int flag = 0;

while(!flag)

{

srand((unsigned int)time(NULL));

food.y = rand() % 25 + 1; // [1,25]

food.x = rand() % 53 + 2; // [2,54] -- 只要偶数部分

if(food.x % 2 != 0)

{

food.x = food.x+1; // 不是偶数部分转化为接近的偶数

}

// 不能与蛇身重复

snake *p = head;

while(p)

{

if(p->x == food.x && p->y == food.y)

{

// 重复 -- 重新生成坐标

break;

}

p = p->next;

}

flag = 1;

}

gotoxy(food.x, food.y);

printf("吃");

}

​​​​​​​5.初始化蛇身

蛇身构造

typedef struct Snakes

{

int x;

int y;

struct Snakes* next;

}snake;

snake* head;    // 声明蛇头指针

绘制初始化的蛇身

void initSnake()

{

head = (snake*)malloc(sizeof(snake));

snake* p = (snake*)malloc(sizeof(snake));

snake* q = (snake*)malloc(sizeof(snake));

head->x = 16;

head->y = 15;

p->x = 16;

p->y = 16;

q->x = 16;

q->y = 17;

head->next = p;

p->next = q;

q->next = NULL;

//绘制初始蛇身

gotoprint(16,15);

gotoprint(16,16);

gotoprint(16,17);

}

​​​​​​​6.响应按键

getch()为输入字符函数,但是是阻塞的,如果用户不输入进步向下进行,不满足蛇身自动向前运动的需求,因此替换为_kbhit()进行非阻塞的输入监听,监听到键盘输入后,使用_getch从缓冲区中将输入的字符读出来放入全局变量ch中。

另外,当程序执行时,循环一次需要进行一次碰撞检测,没有碰撞时,还需要进行蛇身的移动。

int clickControl()

{

while(1)

{

// 检测是否碰撞边界

if(collisionDetect() == 1) return 0;

// _kbhit监听键盘有输入-非阻塞

if(_kbhit())

{

ch = _getch();

}

// 移动身体

movingBody();

}

return 1;

}

​​​​​​​7.蛇身运动

蛇身运动即:消除蛇尾节点,根据按键方向确定好新节点坐标,将新节点添加到蛇头位置即可。

移动后可以加一些延迟,使用Sleep(xx); xx以ms为单位。

void movingBody()

{

// 坐标修改

int x = head->x;

int y = head->y;

switch(ch)

{

case UP:

y-=1;

break;

case DOWN:

y+=1;

break;

case LEFT:

x-=2;

break;

case RIGHT:

x+=2;

break;

default:

ch = 0;

break;

}

if(ch)

{

// 消除尾节点

snake *p = head;

while(p->next->next != NULL)

{

p = p->next;

}

snake *q = p->next;

gotoDelete(q->x,q->y);

free(q);

p->next = NULL;

// 新坐标结点置为头结点

snake* newNode = (snake*)malloc(sizeof(snake));

newNode->x = x;

newNode->y = y;

newNode->next = head;

head = newNode;

// 绘制蛇头

gotoprint(x,y);

// 延迟

Sleep(500);

}

}

注意:如果用户输入的是除了 wasd以外的按键则暂停游戏。

​​​​​​​8.碰撞检测

碰撞检测主要有三种:

  1. 蛇身和边界
  2. 蛇头和蛇身
  3. 蛇头碰到食物

重新生成一个食物

在蛇身后面添加一个尾巴,可以不给x,y,因为下次移动的时候会直接将它释放掉。

加分

在分值位置更新分数

int collisionDetect()

{

// 检测蛇头和边界

if(head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)

{

Finish();

return 1;

}

// 蛇头和蛇身

snake *p = head->next;

while(p != NULL)

{

if(head->x == p->x && head->y == p->y)

{

// 碰撞-结束

Finish();

return 1;

}

p = p->next;

}

// 碰到食物

if(head->x == food.x && head->y == food.y)

{

creatfood();

// 添加一个尾巴

snake* newNode = (snake*)malloc(sizeof(snake));

newNode->next = NULL;

snake *p = head;

while(p->next != NULL)

{

p = p->next;

}

p->next = newNode;

score += 10;

gotoxy(76,15);

printf("%d",score);

}

return 0;

}

​​​​​​​9.结束界面

清屏

显示用户名和得分

void Finish()

{

system("cls");

gotoxy(10, 10);

printf("/**********************************************/");

gotoxy(10, 20);

printf("/**********************************************/");

gotoxy(15, 14);

printf("GAME   OVER      o(* ̄▽ ̄*)o");

gotoxy(18, 16);

printf("%s,    你的得分 %d ",username, score);

gotoxy(15, 18);

printf("还不错哦,     继续努力O(∩_∩)O");

gotoxy(0, 27);

// 释放空间

snake* p = head, *q;

while (p != NULL) {

q = p->next;

free(p);

p = q;

}

system("pause");

}

​​​​​​​10.运行程序

int main()

{

welcome();

creatgraph();

creatfood();

initSnake();

clickControl();

return 0;

}

C语言实现贪吃蛇[内附详细步骤]相关推荐

  1. Github 之 本地上传代码到 Github ,并且添加 .gitignore 文件 屏蔽一些文件上传(内附详细步骤)

    Github 之 本地上传代码到 github ,并且添加 .gitignore 文件 屏蔽一些文件上传(内附详细步骤) 目录 Github 之 本地上传代码到 github ,并且添加 .gitig ...

  2. Python 框架 之 Django 绑定 MySql ,MVT 实现简单一个简单的浏览器(内附详细步骤)

    Python 框架 之 Django 绑定 MySql ,MVT 实现简单一个简单的浏览器(内附详细步骤) 目录

  3. 风靡全球,TikTok会是下一个跨境电商巨头吗?怎么申请Tik Tok-MCN呢?(内附详细步骤)

    近期, TikTok持续发力跨境电商,虽然目前还不能说全球最大的跨境电商平台,但凭借着独特的商业模式.在用户中的良好口碑以及众多品牌的支持,它能在短视频领域持续占据一席之地. TikTok是字节跳动旗 ...

  4. C语言实现贪吃蛇小游戏1.0

    C语言实现贪吃蛇小游戏1.0 贪吃蛇游戏要有三个东西:边框.蛇.食物 还有两个灵魂的东西:光标的移动与按键监控 一.光标的移动 在我看来在控制台上移动光标画图是实现这个小游戏的灵魂了,在这之前我一直以 ...

  5. 【笔记】用vs2017 c语言写 贪吃蛇 小游戏

    目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...

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

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

  7. c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码

    c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的 C语言贪吃蛇代码部分 #include #include #include#include #defin ...

  8. python贪吃蛇源码_Python:游戏:贪吃蛇(附源码)

    Python:游戏:贪吃蛇(附源码) 发布时间:2018-09-05 09:59, 浏览次数:1295 , 标签: Python 贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么 ...

  9. c语言-链表-贪吃蛇

    1. c语言-链表-贪吃蛇 坐标的结构体-COORD COORD c;c.X = x;c.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_ ...

  10. 零基础学习C语言如何入门(内附工具书推荐+视频教程)

    C语言同C++.Python等都是通用性的编程语言,它们不针对某一个特定的方向,能做的事情很多.C语言主要用于底层开发,Windows.Linux.Unix 等操作系统的内核90%以上都使用C语言开发 ...

最新文章

  1. Centos 7 安装LAMP环境
  2. .Net 编码以及与这些编码关联的代码页
  3. Creating a custom ComboBox item renderer in Flex
  4. 关于静态局部全局变量
  5. 2019 DDCTF 部分writeup
  6. mysql scrapy 重复数据_MySQL大数据量表中删除重复记录
  7. 力扣1009.十进制整数的反码
  8. 基于SpringBoot/SSM的旅游论坛
  9. EXcel 2016高级VBA编程下载
  10. MATLAB - 傅里叶分析及 FFT 频谱分析
  11. 网站安全工程师与渗透测试工程师有哪些区别
  12. Python中具有不确定个数参数的函数
  13. java string 几个字节_java中字符串占几个字节
  14. MySQL 高可用MMM
  15. 1200PLC学习资料整理
  16. android中实现图片圆形效果
  17. Android、iPhone和Java三个平台一致的加密方法
  18. Springcould学习总结
  19. 解决Windows10 系统中桌面窗口管理器运行时占用内存过大的问题
  20. 软件测试周刊(第75期):唯有平视,才能看见真实的自己。

热门文章

  1. JavaScriipt高级程序设计
  2. 俞敏洪:把眼前的做好,一切就都好了
  3. VMware Workstation 14 Pro 安装 Windows Server 2003(完)
  4. PhpStorm 配置 Git 教程
  5. R语言数据科学编程教程-从新手到大师
  6. 基于SpringBoot开发的后台管理、系统脚手架Github\Gitee收集
  7. 软件工程期末复习题库
  8. 免费甘特图模板直接套用,分分钟完成!
  9. linux常用关机命令,linux下常用关机命令
  10. 计算机软件著作权许可协议范本,软件著作权使用许可合同协议范本模板.doc