您的位置:首页 > 其它

字符版贪吃蛇游戏及算法

2017-12-28 14:52 411 查看
通过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: