字符版贪吃蛇游戏及算法

通过c语言制作一款贪吃蛇游戏。
一、实验目的
了解字符游戏的表示
体验自顶向下的设计方法实现问题求解
使用伪代码表示算法
使用函数抽象过程
二、游戏要求与表示
1、玩法
贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。百度百科
2、游戏表示
给定一个1010的字符矩阵表示蛇的生存空间,其中有一条长度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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值