贪吃蛇 字符蛇 大冒险

1、玩法

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

2、游戏表示

给定一个10*10的字符矩阵表示蛇的生存空间,其中有一条长度5的蛇(HXXXX), “H”表示蛇头,“X”表示蛇身体。空间中可能有食物(“$”表示)和障碍物(“*”表示)

你可以使用“ADWS”按键分别控制蛇的前进方向“左右上下”, 当蛇头碰到自己的身体或走出边界,游戏结束,否则蛇按你指定方向前进一步。

代码如下(蛇是按一次键盘走一次的而且还有其他bug哈哈哈哈哈哈)

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>

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

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 ; //初始化蛇的长度 

/*控制蛇的移动以及吃到食物蛇变长*/ 
void snakeMove(char ch) {
    //char ch = _getch();
    int lastx = snakeX[0]; 
    int lasty = snakeY[0];//保存蛇尾左边 
    int i, j;
    for (i = 0; i < snakeLength - 1; i ++) {
        snakeX[i] = snakeX[i + 1];
        snakeY[i] = snakeY[i + 1];
        map[snakeY[i]][snakeX[i]] = 'X';
    }   //蛇身坐标往前挪 
    switch(ch) {
        case 'a':
            snakeX[snakeLength-1] -= 1; //左移,改变蛇头坐标 
            break;
        case 'd':
            snakeX[snakeLength-1] += 1; //右移, 改变蛇头坐标 
            break;
        case 's':
            snakeY[snakeLength-1] += 1;  //上移,改变蛇头坐标 
            break;
        case 'w':
            snakeY[snakeLength-1] -= 1; //下移,改变蛇头坐标 
            break;
    }
//  printf("%d ", snakeY[snakeLength - 1]);
    if (map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] == '$') { //如果吃到钱 
        snakeLength += 1; //长度加一 
        for (i = snakeLength - 1; i > 0; i --) {
            snakeX[i] = snakeX[i - 1];
            snakeY[i] = snakeY[i - 1];
            map[snakeY[i]][snakeX[i]] = 'X';
        } // 蛇的坐标往前挪 
        snakeX[0] = lastx;
        snakeY[0] = lasty;//蛇尾坐标等于移动前蛇尾坐标 
        map[lasty][lastx] = 'X';
    }
    map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'H'; //蛇头 
}

/*放置食物*/ 
void put_money() { //如果界面内没有 $,在随机的位置上放置 $ 
    int i, j, ah = 1;
    for (i = 1; i < 11; i ++) {
        for (j = 1; j < 11; j ++) {
            if (map[i][j] == '$') {
                ah = 0;
                break;
            }
        }
    }
    while (ah) { 
        int a = rand() % 9 + 1; 
        int b = rand() % 9 + 1;
        if (map[a][b] == ' ') {
            map[a][b] = '$';
            break;
        }   
    }
}

void set() { //把界面内不是 $ 的全部 变为空格 
    int i, j;
    for (i = 1; i < 11; i ++) {
        for (j = 1; j < 11; j ++)
        if (map[i][j] != '$')
            map[i][j] = ' ';
    }
}

void show() { //打印界面 
    int i, j;
    for (i = 0; i < 12; i ++) {
        for (j = 0; j < 12; j ++) {
            putchar(map[i][j]);
        }
        putchar('\n');
    }   
}

int gameover() { 
    int i, j;
    for (j = 0; j < 12; j ++) { //撞墙 死 
        if (map[0][j] == 'H' || map[j][0] == 'H' || map[11][j] == 'H' || map[j][11] == 'H') {
            printf("Game Over");
            return 0;
        }
    }
    for (i = 0; i < snakeLength - 1; i ++) { //吃自己 死 
        if (snakeX[snakeLength - 1] == snakeX[i] && snakeY[snakeLength - 1] == snakeY[i])
            return 0;
    }   
    return 1;
}

int main() {
    char ch;
    show();
    while (gameover()) {
        ch = _getch();  
        system("cls");  //清屏 
        set();
        snakeMove(ch);
        put_money();
        show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值