贪吃蛇 snake

c语言版贪吃蛇

全局设置

//设置
#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 print();//输出 

void put_food(void);//食物的放置 

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

int flag=0;//判断蛇死活 ,0代表live,1代表dead 

int food=0;//判断是否有食物,0代表无,1代表有 

//snake的存储
int snakeX[SNAKE_MAX_LENGTH]={1,1,1,1,1};
int snakeY[SNAKE_MAX_LENGTH]={1,2,3,4,5};

int snakeLength = 5;

//食物坐标
int foodX,foodY;
//步骤
char step;

实现:

1.关于snake的移动思路:

1.简单移动版本

此时只要简单的将蛇的头向移动的方向移动,蛇其它位置移动到原来蛇身的前一部分即可

void snakeMove(int dx,int dy)
{
    //dx , dy是得到移动的方向
    int i;
        //判断有没有自己碰到自己或者碰墙
        if(snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2])
            return;
        else if (map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == 'X'||map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == '*')
            flag=1;
        else
        {   //实现移动
            map[snakeX[0]][snakeY[0]]=' ';
            //先移动蛇身体部分
            for(i=0;i<snakeLength-1;i++)
            {
                snakeX[i] = snakeX[i + 1];
                snakeY[i] = snakeY[i + 1];
            } 
            snakeX[snakeLength - 1] += dx;
            snakeY[snakeLength - 1] += dy;
            //处理头部同时进行标记
            map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]='H';
            //标记移动后的蛇
            for (i = 0; i < snakeLength - 1; i++) 
                map[snakeX[i]][snakeY[i]] = 'X';
        }
}

2.食物版本(在简单移动的基础上考虑食物)

void snakeMove(int dx,int dy)
{
    int i;
    if(snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2])
        return;
    else if (map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == 'X'||map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == '*')
        flag=1;
    else
    {
        if(map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] != '$')
        {
            map[snakeX[0]][snakeY[0]]=' ';
            for(i=0;i<snakeLength-1;i++)
            {
                snakeX[i] = snakeX[i + 1];
                snakeY[i] = snakeY[i + 1];
            } 
            snakeX[snakeLength - 1] += dx;
            snakeY[snakeLength - 1] += dy;
            map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]='H';
            for (i = 0; i < snakeLength - 1; i++) 
                map[snakeX[i]][snakeY[i]] = 'X';
        }
        else
        {
            food=0;
            put_food();
            snakeLength++;
            map[snakeX[snakeLength-2]][snakeY[snakeLength-2]]='X';
            snakeX[snakeLength-1]=snakeX[snakeLength - 2]+dx;
            snakeY[snakeLength-1]=snakeY[snakeLength - 2]+dy;
            map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]='H';

        }
    }
}

2.放置食物:

/*
    if(地图内有无食物)
    {
        生成食物;
        if(食物在贪吃蛇上)
            重新生成; 
    }
*/ 
void put_food(void)
{
    if(food==0)
    {
        srand(time(NULL));
        foodX=rand()%10+1;
        foodY=rand()%10+1;
        if(map[foodX][foodY]==' ')
            map[foodX][foodY]='$';
        else put_food();
        food=1; 
    } 
} 

3.输出

void print(void)
{
    /*输出当前字符矩阵*/
    int i,j;
    for(i=0;i<=11;i++)
    {
        for(j=0;j<=11;j++)
            printf("%c",map[i][j]);
        printf("\n");
    }
}

主函数

int main()
{
    put_food();
    print();
    while(scanf(" %c",&step)!=EOF)
    {
        switch(toupper(step))
        {
            case 'A':
                snakeMove(0,-1);
                break;
            case 'D':
                snakeMove(0,1);
                break;  
            case 'W':
                snakeMove(-1,0);
                break;  
            case 'S':
                snakeMove(1,0);
                break;  
        }
        if(flag==1)
        {
            printf("GAME OVER!\n");
            break;
        }
        else
            print();
    }   
    return 0; 
}
总结:

贪吃蛇的实现主要难在其移动上,但是如果能理解其移动的时候变的部分其实只有头和尾巴,那么就十分简单了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值