字符游戏-贪吃蛇入门设计

贪吃蛇游戏相信是大家童年回忆,有各种各样的版本的,像数风格的、卡通形象的,等等,但是这些都只是表面装饰,真正的核心是不变的,那么我们就看下用C语言制作一个黑框版的简易贪吃蛇,是怎么样的吧。
首先制作一个简易地图以及各种会用到的变量:

char map[13][13] = {"************",
                    "*XXXXH     *",   //初始地图
                    "*          *",   //直接输出
                    "*          *",
                    "*          *",
                    "*          *",
                    "*          *",
                    "*          *",
                    "*          *",
                    "*          *",
                    "*          *",
                    "************"};
int snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};  //定义初始坐标 
int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};
int snakeLength = 5; // 蛇的初始长度
int foodX = 0, foodY = 0; //食物的初始坐标 

会移动的小虫子

首先最基本的一项就是移动。

void snakeMove (int x, int y) {
    // 如果下一步蛇会撞到东西,则不让蛇行动,保证蛇只在框内游走 
    if(map[snakeY[snakeLength - 1] + y][snakeX[snakeLength - 1] + x] != BLANK_CELL)return;
    cleanmap();
    int i;

    // 蛇身的坐标都替换成前一截身体的坐标(表示前进) 
    for (i = 0; i < snakeLength - 1; ++i) {
        snakeX[i] = snakeX[i + 1];
        snakeY[i] = snakeY[i + 1];
    }

    // 蛇头移向指令的方向一步 (身体会跟着移动) 
    snakeX[snakeLength - 1] += x;
    snakeY[snakeLength - 1] += y;
    renewSnake();
}

就是这么简单一个函数,将蛇头向指令方向走一步,身体其他部分跟着向前挪就好了(上面代码采取坐标的形式来移动)。这里蛇是永远不可能出去框中,或者撞到自己身体的,这只是个游动的小虫子(效果如下图)
这里写图片描述

会吃东西的蛇

那么贪吃蛇的精髓,肯定是“吃”啦,那如何让它吃东西呢?

//放置食物 
void putfood () {
    int i;
    int food_on_snake ;
    do {
        foodX = rand() % 10 + 1; //随机食物放置的坐标,并让它不会放到墙上(1~11) 
        foodY = rand() % 10 + 1;

        food_on_snake = 0;
        for (i = 0; i < snakeLength; ++ i) {

            //判断食物有没有放到蛇身上,如果有则重新随机 
            if (snakeX[i] == foodX && snakeY[i] == foodY) {
                food_on_snake = 1;
                break;
            } 
        }
    } while (food_on_snake == 1);
    map[foodY][foodX] = SNAKE_FOOD ;//把食物打到表上 
}

先随机放食物,并不能放到边界或蛇身上,那么吃,就是看蛇头有没有碰到食物啦

void judge_eatfood () {

    //如果蛇头坐标与食物坐标相同,则吃到食物,需重新放置食物,以及变得更长 
    if (snakeX[snakeLength - 1] == foodX && snakeY[snakeLength - 1] == foodY &&
        snakeLength < SNAKE_MAX_LENGTH) {
        putfood();
        snakeLength ++;
        snakegrow();
    }

    //如果蛇达到最大长度,则吃到食物也不变长 
    else if(snakeX[snakeLength - 1] == foodX && snakeY[snakeLength - 1] == foodY) {
        printf("**************************\n");
        printf("*****   You Win!!!!   ****\n");
        printf("**************************\n");
        sleep (10);
    }
    //没吃到直接返回 
    else return;
}

吃到了就让蛇变长(即增加一节坐标):

void snakegrow () {
    int i;
    for (i = snakeLength - 1; i > 0; --i) {
        snakeX[i] = snakeX[i - 1];
        snakeY[i] = snakeY[i - 1];
    }
}

那么以上程序就可以做一个,一步一步走的贪吃蛇了。
但是一步一步仿佛很简单,这时候就要弄个检测键盘输入的函数了。
kbhit()函数就是这样,在windows里直接调用头文件< conio.h >就可以使用了。
只要在主函数里加一条if(kbhit)ch = getch();就能实现按一次键盘,就一直按一个方向走了。

至于智能蛇的算法,就像课件的伪代码一样,先搞个预判的函数,判断下一步走了,离食物的距离远近,向最近的方向走,但是这样就没考虑到与身体的距离,越到后面越可能被自己困住,所以先要学习一下其他算法,再进行分享。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值