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;
}