字符版贪吃蛇游戏及算法

通过c语言制作一款贪吃蛇游戏。
一、实验目的
了解字符游戏的表示
体验自顶向下的设计方法实现问题求解
使用伪代码表示算法
使用函数抽象过程
二、游戏要求与表示
1、玩法
贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。百度百科
2、游戏表示
给定一个10*10的字符矩阵表示蛇的生存空间,其中有一条长度5的蛇(HXXXX), “H”表示蛇头,“X”表示蛇身体。空间中可能有食物(“$”表示)和障碍物(“*”表示)
你可以使用“ADWS”按键分别控制蛇的前进方向“左右上下”, 当蛇头碰到自己的身体或走出边界,游戏结束,否则蛇按你指定方向前进一步。
任务1:会动的蛇
程序遵从以下伪代码:
输出字符矩阵
WHILE not 游戏结束 DO
ch=等待输入
CASE ch DO
‘A’:左前进一步,break
‘D’:右前进一步,break
‘W’:上前进一步,break
‘S’:下前进一步,break
END CASE
输出字符矩阵
END WHILE
输出 Game Over!!!

2、任务2:会吃的蛇
功能需求:
snake 头撞到身体、障碍(边界或你在地图中定义) 游戏结束
snake 头吃到食物,snake就长一节
细化并完善随机放置食物的伪代码
找一个空白位置
在该位置放置食物
你需要进一步细化的代码:
蛇头撞到身体、障碍物 … …
蛇头撞到食物 … …
蛇头进入一个空位置 … …
以下是完成代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.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][13] = {
    "************",
    "*H         *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "************",
};

int snakeHeadX = 1, snakeHeadY = 1;
int snakeBodyX[SNAKE_MAX_LENGTH] = { 0 }, snakeBodyY[SNAKE_MAX_LENGTH] = { 0 };
int snakeBodyLen = 1;
int FoodX = 0, FoodY = 0;
int gameRunning = 1;
void gameover(void)
{
    gameRunning = 0;
    printf("Game Over!");
}
void putFood(void)
{
    srand(time(NULL));
    FoodX = rand() % 10 + 1;
    FoodY = rand() % 10 + 1;
    while (map[FoodX][FoodY] != BLANK_CELL)
    {
        FoodX = rand() % 10 + 1;
        FoodY = rand() % 10 + 1;
    }
    map[FoodX][FoodY] = SNAKE_FOOD;
}
void snakeMove()
{
        char control = _getch();
        int preSnakeHeadX = snakeHeadX;
        int preSnakeHeadY = snakeHeadY;
        switch (control)
        {
        case 'w':
            snakeHeadX--;
            break;
        case 'a':
            snakeHeadY--;
            break;
        case 's':
            snakeHeadX++;
            break;
        case 'd':
            snakeHeadY++;
            break;
        default:
            break;
        }
        if (map[snakeHeadX][snakeHeadY] == WALL_CELL||map[snakeHeadX][snakeHeadY]==SNAKE_BODY)
            gameover();
        map[snakeHeadX][snakeHeadY] = SNAKE_HEAD;
        map[preSnakeHeadX][preSnakeHeadY] = BLANK_CELL;
        if (snakeHeadX == FoodX && snakeHeadY == FoodY)
        {
            snakeBodyX[snakeBodyLen] = preSnakeHeadX;
            snakeBodyY[snakeBodyLen] = preSnakeHeadY;
            snakeBodyLen++;
            map[preSnakeHeadX][preSnakeHeadY] =SNAKE_BODY;
            putFood();
            return;
        }
        if (snakeBodyLen <= 0)
            return;
            int i;
            for (i = 0; i < snakeBodyLen-1; i++)
            {
                snakeBodyX[i] = snakeBodyX[i + 1];
                snakeBodyY[i] = snakeBodyY[i + 1];
            }
            snakeBodyX[snakeBodyLen - 1] = preSnakeHeadX;
            snakeBodyY[snakeBodyLen - 1] = preSnakeHeadY;
        int j;
        for (j = 0; j < snakeBodyLen; j++)
            map[snakeBodyX[j]][snakeBodyY[j]] = SNAKE_BODY;
        map[snakeBodyX[0]][snakeBodyY[0]] = BLANK_CELL;
    }
void printMap(void)
{
    system("cls");
    int i = 0;
    for (i = 0; i < 12; i++) 
        printf("%s\n", map[i]);
}
int main()
{
    putFood();
    printMap();
    while (gameRunning)
    {
        snakeMove();
        printMap();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/TempterCyn/article/details/78922132