贪吃蛇

基于VS2019   EasyX插件   C/C++

贪吃蛇

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<time.h>

#define BLOCK_SIZE 20//每个小格子的长宽大小
#define HEIGHT 30//高度上一共30个小格子
#define WIDTH 40//宽度上一共40个小格子

//全局变量定义

int Blocks[HEIGHT][WIDTH] = { 0 };//二维数组,用于记录所有的游戏数据
int isFood[HEIGHT][WIDTH] = { 0 };
char moveDirection;//小蛇移动方向
int isFailure = 0;//判断游戏是否失败
int foodNum = 0;

void moveSnake()//移动小蛇及相关处理函数
{
	for (int i = 0; i < HEIGHT; i++)//对行遍历
	{
		for (int j = 0; j < WIDTH; j++)//对列遍历
		{
			if (Blocks[i][j] > 0)//大于0的为小蛇元素
			{
				Blocks[i][j]++;//让其+1
			}
		}
	}
	//定义变量,存储旧蛇尾、旧蛇头的坐标位置
	int oldTail_i, oldTail_j, oldHead_i, oldHead_j;
	int max = 0;//用于记录最大值
	for (int i = 0; i < HEIGHT; i++)
	{
		for (int j = 0; j < WIDTH; j++)
		{
			if (max < Blocks[i][j])//如果当前元素值比max大
			{
				max = Blocks[i][j];//更新max的值
				oldTail_i = i;//记录最大值的坐标,就是旧蛇尾的位置
				oldTail_j = j;
			}
			if (Blocks[i][j] == 2)//找到数值为2
			{
				oldHead_i = i;//数值为2恰好是旧蛇头的位置
				oldHead_j = j;
			}
		}
	}
	int newHead_i = oldHead_i;//设定变量存储新蛇头的位置
	int newHead_j = oldHead_j;
	
	//根据用户按键,设定新蛇头的位置
	if (moveDirection == 'w')//向上移动
	{
		newHead_i = oldHead_i - 1;
	}
	else if (moveDirection == 's')//向下移动
	{
		newHead_i = oldHead_i + 1;
	}
	else if (moveDirection == 'a')//向左移动
	{
		newHead_j = oldHead_j - 1;
	}
	else if (moveDirection == 'd')//向右移动
	{
		newHead_j = oldHead_j + 1;
	}

	//如果蛇头超出边界,或者蛇头碰到蛇身,游戏失败
	if (newHead_i >= HEIGHT || newHead_i < 0 || newHead_j >= WIDTH || newHead_j < 0 || Blocks[newHead_i][newHead_j]>0)
	{
		isFailure = 1;//游戏失败
		return;//返回
	}
	if(isFood[newHead_i][newHead_j]==0)
	{
		Blocks[newHead_i][newHead_j] = 1;//新蛇头位置数值为1
		Blocks[oldTail_i][oldTail_j] = 0;//旧蛇尾位置变成空白
	}
	else
	{
		Blocks[newHead_i][newHead_j] = 1;//新蛇头位置数值为1
		Blocks[oldTail_i][oldTail_j] = max;//旧蛇尾位置变成空白
		isFood[newHead_i][newHead_j] = 0;
		foodNum = 0;
	}

}

void randomFood()
{
	srand(time(0));
	while (foodNum==0)
	{
		int food_i = rand() % HEIGHT;
		int food_j = rand() % WIDTH;
		if (isFood[food_i][food_j] == 0 && foodNum == 0)
		{
			isFood[food_i][food_j] = 1;
			foodNum++;
			break;
		}
	}
}

void startup()//初始化函数
{
	Blocks[HEIGHT / 2][WIDTH / 2] = 1;//画面中间画蛇头,数字为1
	for (int i = 1; i <= 4; i++)
	{
		//向左依次4个蛇身,数值依次为2,3,4,5
		Blocks[HEIGHT / 2][WIDTH / 2 - i] = i + 1;
	}
	moveDirection = 'd';//初始向右移动
	initgraph(WIDTH * BLOCK_SIZE, HEIGHT * BLOCK_SIZE);//新开画面
	setlinecolor(RGB(200, 200, 200));//设置线条颜色
	BeginBatchDraw();//开始批量绘制
}

void show()//绘制函数
{
	cleardevice();//清屏
	randomFood();
	for (int i = 0; i < HEIGHT; i++)//对二维数组所有元素进行遍历
	{
		for (int j = 0; j < WIDTH; j++)
		{
			if (Blocks[i][j] > 0)//元素大于0表示是蛇,这里让蛇的身体颜色色调变化
			{
				setfillcolor(HSVtoRGB(Blocks[i][j] * 10, 0.9, 1));
			}
			else if (isFood[i][j] == 1)
			{
				setfillcolor(HSVtoRGB(Blocks[i][j] * 10, 0.9, 1));
			}
			else
			{
				setfillcolor(RGB(150, 150, 150));
				//在对应位置处,以对应颜色绘制小方格
			}
			fillrectangle(j * BLOCK_SIZE, i * BLOCK_SIZE, (j + 1) * BLOCK_SIZE, (i + 1) * BLOCK_SIZE);
		}
	}
	if (isFailure == 1)
	{
		TCHAR s[] = _T("游戏结束");
		settextstyle(40, 0, _T("宋体"));
		outtextxy((HEIGHT * BLOCK_SIZE) / 2, (WIDTH * BLOCK_SIZE) / 2, s);
	}
	FlushBatchDraw();//批量绘制
}

void updateWithoutInput()//和输入无关的更新
{
	if (isFailure)
	{
		return;
	}
	static int waitIndex = 1;//静态局部变量,初始化时为1
	waitIndex++;//每一帧+1
	if (waitIndex == 10)//如果等于10才执行,这样小蛇每隔10帧移动一次
	{
		moveSnake();//调用移动小蛇函数
		waitIndex = 1;//再变成1
	}
	randomFood();
}

void updateWithInput()//和输入有关的更新
{
	if (_kbhit() && isFailure == 0)//如果有按键输入,并且游戏不失败
	{
		char input = _getch();//获得按键输入
		if (input == 'a' || input == 's' || input == 'd' || input == 'w')
		{
			moveDirection = input;//设定移动方向
			moveSnake();//调用移动小蛇函数
		}
	}
}

int main()
{
	startup();//初始化函数,仅执行一次
	while (1)//一直循环
	{
		show();
		updateWithoutInput();//和输入无关的更新
		updateWithInput();//和输入有关的更新
	}
	return 0;
}

游戏截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值