在同学的帮助下完善的贪吃蛇,感谢,
// tanchishe 3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
using namespace std;
#include <iostream>
#include<conio.h>
#include<Windows.h>
enum Mapstat
{
ROAD, WALL, HEAD, BODY, FOOD
};
HANDLE h;
int Map[20][20];
int snake[20][2];
int CurCout;
int foodx;
int foody;
void Init();
void Show();
void Drawsnake();
void Move(char n);
void BODYMove();
bool IsCanMove(int x,int y);
void SetFoodPostion();
void DrawFood();
bool isDead;
int sleepTime(int a);
void sring();
char n;//按键
char n1;//存储上一次成功运行移动的按键
int main()
{
isDead = false;
SetFoodPostion();
srand(time(NULL));
CurCout = 3;
snake[0][0] = 5;
snake[0][1] = 5;
snake[1][0] = 5;
snake[1][1] = 6;
snake[2][0] = 5;
snake[2][1] = 7;
sring();
int a;
cin >> a;
n = '2';
system("cls");//清空控制台
while (true)
{
Sleep(sleepTime( a));
if (_kbhit())
{
n = _getch();
}
/*if (n=='W'&&n1=='S')//如果按键为W,并且上一次按键为S的话,将S赋值给本次按键,不能让反方向运行
{
n = 'S';
//按键判断
}*/
Init();
Drawsnake();
DrawFood();
Show();
if (isDead)
{
cout << " Game Over" << endl;
cout << " 输入数字1,重新开始,输入其他退出游戏"<<endl;
int a;
cin >> a;
if (a==1)
{
system("cls");//清空控制台
/*CurCout = 3;
snake[0][0] = 5;
snake[0][1] = 5;
snake[1][0] = 5;
snake[1][1] = 6;
snake[2][0] = 5;
snake[2][1] = 7;*/
main();
}
else
{
cout<<" 你好菜,你个菜鸡";
return 0;
}
return 0;
}
if (CurCout ==20)
{
cout << " 恭喜通关";
return 1;
}
Move(n);
CONSOLE_CURSOR_INFO info;//隐藏光标
GetConsoleCursorInfo(h, &info);
info.bVisible = false;
SetConsoleCursorInfo(h, &info);
}
}
int sleepTime(int a)
{
switch (a)
{
case 1:
return 120; break;
case 2:
return 80; break;
case 3:
return 40; break;
default:
main();
break;
}
}
void sring() {
/*cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;*/
cout << "请选择游戏难度" << endl;
cout << " 输入1,选择一般" << endl;
cout << " 输入2,选择困难" << endl;
cout << " 输入3,选择困难加倍" << endl;
cout << "输入文字选择对应的难度,输错无效"<<endl;
}
void DrawFood() {
Map[foody][foodx] = FOOD;
}
void SetFoodPostion() {
foodx = rand() % 18 + 1;
foody = rand() % 18 + 1;
}
bool IsCanMove(int x, int y)
{
Mapstat m = (Mapstat)Map[y][x];
switch (m)
{
case WALL:
isDead = true;
return false;
break;
case BODY:
//if (x==snake[1][0]&&y==snake[1][1]) //蛇头和第一节蛇身子重合
//{
// PENGZHUANG();
//}
/*else
{*/
isDead = true;
return false;
//}
break;
case FOOD:
SetFoodPostion();
CurCout++;
isDead = false;
return true;
break;
}
isDead = false; return true;
}
void BODYMove()
{
for (int i = CurCout-1; i>0; i--)
{
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
}
void Move(char n)
{
switch (n)
{
case 'W':
{
if (snake[0][0] == snake[1][0] && snake[0][1] - 1 == snake[1][1]) //蛇头和第一节蛇身子重合
{
Move(n1);
}
else if (IsCanMove(snake[0][0],snake[0][1]-1))
{
BODYMove();
n1 = n;
snake[0][1]--;
}
break;
}
case 'S':
{
if (snake[0][0] == snake[1][0] && snake[0][1] + 1 == snake[1][1]) //蛇头和第一节蛇身子重合
{
Move(n1);
}
else if (IsCanMove(snake[0][0], snake[0][1] + 1))
{
BODYMove();
n1 = n;
snake[0][1]++;
}
break;
}
case 'A':
{
if (snake[0][0]-1 == snake[1][0] && snake[0][1]== snake[1][1]) //蛇头和第一节蛇身子重合
{
Move(n1);//如果重合的话,重新进入函数,并且运行上一次的存储的方向
}
else if (IsCanMove(snake[0][0]-1, snake[0][1]))
{
BODYMove();
n1 = n;//将此次运行成功的值赋值给n1
snake[0][0]--;
}
break;
}
case 'D':
{
if (snake[0][0] + 1 == snake[1][0] && snake[0][1] == snake[1][1]) //蛇头和第一节蛇身子重合
{
Move(n1);
}
else if (IsCanMove(snake[0][0]+1, snake[0][1]))
{
BODYMove();
n1 = n;
snake[0][0]++;
}
break;
}
default:
break;
}
}
void Drawsnake()
{
for (int i = 0; i < CurCout; i++)
{
int x= snake[i][0];
int y= snake[i][1];
if (i==0)
{
Map[y][x] =(int) HEAD;
}
else
{
Map[y][x] =(int) BODY;
}
}
}
void Show()
{
COORD w{ 0,0 };
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
w.X = j*2;
w.Y = i;
SetConsoleCursorPosition(h, w);
Mapstat m= (Mapstat)Map[i][j];
switch (m)
{
case ROAD:
cout << " ";
break;
case WALL:
cout << "■";
break;
case HEAD:
cout << "●";
break;
case BODY:
cout << "☆";
break;
case FOOD:
cout << "★";
break;
}
}
cout << endl;
}
}
void Init()
{
h = GetStdHandle(STD_OUTPUT_HANDLE);
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
if (i==0||i==19||j==0||j==19)
{
Map[i][j] =(int) WALL;
}
else
{
Map[i][j] = (int)ROAD;
}
}
}
}