欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简易贪吃蛇

程序员文章站 2022-04-28 14:02:22
基于infinitor的AI贪吃蛇项目,发布简化版贪吃蛇游戏,去除了原来版本的AI功能,简化了部分代码,实现了更为简单的贪吃蛇游戏。 贪吃蛇游戏实际上是控制台的打印程序,电脑并不知道这个游戏叫作“贪吃蛇”,其本质是通过对数组vector进行元素的坐标变换,实现视觉效果上贪吃蛇位置的移动。 主要分为: ......

基于infinitor的ai贪吃蛇项目,发布简化版贪吃蛇游戏,去除了原来版本的ai功能,简化了部分代码,实现了更为简单的贪吃蛇游戏。

贪吃蛇游戏实际上是控制台的打印程序,电脑并不知道这个游戏叫作“贪吃蛇”,其本质是通过对数组vector进行元素的坐标变换,实现视觉效果上贪吃蛇位置的移动。

主要分为:食物模块、信息打印模块、运动模块、键盘监听模块、蛇蛇生死模块和画蛇模块。

流程大致如右侧所示:按下键盘->改变方向->判断是否吃到食物(撞墙)->打印蛇蛇

反复循环,之后考虑进一步改进,把蛇的运行动作改为线程操作,不断实现自动前进。

效果如下图

简易贪吃蛇

关键代码在此:

void move_snake()
{
//监听键盘
listen_key_borad();
//蛇头
coordinate head = m_coordinate[0];
//direction方向:1 上 2 下 3 左 4 右
switch (this->m_direction)
{
case up:
head.y--;
break;
case down:
head.y++;
break;
case left:
head.x--;
break;
case right:
head.x++;
break;
}
//插入移动后新的蛇头
m_coordinate.insert(m_coordinate.begin(), head);
}
//判断是否吃到食物
bool is_eat_food(food & f)
{
//获取食物坐标
coordinate food_coordinate = f.getfoodcoordinate();
//吃到食物,食物重新生成,不删除蛇尾
if (m_coordinate[head].x == food_coordinate.x && m_coordinate[head].y == food_coordinate.y)
{
f.randomxy(m_coordinate);
return true;
}
else
{
//没有吃到食物,删除蛇尾
m_coordinate.erase(m_coordinate.end() - 1);
return false;
}
}
//判断贪吃蛇死了没
bool snake_is_alive()
{
if (m_coordinate[head].x <= 0 ||
m_coordinate[head].x >= gamesetting::window_width - 29 ||
m_coordinate[head].y <= 0 ||
m_coordinate[head].y >= gamesetting::window_height - 1)
{
//超出边界
m_is_alive = false;
return m_is_alive;
}
//和自己碰到一起
for (unsigned int i = 1; i < m_coordinate.size(); i++)
{
if (m_coordinate[i].x == m_coordinate[head].x && m_coordinate[i].y == m_coordinate[head].y)
{
m_is_alive = false;
return m_is_alive;
}
}
m_is_alive = true;

return m_is_alive;
}
//画出贪吃蛇
void draw_snake()
{
//设置颜色为浅绿色
setcolor(10, 0);
for (unsigned int i = 0; i < this->m_coordinate.size(); i++)
{
gotoxy(m_coordinate[i].x, m_coordinate[i].y);
cout << "*";
}
//恢复原来的颜色
setcolor(7, 0);
}
//清除屏幕上的贪吃蛇
void clearsnake()
{
gotoxy(m_coordinate[this->m_coordinate.size()-1].x, m_coordinate[this->m_coordinate.size() - 1].y);
cout << " ";

}
//获取贪吃蛇的长度
int getsnakesize()
{
return m_coordinate.size();
}
//获取当前游戏模式
bool getmodel()
{
return m_model;
}
};