#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;
}
贪吃蛇(欢乐小游戏)
最新推荐文章于 2024-07-16 15:29:19 发布