小游戏:贪吃蛇

🎁个人主页:我们的五年

🔍系列专栏:贪吃蛇

🌷追光的人,终会万丈光芒

 

 

目录

🏝1.头文件:

 🏝2.实现文件:

🏝3.测试文件 :


 

 前言:这个在学习C语言的对知识点进行巩固的一个小游戏,后面也会持续带来一下小游戏。喜欢的帖子们可以点点关注。

相关系列文章:贪吃蛇
 

🏝1.头文件:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<locale.h>
#include<windows.h>
#include<time.h>#define POS_X 24
#define POS_Y 5
#define WALL L'□'
#define BODY L'●'
#define FOOD L'●'//类型声明//蛇的方向
enum DIECTION {UP = 1,DOWN,LEFT,RIGHT
};//贪吃蛇的状态
// 正常,撞墙,撞到自己,正常退出。enum GAME_STATUS
{OK,            //正常KILL_BY_WALL,  //撞墙KILL_BY_SLEF,  //撞到自己END_NORMAL     //正常退出
};
//蛇身节点
typedef struct SnakeNode {short x;short y;struct SncakeNode* next;
}SnakeNode,* pSnakeNode;//贪吃蛇
typedef struct Snake {pSnakeNode _pSnake;  //指向蛇头的指针pSnakeNode _pFood;   //指向食物的指针enum DIRECTION _dir; //蛇的方向enum GAME_STATUS _status; //游戏状态int _food_weight;    //食物分数int _score;          //总成绩int _sleep_time;
}Snake,* pSnake;//函数声明//函数初始化
void GameStart(pSnake snake);//欢迎界面打印
void WelcomeToGame();//初始化蛇
void InitSnake(pSnake ps);//创建食物
void CreateFood(pSnake ps);//游戏运行
void GameRun(pSnake ps);int NextIsFood(pSnakeNode pn, pSnake ps);void SnakeMove(pSnake ps);void EatFood(pSnakeNode pn, pSnake ps);void NotFood(pSnakeNode pn, pSnake ps);void KillByWall(pSnake ps);void KillBySelf(pSnake ps);void Game_End(pSnake ps);

 🏝2.实现文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include"snake.h"void SetPos(short x, short y)
{HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x,y };SetConsoleCursorPosition(houtput, pos);
}
void WelcomeToGame()
{SetPos(35, 13);wprintf(L"欢迎来到贪吃蛇小游戏\n");SetPos(37, 20);system("pause");system("cls");SetPos(35, 8);wprintf(L"按↑向上移动");SetPos(35, 9);wprintf(L"按↓向下移动");SetPos(35, 10);wprintf(L"按←向左移动");SetPos(35, 11);wprintf(L"按→向右移动");SetPos(35, 12);wprintf(L"按F3减速");SetPos(35, 13);wprintf(L"按F4加速");SetPos(35, 14); wprintf(L"加速可以得到更高的分数");SetPos(35, 18);system("pause");system("cls");}CreateMap()
{//上for (int i = 0; i < 29; i++)wprintf(L"%lc", L'□');//下SetPos(0, 26);for (int i = 0; i < 29; i++)wprintf(L"%lc", L'□');//左for (int i = 1; i <=25; i++){SetPos(0, i);wprintf(L"%lc\n", L'□');}//右for (int i = 1; i <= 25; i++){SetPos(56, i);wprintf(L"%lc\n", L'□');}
}void InitSnake(pSnake ps)
{int i = 0;pSnakeNode cur = NULL;for (; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL){perror("InitSnake::malloc()");return;}cur->next = NULL;cur->x = POS_X + 2 * i;cur->y = POS_Y;//头插法if (ps->_pSnake==NULL){ps->_pSnake = cur;}else{cur->next = ps->_pSnake;ps->_pSnake = cur;}}cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->_dir = RIGHT;	//默认向右ps->_score = 0;ps->_status = OK;ps->_food_weight = 10;ps->_sleep_time = 200;//设置贪吃蛇属性
}
void CreateFood(pSnake ps)
{int x = 0;int y = 0;//生成食物的坐标是2的倍数//且在方框里面
again:do{x = rand() % 53 + 2;y = rand() % 25 + 1;} while (x % 2 != 0);//x,y的坐标不能和蛇身冲突pSnakeNode cur = ps->_pSnake;while (cur){if (x==cur->x && y==cur->y){goto again;}cur = cur->next;}//创建食物的节点pSnakeNode pFood=(pSnakeNode)malloc(sizeof(SnakeNode));if (pFood == NULL){perror("CreateFood()::malloc");return;}pFood->x = x;pFood->y = y;pFood->next = NULL;SetPos(x, y);wprintf(L"%lc",FOOD );ps->_pFood = pFood;
}void GameStart(pSnake ps)
{//0.设置窗口大小,光标影藏system("mode con cols=100 lines=30");//设置窗口大小为100列,30行system("title 贪吃蛇");  //设置窗口名字为:贪吃蛇//影藏光标HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cursor;GetConsoleCursorInfo(houtput, &cursor);cursor.bVisible = false;SetConsoleCursorInfo(houtput, &cursor);//1.打印欢迎界面//功能介绍WelcomeToGame();//2.绘制地图CreateMap();//3.创建蛇InitSnake(ps);//4.创建食物CreateFood(ps);SetPos(64, 13);wprintf(L"0.用↑←→↓控制蛇的移动");SetPos(64, 14);wprintf(L"1.不能穿墙,不能咬到自己");SetPos(64, 15);wprintf(L"2.F3减速,F4加速");SetPos(64, 16);wprintf(L"3.exc退出游戏");SetPos(64, 17);wprintf(L"4.按空格暂停游戏");}
#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)&1)?1:0)
void Pause()
{while (1){Sleep(100);if(KEY_PRESS(VK_SPACE))break;}
}void EatFood(pSnakeNode pn, pSnake ps)
{//头插ps->_pFood->next = ps->_pSnake;ps->_pSnake = ps->_pFood;//释放下一个节点;free(pn);pn = NULL;pSnakeNode cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc\n", BODY);cur = cur->next;}ps->_score += ps->_food_weight;CreateFood(ps);
}void NotFood(pSnakeNode pn, pSnake ps)
{pn->next = ps->_pSnake;ps->_pSnake = pn;pSnakeNode cur = ps->_pSnake;pSnakeNode prev = ps->_pSnake;while (cur->next){		SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);prev = cur;cur = cur->next;}prev->next = NULL;SetPos(cur->x, cur->y);wprintf(L"  ");free(cur);cur = NULL;
}int NextIsFood(pSnakeNode pn,pSnake ps)
{return (pn->x == ps->_pFood->x && pn->y == ps->_pFood->y);
}void KillByWall(pSnake ps)
{if (ps->_pSnake->x == 0 || ps->_pSnake->x == 56|| ps->_pSnake->y == 0 || ps->_pSnake->y == 26){ps->_status = KILL_BY_WALL;}
}void KillBySelf(pSnake ps)
{pSnakeNode cur = ps->_pSnake->next;while (cur){if (ps->_pSnake->x == cur->x && ps->_pSnake->y == cur->y){ps->_status = KILL_BY_SLEF;break;}cur=cur->next;}
}
void SnakeMove(pSnake ps)
{pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));if (pNextNode == NULL){perror("SnakeMove()::malloc");return;}switch (ps->_dir){case UP:pNextNode->x = ps->_pSnake->x;pNextNode->y = ps->_pSnake->y - 1;break;case DOWN:pNextNode->x = ps->_pSnake->x;pNextNode->y = ps->_pSnake->y + 1;break;case LEFT:pNextNode->x = ps->_pSnake->x-2;pNextNode->y = ps->_pSnake->y;break;case RIGHT:pNextNode->x = ps->_pSnake->x+2;pNextNode->y = ps->_pSnake->y;break;}if (NextIsFood(pNextNode,ps)){EatFood(pNextNode,ps);}else{NotFood(pNextNode,ps);}//撞到自己KillByWall(ps);//撞墙KillBySelf(ps);
}void Game_End(pSnake ps)
{SetPos(24, 12);switch (ps->_status){case KILL_BY_SLEF:printf("你撞到了自己,游戏结束\n");break;case KILL_BY_WALL:printf("你撞到墙了,游戏结束\n");break;case END_NORMAL:printf("你主动结束了游戏\n");break;}pSnakeNode cur = ps->_pSnake;while (cur){pSnakeNode del = cur;cur = cur->next;free(del);}
}
void GameRun(pSnake ps)
{//打印帮助信息do{//打印总分数和食物的分值SetPos(64, 8);wprintf(L"总分数:%3d\n",ps->_score);SetPos(64, 9);wprintf(L"当前食物分数:%2d",ps->_food_weight);if (KEY_PRESS(VK_UP)&&ps->_dir!=DOWN){ps->_dir = UP;}else if (KEY_PRESS(VK_DOWN) && ps->_dir != UP){ps->_dir = DOWN;}else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT){ps->_dir = LEFT;}else if (KEY_PRESS(VK_RIGHT) && ps->_dir != LEFT){ps->_dir = RIGHT;}else if (KEY_PRESS(VK_SPACE)){//暂停Pause();}else if (KEY_PRESS(VK_F3)){//减速if (ps->_sleep_time < 320){ps->_sleep_time += 30;ps->_food_weight -= 2;}}else if (KEY_PRESS(VK_F4)){//加速if (ps->_sleep_time > 80){ps->_sleep_time -= 30;ps->_food_weight += 2;}}else if (KEY_PRESS(VK_ESCAPE)){//退出ps->_status = END_NORMAL;}//贪吃蛇走一步SnakeMove(ps);Sleep(ps->_sleep_time);} while (ps->_status == OK);
}

