简易贪吃蛇
基于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;
}
};
上一篇: Wi-Fi 6和5G,谁也不能干掉谁
下一篇: BZOJ3028: 食物(生成函数)