贪吃蛇(欢乐小游戏)

#include"墙.h"
#include"标头.h"
#include"蛇.h"
#include"食物.h"
#include <iostream>
#include <string>
#include<conio.h>
#include<windows.h>
#pragma comment(lib, "winmm.lib ")
using namespace std;





//墙
class Wall
{
public:
	Wall();
	~Wall() {}
	void initWall();//初始化
	void drawWall();//打印
	P setWallVal();//获取地图信息
	void getWallVal(int row, int col, char val);//输入信息
	void clearSnake();//覆盖蛇的位置
	char setWallVAL(int i,int j);//输出某数据的情况
private:
	char m_Wall[WALL_ROW][WALL_COL];
};

Wall::Wall()
{
	memset(m_Wall, 0, sizeof(char)*WALL_ROW*WALL_COL);
}
void Wall::initWall()
{
	for (int i = 0; i < WALL_ROW; i++)
	{
		for (int j = 0; j < WALL_COL; j += WALL_COL - 1)
		{
			m_Wall[i][j] = WALL_wall;
		}
	}
	for (int i = 0; i < WALL_ROW; i += WALL_ROW - 1)
	{
		for (int j = 0; j < WALL_COL; j++)
		{
			m_Wall[i][j] = WALL_wall;
		}
	}
}
void Wall::drawWall()
{
	for (int i = 0; i < WALL_ROW; i++)
	{
		for (int j = 0; j < WALL_COL; j++)
		{
			switch (m_Wall[i][j])
			{
			case WALL_NULL:
				cout << "  ";
				break;
			case WALL_wall:cout << "■";
				break;
			case WALL_SNAKE:cout << "◆";
				break;
			case WALL_SNAKE_HEAD:cout << "●";
				break;
			case WALL_FOOD:cout << "▲";
				break;
			}
		}
		cout << endl;
	}
}
P Wall::setWallVal()
{
	return m_Wall;
}
void Wall::getWallVal(int row, int col, char val)
{ this->m_Wall[row][col] = val; }
void Wall::clearSnake()
{
	for (int i = 0; i < WALL_ROW; i++)
	{
		for (int j = 0; j < WALL_COL; j++)
		{
			if (m_Wall[i][j] == WALL_SNAKE||m_Wall[i][j]==WALL_SNAKE_HEAD)
			{
				m_Wall[i][j] = WALL_NULL;
			}
		}
	}
}
char Wall::setWallVAL(int i,int j)
{
	return m_Wall[i][j];
}





//蛇
class Snake
{
public:
	Snake() {}
	~Snake() {}

