贪吃蛇的玩法升级

贪吃蛇

贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。

贪吃蛇的初步制作以及不断完善

利用我们之前所学的“自顶向下,逐步求精”的编程思想,一步步地写出“贪吃蛇”这款游戏

会走的蛇

我们先要做出一个会走的、可操作的蛇的模型

框架

程序的头部
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

void snakeMove(int,int);//控制蛇的移动 
void output(void);//输出蛇的位置 
int gameover(void);//判断游戏结束条件 

char map[12][12]={"************",
                "*XXXXH     *",
                "*          *",
                "*          *",
                "*          *",
                "*          *",
                "*          *",
                "*          *",
                "*          *",
                "*          *",
                "*          *",
                "************"};

int snakeX[SNAKE_MAX_LENGTH]={1,2,3,4,5};
int snakeY[SNAKE_MAX_LENGTH]={1,1,1,1,1};
int snakeLength=5;
main函数

根据伪代码框架写出main函数的大概框架

输出字符矩阵
    WHILE not 游戏结束 DO
        ch=等待输入
        CASE ch DO
        ‘A’:左前进一步,break 
        ‘D’:右前进一步,break    
        ‘W’:上前进一步,break    
        ‘S’:下前进一步,break    
        END CASE
        输出字符矩阵
    END WHILE
    输出 Game Over!!! 
int main()
{
    char input;
    output();
    while(1)
    {
        input=getch();//使用getch()函数是因为输入无回显,且无需enter结束输入 
        switch(input)
        {
            case'A':snakeMove(-1,0);break;
            case'D':snakeMove(1,0);break;
            case'W':snakeMove(0,-1);break;
            case'S':snakeMove(0,1);break;
            default:break;
        }
        fflush(stdin);
        if(gameover()!=0)
        {
            output();
            continue;
        }
        return 0;
    }
}
snakeMove函数
void snakeMove(int dx,int dy)/*假设地图是一个坐标轴,蛇的移动表示在当前点(x,y)加上dx,dy
'W':dx=0,dy=-1
'A':dx=-1,dy=0
'S':dx=0,dy=1
'D':dx=1,dx=0*/ 
{
    int turn=0;
    int tempX=snakeX[snakeLength-1];
    int tempY=snakeY[snakeLength-1];
    int tempX1=0;
    int tempY1=0;
    snakeY[snakeLength-1]+=dy;
    snakeX[snakeLength-1]+=dx;
    for(turn=snakeLength-2;turn>=0;turn--)
    {
        tempX1=snakeX[turn];
        tempY1=snakeY[turn];
        snakeX[turn]=tempX;
        snakeY[turn]=tempY;
        tempX=tempX1;
        tempY=tempY1;
    }
}
output函数
void output(void)
{
    int turnx=0;
    int turny=0;
    for(turnx=1;turnx<11;turnx++)
    {
        for(turny=1;turny<11;turny++)
        {
            map[turnx][turny]=BLANK_CELL;
        }
    }
    for(turnx=0,turny=0;turnx<snakeLength;turnx++,turny++)
    {
        if(map[snakeY[turny]][snakeX[turnx]]!=SNAKE_FOOD)
        {
            map[snakeY[turny]][snakeX[turnx]]=SNAKE_BODY;
        }
    }
    map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]=SNAKE_HEAD;
    system("cls");
    for(turnx=0;turnx<12;turnx++)
    {
        for(turny=0;turny<12;turny++)
        {
            printf("%c",map[turnx][turny]);
        }
        printf("\n");
    }
}
gameover函数
int gameover(void)
{
    if(map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]==WALL_CELL)
    {
        printf("Game Over!!!");
        return 0;
    }
    return 1;
}
会吃的蛇

顾名思义,贪吃蛇要会吃
所以需要补充两个函数
补充

put_money函数
void put_money(void)
{
    int x , y = 0;
    srand((unsigned)time(NULL));
    while(map[x][y]!=BLANK_CELL)
    {
        x=rand()%10+1;
        y=rand()%10+1;
    }
    map[x][y]=SNAKE_FOOD; 
}
eat_food函数
void eat_food(void)
{
    int turn = 0;
    if(map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]==SNAKE_FOOD)
    {
        snakeLength++;
        if(snakeLength>20)
        {
            return;
        }
        for(turn=snakeLength-1;turn>0;turn--)
        {
            snakeX[turn]=snakeX[turn-1];
            snakeY[turn]=snakeY[turn-1];
        }
        snakeX[turn]=tempX;
        snakeY[turn]=tempY;
        put_money();
    }
}

此外,还需对gameover()函数进行一些修改,增加一些游戏的条件

gameover()函数
int gameover(void)
{
    int turn = 0;
    if(map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]==WALL_CELL)
    {
        printf("Game Over!!!");
        return 0;
    }
    else if(snakeLength>SNAKE_MAX_LENGTH)
    {
        printf("Game Over!!!");
        return 0;
    }
    for(turn=snakeLength-2;turn>=0;turn--)
    {
        if(snakeX[turn]==snakeX[snakeLength-1]&&snakeY[turn]==snakeY[snakeLength-1])
        {
            printf("Game Over!!!");
            return 0;
        }`

    }
    return 1;
}
有颜色的蛇(Ubuntu)

利用VT-100控制码编程
颜色
再改变output函数
output

有障碍的地图(Ubuntu)

定义一个BLOCKS常量

#define BLOCKS '#'

编写一个新的函数set_blocks()函数
set_blocks
另外需要做的修改(荧光笔画的地方)
Blocks
Blocks

加入 积分显示

定义全局变量Score
每次eat_food,Score=Score+100;

End

基本完成了一个贪吃蛇的制作

示例图片

示例
示例
示例
示例
更多玩法会在下一篇博客中写出!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值