c++贪吃蛇单缓冲版最终

HDU/数字媒体技术/游戏程序设计作业

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include <math.h>
#include<windows.h>
#include<conio.h>

using namespace std;
bool BufferSwapFlag = false;
bool gameover;
int patten = 2;
const int width = 20;
const int height = 20;
char ScreenData[width + 5][height + 5];
int x, y, fruitX, fruitY, score;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;
int tailX[100], tailY[100];
int nTail = 1;
int fruitFlash = 0;
int NANDU = 100;
bool PAUSE = false;
bool quit = false;
bool devilfruit = false;
int GOfruit = 0;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

void Initial()
{
	SetConsoleTitleA("Console_贪吃蛇");
	COORD dSize = { 80,25 };
	SetConsoleScreenBufferSize(h, dSize);//窗口缓冲区大小
	CONSOLE_CURSOR_INFO _cursor = { 1,false };//设置光标大小,隐藏光标
	SetConsoleCursorInfo(h, &_cursor);

	gameover = false;
	dir = STOP;
	x = width / 2;
	y = height / 2;
	fruitX = rand() % width;
	fruitY = rand() % height;
	score = 0;

	nTail = 1;
	for (int i = 0; i < 100; i++)
	{
		tailX[i] = 0;
		tailY[i] = 0;
	}
}

void Input()
{
	if (_kbhit())
	{
		switch (_getch())
		{
		case 'a':
		{
			if (dir != RIGHT)
				dir = LEFT;
			break;
		}
		case 'd':
		{
			if (dir != LEFT)
				dir = RIGHT;
			break;
		}
		case 'w':
		{
			if (dir != DOWN)
				dir = UP;
			break;
		}
		case 's':
		{
			if (dir != UP)
				dir = DOWN;
			break;
		}

		case 'h':
			NANDU -= 30;
			break;
		case 'e':
			NANDU += 30;
			break;
		case 'm':
		case 'M':
		{
			if (!devilfruit)
				devilfruit = true;
			else
				devilfruit = false;
			break;
		}
		case 'p':
		case 'P':
		{
			if (!PAUSE)
				PAUSE = true;
			else if (PAUSE)
				PAUSE = false;
			break;
		}
		case 'n':
		case 'N':
		{
			gameover = true;
			quit = false;
			break;
		}
		default:
			break;
		}
	}
}

void overput()
{
	if (_kbhit())
	{
		switch (_getch())
		{
		case 'y':
		case 'Y':
		{
			gameover = false;
			system("cls");
			break;
		}
		case 'n':
		case 'N':
		{
			gameover = false;
			quit = true;
		}
		default:
			break;
		}
	}
}

void Logic()
{
	int prevX = tailX[0];
	int prevY = tailY[0];
	int prev2X, prev2Y;
	tailX[0] = x;
	tailY[0] = y;
	if (NANDU > 130)
		NANDU = 130;
	if (NANDU < 10)
		NANDU = 10;


	switch (dir)
	{
	case LEFT:
		x--;
		break;
	case RIGHT:
		x++;
		break;
	case UP:
		y--;
		break;
	case DOWN:
		y++;
		break;
	default:
		break;
	}
	//吃果子加分
	if (x == fruitX && y == fruitY)
	{
		score += 10;
		fruitX = rand() % width;
		fruitY = rand() % height;
		nTail++;
	}
	if (GOfruit == 20)
	{
		SetConsoleTextAttribute(h, 0X76);
		COORD pos;
		pos.X = 2 * fruitX + 2;
		pos.Y = fruitY + 1;
		SetConsoleCursorPosition(h, pos);
		cout << "  ";
		fruitX = rand() % width;
		fruitY = rand() % height;
		GOfruit = 0;
	}

	for (int i = 1; i < nTail; i++)
	{
		prev2X = tailX[i];
		prev2Y = tailY[i];
		tailX[i] = prevX;
		tailY[i] = prevY;
		prevX = prev2X;
		prevY = prev2Y;
	}


	for (int i = 1; i < nTail; i++)
	{
		if (tailX[i] == fruitX && tailY[i] == fruitY)
		{
			fruitX = rand() % width;
			fruitX = rand() % height;
		}
		if (tailX[i] == x && tailY[i] == y)
		{
			gameover = true;
		}
	}

	//模式选择 现默认为穿墙
	if (patten == 1)
	{
		if (x > width || x<0 || y>height || y < 0)
			gameover = true;
	}
	else if (patten == 2)
	{
		if (x >= width)
			x = 1;
		else if (x < 0)
			x = width - 1;
		if (y >= height)
			y = 0;
		else if (y < 0)
			y = height - 1;
	}
}

//光标位置
void setPos(int X, int Y)
{
	COORD pos;
	pos.X = 2 * (X + 1);
	pos.Y = Y + 1;
	SetConsoleCursorPosition(h, pos);
}

