#include "Snake.h"
#include<stdio.h>
#include<conio.h>
#include <windows.h>
#include <iostream>
using namespace std;
#define ROW 20
#define COL 20
int map[ROW][COL];
//初始化二维数组
void Init()
{
for (int i = 0; i < ROW; i++)
for (int j = 0; j < COL; j++)
{
if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1)
{
map[i][j] = 1;
}
else
{
map[i][j] = 0;
}
}
map[3][1] = 2000;
map[3][2] = 1999;
map[3][3] = 1998;
map[3][4] = 3;
}
//随机产生食物位置
void CSnake::FoodLocatin()
{
int y, x;
while (1)
{
y = (int)rand() % (ROW - 2) + 1;
x = (int)rand() % (COL - 2) + 1;
if (map[y][x] == 0)
{
map[y][x] = 2;
break;
}
}
}
//画地图
void CSnake::Dramap()
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
switch (map[i][j])
{
case 0://空地
printf(" ");
break;
case 1://墙
printf("■");
break;
case 2://食物
printf("●");
break;
case 3:
case 5://蛇头
printf("★");
break;
case 4:
//蛇头+墙
printf("※");
break;
default://蛇身
printf("☆");
break;
}
}
printf("\n");
}
}
//开始游戏
void CSnake::BeginGame()
{
int max = 999, min = 2001;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (map[i][j] == 3 || map[i][j] == 5)// 蛇头位置
{
r1 = i;
c1 = j;
}
if (map[i][j]>max)//蛇尾位置
{
max = map[i][j];
snakeTrailRow = i;
snakeTrailCol = j;
}
if (999 <= map[i][j] && map[i][j] <= min)//连着蛇头的蛇身
{
min = map[i][j];
snakeHead2Row = i;
snakeHead2Col = j;
}
}
}
//printf("%d %d", r, c);
//**********************************
//************接收键盘输入**********
char ch;
cin >> ch;
switch ((char)ch)
{
case 'W'://
case 'w':
case 72://上 键盘键值
if (r1 - 1 == snakeHead2Row && c1 == snakeHead2Col)
{
MessageBox(NULL, TEXT("不能往回走,请重新输入"), TEXT("温馨提示"), MB_OK);
break;
}
if (map[r1 - 1][c1] == 1 || (1000 <= map[r1 - 1][c1] && map[r1 - 1][c1] <= 2000))//蛇头前面是墙或蛇身或蛇尾
{
map[r1 - 1][c1] = 4;
system("cls");
Dramap();
MessageBox(NULL, TEXT("GAME OVER"), TEXT("温馨提示"), MB_OK);
exit(0);
}
else if (map[r1 - 1][c1] == 0)//前面是空地
{
map[snakeTrailRow][snakeTrailCol] = 0;
map[r1 - 1][c1] = 3;
map[r1][c1] = min - 1;
}
else//前面食物
{
map[r1 - 1][c1] = 5;
map[r1][c1] = min - 1;
}
break;
case 'S':
case 's':
case 80:
if (r1 + 1 == snakeHead2Row && c1 == snakeHead2Col)
{
MessageBox(NULL, TEXT("不能往回走,请重新输入"), TEXT("温馨提示"), MB_OK);
break;
}
if (map[r1 + 1][c1] == 1 || (1000 <= map[r1 + 1][c1] && map[r1 + 1][c1] <= 2000))//蛇头前面是墙或蛇身或蛇尾
{
map[r1 + 1][c1] = 4;
system("cls");
Dramap();
MessageBox(NULL, TEXT("GAME OVER"), TEXT("温馨提示"), MB_OK);
exit(0);
}
else if (map[r1 + 1][c1] == 0)//前面是空地
{
map[snakeTrailRow][snakeTrailCol] = 0;
map[r1 + 1][c1] = map[r1 + 1][c1] + 3;
map[r1][c1] = min - 1;
}
else//食物
{
map[r1 + 1][c1] = 5;
map[r1][c1] = min - 1;
}
break;
case 'A':
case 'a':
case 75:
if (r1 == snakeHead2Row && c1 - 1 == snakeHead2Col)
{
MessageBox(NULL, TEXT("不能往回走,请重新输入"), TEXT("温馨提示"), MB_OK);
break;
}
if (map[r1][c1 - 1] == 1 || (1000 <= map[r1][c1 - 1] && map[r1][c1 - 1] <= 2000))//蛇头前面是墙或蛇身或蛇尾
{
cout << map[r1][c1 + 1] << endl;
map[r1][c1 - 1] = 4;
system("cls");
Dramap();
MessageBox(NULL, TEXT("GAME OVER"), TEXT("温馨提示"), MB_OK);
exit(0);
}
else if (map[r1][c1 - 1] == 0)//前面是空地
{
map[snakeTrailRow][snakeTrailCol] = 0;
map[r1][c1 - 1] = map[r1][c1 - 1] + 3;
map[r1][c1] = min - 1;
}
else//食物
{
map[r1][c1 - 1] = 5;
map[r1][c1] = min - 1;
}
break;
case 'D':
case 'd':
case 77:
if (r1 == snakeHead2Row && c1 + 1 == snakeHead2Col)
{
MessageBox(NULL, TEXT("不能往回走,请重新输入"), TEXT("温馨提示"), MB_OK);
break;
}
if (map[r1][c1 + 1] == 1 || (1000 <= map[r1][c1 + 1] && map[r1][c1 + 1] <= 2000))//蛇头前面是墙或蛇身或蛇尾
{
cout << map[r1][c1 + 1] << endl;
map[r1][c1 + 1] = 4;
system("cls");
Dramap();
MessageBox(NULL, TEXT("GAME OVER"), TEXT("温馨提示"), MB_OK);
exit(0);
}
else if (map[r1][c1 + 1] == 0)//前面是空地
{
map[snakeTrailRow][snakeTrailCol] = 0;
map[r1][c1 + 1] = map[r1][c1 + 1] + 3;
map[r1][c1] = min - 1;
}
else//食物
{
map[r1][c1 + 1] = 5;
map[r1][c1] = min - 1;
}
break;
default:
{
cout << "输入有误,请重新输入:";
break;
}
}
}
//判断地图上是否存在食物
bool CSnake::IsExistFood()
{
bool flag = false;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (map[i][j] == 2)//
{
flag = true;
}
}
}
return flag;
}