字符游戏—贪吃蛇

经过一段时间的C语言的学习和实践,我们也可以开始学习写一下简单的小游戏,例如贪吃蛇。
下面来介绍一下我的贪吃蛇;
贪吃蛇分为几个部分:

  1. 蛇的移动
  2. 食物的生成
  3. 蛇的伸长
  4. 蛇的控制
  5. 死亡的判断
  6. 地图的输出

首先是蛇的移动:
分别从4个方向的移动。

void moveup() {

    for (i = 0; i < snakeLength - 1; i ++) {
        snakeY[i] = snakeY[i + 1]; 
        snakeX[i] = snakeX[i + 1];
    }
    snakeY[snakeLength - 1] --;
    return;
}

void movedown() {

    for (i = 0; i < snakeLength - 1; i ++) {
        snakeY[i] = snakeY[i + 1]; 
        snakeX[i] = snakeX[i + 1];
    }
    snakeY[snakeLength - 1] ++;
    return;
}

void moveleft() {

    for (i = 0; i < snakeLength - 1; i ++) {
        snakeY[i] = snakeY[i + 1]; 
        snakeX[i] = snakeX[i + 1];
    }
    snakeX[snakeLength - 1] --;
    return;
}

void moveright() {

    for (i = 0; i < snakeLength - 1; i ++) {
        snakeY[i] = snakeY[i + 1]; 
        snakeX[i] = snakeX[i + 1];
    }
    snakeX[snakeLength - 1] ++;
    return;
}

然后是食物的随机生成。使用到了伪随机数这一函数。

void put_money() {
    moneyx = rand() % 10 + 1;
    moneyy = rand() % 10 + 1;

    for (i = 0; i < snakeLength; i ++) {
        if (moneyx == snakeX[i] && moneyy == snakeY[i])  put_money();
    }
    return;
}

蛇的伸长应该是关键,我们应该想一下,蛇怎么才可以伸长,我也是参考了别人的代码才知道如何让蛇伸长的。

void if_snake_eat() {
    if(snakeX[snakeLength - 1] == moneyx && snakeY[snakeLength - 1] == moneyy){
        snake_eat();
        put_money();
    }
    return;
}

void snake_eat() {

    score ++;
    snakeLength ++;
    for (i = snakeLength - 1; i > 1; i --) {
        snakeY[i] = snakeY[i - 1];
        snakeX[i] = snakeX[i - 1];
    }
    return;
}

蛇的控制就比较简单了,但是为了不用按ENTER 就可以读取,使用了getch 函数,

void snakeMove(){
    Sleep(50);
     while(kbhit()) {
        move = getch();
     } 
    switch (move) {
        case 'w':
        case 'W': moveup(); return;
        case 'a':
        case 'A': moveleft();return;
        case 's':
        case 'S': movedown(); return;
        case 'd': 
        case 'D': moveright(); return;
    }
}

然后是地图的构建和输出

void buildmap() {

    for(i = 0; i < 12; i ++) {
        map[i][0] = '*';
    }
    for(i = 0; i < 12; i ++) {
        map[i][11] = '*';
    }
    for(i = 1; i < 11; i ++) {
        map[0][i] = '*';
        map[11][i] = '*';
    }
    for (i = 1; i < 11; i ++) {
        for (j = 1; j < 11; j ++) {
            map[i][j] = ' ';
        }
    }
    for (i = 0; i < snakeLength - 1; i ++) { 
        map[snakeX[i]][snakeY[i]] = 'X';
    }
    map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = 'H';
    map[moneyx][moneyy] = '$';
 }

 void printmap() {

    for (i = 0; i < 12; i ++) {
        for (j = 0; j < 12; j ++) {
            printf("%c",map[j][i]);
         }
         printf("\n");
    }
    return;
 }

最后是死亡的判断

 int gameover() {
    if (score == 95) {
        system("cls");
        printf("YOU WIN\n");
        buildmap();
        printmap();
        return 0;
     }
    if (snakeX[snakeLength - 1] == 11 || snakeX[snakeLength - 1] == 0 || snakeY[snakeLength - 1] == 11 || snakeY[snakeLength - 1] == 0 ) {
        system("cls");
        printf("GAME OVER\n");
        printf("Your score is %d", score);
        return 0;
    }

    for (i = 0; i < snakeLength - 1; i ++) {
        if(snakeX[snakeLength - 1] == snakeX[i] && snakeY[snakeLength - 1] == snakeY[i]) {
            system("cls");
            printf("GAME OVER\n");
            printf("Your score is %d", score);
            return 0;
        }
    }
    return 1;
 }

最后我还为了让蛇能变得最长,写了一个很耍赖的算法,让蛇走Z字形的路径,最后走满了整个地图。
具体代码如下:

void move_auto(void) {
    if(move == 'd') {
        if (snakeX[snakeLength - 1] == 10) move = 's'; return;
    }
    if(move == 'a') {
        if (snakeX[snakeLength - 1] == 2) {
            if (snakeY[snakeLength - 1] != 10) move = 's';
            return;
        }
        if (snakeX[snakeLength - 1] == 1) move = 'w';
    }
    if (move == 's') {
        if (snakeX[snakeLength - 1] == 2) move = 'd';
        if (snakeX[snakeLength - 1] == 10) move = 'a';
        return;
    }
    if (move == 'w') {
        if (snakeY[snakeLength - 1] == 1) move = 'd';
        return;
    }
} 

这是最终结果
这里写图片描述

大家也可以自己试着写一下算法,让蛇更快走完。
本人能力有限,只能用最笨的方法咯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值