🏝3.测试文件 :

#define _CRT_SECURE_NO_WARNINGS 1
#include"snake.h"//完成的是对游戏的测试
void test()
{int ch;do{//创建贪吃蛇Snake snake = { 0 };//初始化游戏GameStart(&snake);//运行游戏GameRun(&snake);//结束游戏—善后工作Game_End(&snake);SetPos(20, 13);printf("游戏结束,再来一局吗?Y/N");SetPos(20, 14);ch=getchar();while(getchar()!='\n');} while (ch == 'y' || ch == 'Y');SetPos(0, 26);
}
int main()
{//设置适配本地环境setlocale(LC_ALL, "");srand((unsigned int)time(NULL));test();return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640589.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云X魔搭社区Create@AI创客松第四届冠军:MumuLab

4月13日终于迎来了线下Demo Day&#xff0c;此前阿里云 X 魔搭社区 X Datawhale CreateAI创客松已经紧锣密鼓地准备了一个多月时间&#xff0c;全球150团队报名、创作出66作品、评选出25支团队进入决赛&#xff0c;作品范围覆盖从办公效率到法律调解再到游戏互动以及构建童话世…

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…

通过创新的MoE架构插件缓解大型语言模型的世界知识遗忘问题

在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;的微调是提升模型在特定任务上性能的关键步骤。然而&#xff0c;一个挑战在于&#xff0c;当引入大量微调数据时&#xff0c;模型可能会遗忘其在预训练阶段学到的世界知识&#xff0c;这被称为“世界知识遗忘…

Rust 使用结构体组织相关联的数据

目录 结构体的定义和实例化 使用字段初始化简写语法使用结构体更新语法从其他实例创建实例使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体结构体示例程序 通过派生 trait 增加实用功能方法语法 定义方法带有更多参数的方法关联函数多个 impl 块本文有…

7.Prism框架之对话框服务

文章目录 一. 目标二. 技能介绍① 什么是Dialog?② Prism中Dialog的实现方式③ Dialog使用案例一 (修改器)④ Dialog使用案例2(异常显示窗口) 一. 目标 1. 什么是Dialog?2. 传统的Dialog如何实现?3. Prism中Dialog实现方式4. 使用Dialog实现一个异常信息弹出框 二. 技能介…

微机原理实验三、将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL

微机原理实验三、将AX寄存器中的16位数分成4组&#xff0c;每组4位&#xff0c;让后把这四组数分别放在AL,BL,CL,DL 功能&#xff1a; 将AX寄存器中的16位数分成4组&#xff0c;每组4位&#xff0c;让后把这四组数分别放在AL,BL,CL,DL ; 调试结果&#xff1a; input&#xff1a…

FoundationPose复现及Realsense应用

相关信息 标题 FoundationPose: Unified 6D Pose Estimation and Tracking of Novel Objects作者 Nvidia (Bowen Wen Wei Yang Jan Kautz Stan Birchfield)主页 https://nvlabs.github.io/FoundationPose/链接 https://arxiv.org/abs/2312.08344代码 https://github.com/NVlab…

C++设计模式:中介者模式(十五)

1、定义与动机 定义&#xff1a;用一个中介对象来封装&#xff08;封装变化&#xff09;一系列的对象交互。中介者使各个对象不需要显示的相互引用&#xff08;编译时依赖 -> 运行时依赖&#xff09;&#xff0c;从而使其耦合松散&#xff08;管理变化&#xff09;&#xff…

【数据库系列】NebulaGraph部署与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

联想拯救者电脑数据恢复方法,适用于未备份者

自从大学时期起&#xff0c;我的联想拯救者电脑就成为了我生活和学习的得力助手&#xff0c;里面存有许多至关重要的资料。但是昨日当我启动它时&#xff0c;电脑却意外卡顿。恢复正常后&#xff0c;发现部分数据竟然神秘地消失了&#xff0c;有什么方法能帮我恢复吗&#xff1…

HDFS分布式文件存储系统

1-1 HDFS的存储机制 按块&#xff08;block&#xff09;存储 hdfs在对文件数据进行存储时&#xff0c;默认是按照128M(包含)大小进行文件数据拆分&#xff0c;将不同拆分的块数据存储在不同datanode服务器上 拆分后的块数据会被分别存储在不同的服务器上 副本机制 为了保证hdfs…

Linux嵌入式驱动开发-platform 设备驱动

文章目录 platform 平台驱动platform 总线platform 驱动platform_driver_register 注册 platform 驱动platform_driver_unregister 卸载 platform 驱动 platform 设备platform_device_register 注册设备 platform_device_unregister 注销设备 Linux 系统要考虑到驱动的可重用性…