字符版贪吃蛇游戏及算法
2017-12-28 14:52
411 查看
通过c语言制作一款贪吃蛇游戏。
一、实验目的
了解字符游戏的表示
体验自顶向下的设计方法实现问题求解
使用伪代码表示算法
使用函数抽象过程
二、游戏要求与表示
1、玩法
贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。百度百科
2、游戏表示
给定一个10*10的字符矩阵表示蛇的生存空间,其中有一条长度5的蛇(HXXXX), “H”表示蛇头,“X”表示蛇身体。空间中可能有食物(“$”表示)和障碍物(“*”表示)
你可以使用“ADWS”按键分别控制蛇的前进方向“左右上下”, 当蛇头碰到自己的身体或走出边界,游戏结束,否则蛇按你指定方向前进一步。
任务1:会动的蛇
程序遵从以下伪代码:
2、任务2:会吃的蛇
功能需求:
snake 头撞到身体、障碍(边界或你在地图中定义) 游戏结束
snake 头吃到食物,snake就长一节
细化并完善随机放置食物的伪代码
找一个空白位置
在该位置放置食物
你需要进一步细化的代码:
蛇头撞到身体、障碍物 … …
蛇头撞到食物 … …
蛇头进入一个空位置 … …
以下是完成代码
一、实验目的
了解字符游戏的表示
体验自顶向下的设计方法实现问题求解
使用伪代码表示算法
使用函数抽象过程
二、游戏要求与表示
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; }