	void SnakeMove(Wall a);//移动
	void initSnake();//初始化
	inline S  setSnake(int i);//输出蛇的信息
	inline S_head*setSnake();//输出蛇头信息
	void goSnake();//自动前进
	bool _isaddSnake(Wall a);//增长
	inline int setSnakeLen();

private:
	float sleep;
	float newtime;
	float endtime;
	S*s;//蛇身
	S_head*s_head;//蛇头
	S temp;//临时数据


};
int Snake::setSnakeLen()
{ return s_head->len; }
void Snake::SnakeMove(Wall a)
{
	
	char ch = ' ';
	if (_kbhit())
	{	
		switch (_getch())
		{
		case'W':
		case'w':
			if(a.setWallVAL(s_head->y-1,s_head->x)!=WALL_wall&&s_head->y-1!=s[0].y)
			{
				goSnake();
				s_head->y--;
			}
			break;
		case'S':
		case's':
			if (a.setWallVAL(s_head->y + 1, s_head->x) != WALL_wall && s_head->y + 1 != s[0].y) {
				goSnake();
				s_head->y++;
			}
			break;
		case'A':
		case'a':
			if (a.setWallVAL(s_head->y , s_head->x- 1) != WALL_wall && s_head->x - 1 != s[0].x) {
				goSnake();
				s_head->x--;
			}
			break;
		case'D':
		case'd':
			if (a.setWallVAL(s_head->y, s_head->x+1) != WALL_wall && s_head->x + 1 != s[0].x) {
				goSnake();
				s_head->x++;
			}
			break;
		}
	}
	//自动前进
	endtime = timeGetTime() / 1000.0f;
	if(endtime-newtime>=sleep)
	 {
	int i = s_head->x - s[0].x;
	int j = s_head->y - s[0].y;
	goSnake();
	s_head->x += i;
	s_head->y += j;
	newtime = endtime;
	}
	

	
}
void Snake::goSnake()
{
	temp = s[s_head->len - 1];
	for (int i = s_head->len; i > 0; i--)
	{
		s[i - 1] = s[i - 2];
	}
	s[0].x = s_head->x;
	s[0].y = s_head->y;
}
void Snake::initSnake()
{
	//初始化蛇头
	s_head = new S_head;
	s = new S;
	temp.x = 0;
	temp.y = 0;
	sleep = 0.5f;
	newtime = timeGetTime() / 1000.0f;
	endtime = 0.0f;
	s_head->len = 2;
	s_head->x = WALL_ROW / 2;
	s_head->y = WALL_COL / 2;
	//初始化蛇身
	s[0].x = WALL_ROW / 2 - 1;
	s[0].y = WALL_COL / 2;
	s[1].x = WALL_ROW / 2 - 2;
	s[1].y = WALL_COL / 2;

}
S Snake::setSnake(int i)
{
	return s[i];
}
S_head*Snake::setSnake()
{
	return s_head;
}
bool Snake::_isaddSnake(Wall a)
{
	if (a.setWallVAL(s_head->y, s_head->x) == WALL_FOOD)
	{
		s_head->len++;
		s[s_head->len - 1] = temp;
		return true;
	}
	return false;
}


//食物

class Food
{
public:
	Food() {}
	~Food() {
		delete FOOD;
		FOOD = NULL;
	}
	void initfood(Wall a);//初始化食物
	S*setFood();//输出食物数据
private:
	S*FOOD;
};

void Food::initfood(Wall a)
{
	//随机数
	srand((unsigned int)time(nullptr));
	FOOD = new S;
	do {
		FOOD->y = rand() % (WALL_ROW-1)+1;
		FOOD->x = rand() % (WALL_COL-1)+1;
	} while (a.setWallVAL(FOOD->y,FOOD->x)!=WALL_NULL);
}
S*Food::setFood()
{
	return FOOD;
}


int main()
{
	Wall a;//创建墙壁对象
	Snake b;//创建蛇对象
	
	a.initWall();	  //初始化
	b.initSnake();	  //初始化
	Food c;//创建食物对象
	c.initfood(a);	  //初始化
	//输入食物的数据
	a.getWallVal(c.setFood()->y, c.setFood()->x, WALL_FOOD);
	//打印
	while(1)
	{
		a.drawWall();//打印墙壁
		a.clearSnake();
		//输入蛇的数据
		a.getWallVal(b.setSnake()->y, b.setSnake()->x, WALL_SNAKE_HEAD);
		for (int i = 0; i < b.setSnake()->len; i++)
		{
			a.getWallVal(b.setSnake(i).y, b.setSnake(i).x, WALL_SNAKE);
		}
		
		//移动
		b.SnakeMove(a);

		//判断(是否吃到食物)
		if (b._isaddSnake(a)) {
			a.getWallVal(c.setFood()->y, c.setFood()->x, WALL_NULL);
			c.~Food();
			if (c.setFood() == NULL)
			{
				Food d;
				d.initfood(a);
				c = d;
				a.getWallVal(c.setFood()->y, c.setFood()->x, WALL_FOOD);
				d.~Food();
			}
			
			}
		
		
		//清空
		

		system("cls");


	}
	
	

	
	

	system("pause");
	return 0;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秘密之乡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值