C--贪吃蛇

目录

前言

简单的准备工作

蛇的节点

开始前 void GameStart(pSnake ps)

void WelcomeToGame()

void CreateMap()

  void InitSnake(pSnake ps)

 void CreateFood(pSnake ps)

游戏进行 void GameRun(pSnake ps)

  int NextIsFood(pSnakeNode psn, pSnake ps)

 void NoFood(pSnakeNode psn, pSnake ps)

void SnakeMove(pSnake ps)

游戏结束 void GameEnd(pSnake ps)

源码

test.c

snake.h

snake.cpp

总结


前言

贪吃蛇游戏是一个耳熟能详的小游戏,本次我们讲解他的简单的实现,需要掌握基本的API知识(http://t.csdnimg.cn/uHH6y),简单的C语言知识和基本的数据结构链表

简单的准备工作

效果展示

屏幕录制 2024-05-16 092902

蛇的节点

在游戏运⾏的过程中,蛇每次吃⼀个⻝物,蛇的⾝体就会变⻓⼀节,如果我们使⽤链表存储蛇的信 息,那么蛇的每⼀节其实就是链表的每个节点。每个节点只要记录好蛇⾝节点在地图上的坐标就⾏, 所以蛇节点结构如下:

 typedef struct SnakeNode
 {
 int x;
 int y;
 struct SnakeNode* next;
 }SnakeNode, * pSnakeNode;

但是这样不好维护这一条蛇,要管理整条贪吃蛇,我们再封装⼀个Snake的结构来维护整条贪吃蛇

typedef struct Snake
 {
 pSnakeNode _pSnake;维护整条蛇的指针 
pSnakeNode _pFood;维护⻝物的指针 
enum DIRECTION _Dir;头的⽅向默认是向右 
enum GAME_STATUS _Status;游戏状态 
int _Socre;当前获得分数 
int _Add;默认每个⻝物10分 
int _SleepTime;每⾛⼀步休眠时间
}Snake, * pSnake;

开始前 void GameStart(pSnake ps)

游戏开始,先打印蛇的身体和地图,以及一些帮助的提示语句,先完成一些准备工作

void GameStart(pSnake ps)
 {
 
设置控制台窗⼝的⼤⼩,30⾏,100列 
//mode 为DOS命令
 system("mode con cols=100 lines=30");
 //设置cmd窗⼝名称
 system("title 贪吃蛇"); 
//获取标准输出的句柄(⽤来标识不同设备的数值) 
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光标操作 
CONSOLE_CURSOR_INFO CursorInfo; //打印欢迎界⾯ 
WelcomeToGame(); //打印地图 
CreateMap(); //初始化蛇 
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息 
CursorInfo.bVisible = false; //隐藏控制台光标 
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态 
InitSnake(ps);
 //创造第⼀个⻝物 
CreateFood(ps);
 }
 

void WelcomeToGame()

在游戏正式开始之前,做⼀些功能提醒,来让玩家了解游戏方法与规则,其中SetPos是一个已经封装后的函数,可以把这个字体打在这个坐标

 void WelcomeToGame()
 {
 SetPos(40, 15);
 printf("欢迎来到贪吃蛇⼩游戏");
 SetPos(40, 25);//让按任意键继续的出现的位置好看点 
system("pause");
 system("cls");
 SetPos(25, 12);
 printf("⽤ ↑ . ↓ . ← . → 分别控制蛇的移动, F3为加速,F4为减速\n");
 SetPos(25, 13);
 printf("加速将能得到更⾼的分数。\n");
 SetPos(40, 25);//让按任意键继续的出现的位置好看点 
system("pause");
 system("cls");
 }

void CreateMap()

创建地图就是将强打印出来,因为是宽字符打印,所有使⽤wprintf函数,打印格式串前使⽤L 打印地图的关键是要算好坐标,才能在想要的位置打印墙体。

 void CreateMap()
 {
 int i = 0;
 //上(0,0)-(56, 0) 
SetPos(0, 0);
 for (i = 0; i < 58; i += 2)
 {
 wprintf(L"%c", WALL);
 } //下(0,26)-(56, 26)  
 SetPos(0, 26); for (i = 0; i < 58; i += 2)
 { wprintf(L"%c", WALL);
 } //左//x是0,y从1开始增⻓ 
for (i = 1; i < 26; i++)
 {
 SetPos(0, i);
 wprintf(L"%c", WALL);}  //是56y从1开始增⻓ 
for (i = 1; i < 26; i++)
 {
 SetPos(56, i);
 wprintf(L"%c", WALL);
 }
 } 

  void InitSnake(pSnake ps)

蛇最开始⻓度为5节,每节对应链表的⼀个节点,蛇⾝的每⼀个节点都有⾃⼰的坐标。 创建5个节点,然后将每个节点存放在链表中进⾏管理。创建完蛇⾝后,将蛇的每⼀节打印在屏幕上。 再设置当前游戏的状态,蛇移动的速度,默认的⽅向,初始成绩,蛇的状态,每个⻝物的分数。

void InitSnake(pSnake ps)
 {
    pSnakeNode cur = NULL;
    int i = 0;
    //创建蛇⾝节点,并初始化坐标 
    //头插法
    for (i = 0; i < 5; i++)
    {
        //创建蛇⾝的节点 
        cur = (pSnakeNode)malloc(sizeof(SnakeNode));
        if (cur == NULL)
        {
            perror("InitSnake()::malloc()");
            return;
        }
        //设置坐标 
        cur->next = NULL;
        cur->x = POS_X + i * 2;
        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"%c", BODY);
 cur = cur->next;
 }
 //
初始化贪吃蛇数据 
ps->_SleepTime = 200;
 ps->_Socre = 0;
 ps->_Status = OK;
 ps->_Dir = RIGHT;
 ps->_Add = 10;
 }

 void CreateFood(pSnake ps)

先随机⽣成⻝物的坐标 ◦

实现移动,吃食变长游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。[3] 二、“贪吃蛇”游戏的发展编辑 改变此款游戏的特别多。比如在蛋的方面,可能放上带道具的蛋,使蛇吃完后具有保护,穿墙等特种功能,而且难度逐渐变难,游戏制作的精细度和画面的质量也随着版本的提高而不断提高,且有单人及团队联机对战版本陆续推出。 参考资料游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。[3] 二、“贪吃蛇”游戏的发展编辑 改变此款游戏的特别多。比如在蛋的方面,可能放上带道具的蛋,使蛇吃完后具有保护,穿墙等特种功能,而且难度逐渐变难,游戏制作的精细度和画面的质量也随着版本的提高而不断提高,且有单人及团队联机对战版本陆续推出。 游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。[3] 二、“贪吃蛇”游戏的发展编辑 改变此款游戏的特别多。比如在蛋的方面,可能放上带道具的蛋,使蛇吃完后具有保护,穿墙等特种功能,而且难度逐渐变难,游戏制作的精细度和画面的质量也随着版本的提高而不断提高,且有单人及团队联机对战版本陆续推出。
评论 63
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值