void DrawMap()
{
	system("cls");//舞台清除
	int textcolor = 0X99;
	SetConsoleTextAttribute(h, textcolor);

	setPos(-1, -1);
	for (int i = 0; i < width + 2; i++)
	{
		cout << "##";
	}
	for (int i = 0; i < height; i++)
	{
		setPos(-1, i);
		for (int j = 0; j < width + 2; j++)
		{
			if (j == 0)
			{
				textcolor = 0X99;
				SetConsoleTextAttribute(h, textcolor);
				cout << "##";
			}

			else if (j == width + 1)
			{
				textcolor = 0X99;
				SetConsoleTextAttribute(h, textcolor);
				cout << "##";
			}

			else
			{
				textcolor = 0X76;
				SetConsoleTextAttribute(h, textcolor);
				cout << "  ";
			}

		}
		cout << endl;
	}
	setPos(-1, height);
	for (int i = 0; i < width + 2; i++)
	{
		textcolor = 0X99;
		SetConsoleTextAttribute(h, textcolor);
		cout << "##";
	}
	cout << endl;
}

void eraseSnake()
{
	for (int i = 0; i < nTail; i++)
	{
		SetConsoleTextAttribute(h, 0X76);
		setPos(tailX[i], tailY[i]);
		cout << "  ";
	}
}

void DrawLocally()
{
	//水果
	if (fruitFlash)
	{
		setPos(fruitX, fruitY);
		SetConsoleTextAttribute(h, 0X44);
		cout << "FF";
		fruitFlash++;

		if (fruitFlash % 5 == 0)
			fruitFlash = 0;
	}
	else
	{
		setPos(fruitX, fruitY);
		SetConsoleTextAttribute(h, 0X76);
		cout << "  ";
		fruitFlash = 1;
	}

	//蛇
	for (int i = 0; i < nTail; i++)
	{
		setPos(tailX[i], tailY[i]);
		if (i == 0)
		{
			SetConsoleTextAttribute(h, 0X22);
			cout << "OO";
		}
		else
		{
			SetConsoleTextAttribute(h, 0Xaa);
			cout << "oo";
		}
	}
	//setPos(0, height + 1);
	//SetConsoleTextAttribute(h, 0X0e);
	//cout << "游戏得分:" << score;
}

void gameover_info()
{
	setPos(8, 9);
	SetConsoleTextAttribute(h, 0x74);
	cout << "游戏结束";
	setPos(6, 10);
	cout << "Y重新开始/N退出";
	int textcolor = 0X09;
	SetConsoleTextAttribute(h, textcolor);
}

void Prompt_info(int _x, int _y)
{
	int InitalX = 20, initalY = -1;
	int i = 0;
	SetConsoleTextAttribute(h, 0x0f);
	setPos(_x + InitalX, _y + initalY);
	cout << "▲游戏说明";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	1.蛇身自撞,游戏结束";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	2.蛇可穿墙";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	3.蛇不可回头";
	initalY += 2;

	setPos(_x + InitalX, _y + initalY);
	cout << "●操作说明";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	向左移动:A";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	向上移动:W";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	向右移动:D";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	向下移动:S";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	开始游戏:任意方向键";
	initalY++;
	SetConsoleTextAttribute(h, 0x40);
	setPos(_x + InitalX, _y + initalY);
	cout << "	难度增加(加速):H";
	initalY++;
	SetConsoleTextAttribute(h, 0xa0);
	setPos(_x + InitalX, _y + initalY);
	cout << "	难度降低(减速):E";
	initalY++;
	SetConsoleTextAttribute(h, 0xb0);
	setPos(_x + InitalX, _y + initalY);
	cout << "	魔鬼模式(欢迎挑战):M";
	initalY++;
	SetConsoleTextAttribute(h, 0x0f);
	setPos(_x + InitalX, _y + initalY);
	cout << "	游戏暂停:P";
	initalY++;
	setPos(_x + InitalX, _y + initalY);
	cout << "	退出游戏:N";
	initalY += 2;

	setPos(_x + InitalX, _y + initalY);
	cout << "■作者:杭电数媒Rick";

}

void showScore(int _x, int _y)
{
	setPos(_x + 20, _y + 17);
	SetConsoleTextAttribute(h, 0x0f);
	cout << "当前难度:" << 5 - ((NANDU - 10) / 30);
	setPos(_x + 20, _y + 19);
	SetConsoleTextAttribute(h, 0x0f);
	cout << "当前积分:";
	SetConsoleTextAttribute(h, 0x0c);
	cout << score;
}

void gamepause()
{
	if (PAUSE)
	{
		setPos(8, 9);
		SetConsoleTextAttribute(h, 0x74);
		cout << "游戏暂停";
	}
	else
	{
		setPos(8, 9);
		SetConsoleTextAttribute(h, 0x74);
		cout << "        ";
	}
}

int main()
{
	do
	{
		Initial();
		DrawMap();
		Prompt_info(3, 1);
		while (!gameover)
		{
			Input();
			if (!PAUSE)
			{
				eraseSnake();
				Logic();
				DrawLocally();
				showScore(3, 1);
				Sleep(NANDU);
				if (devilfruit)
					GOfruit++;
			}
			gamepause();
		}
		gameover_info();
		while (gameover)
		{
			overput();
			Sleep(50);
		}
	} while (!quit);

	setPos(0, height + 3);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值