您的位置:首页 > 其它

宇宙无敌皮皮蛇

2017-12-22 18:55 197 查看

宇宙无敌皮皮蛇

开头

如何让一条贪食蛇升级成为智能蛇呢?如何在字符终端上完成“清屏”“修改光标位置”“设置字符前景和背景色”等操作咧?想啊想想啊想,于是宇宙无敌皮皮蛇诞生了。

凭什么叫无敌蛇

为了让这条蛇看起来更酷,我对这条蛇进行了全方位的改造,让这个字符游戏更像一个游戏:

优化界面,并增设了一定长度的障碍物;

增设得分、坐标等变量的显示;

增强趣味性,玩家可自由设置前进速度、声音、界面颜色;

对比之前输入后还要按一次回车的情况,这里采用了Linux下非阻塞地检测键盘输入的方法,实现 kbhit();

增设智能模式,该模式下玩家可以成为一个旁观者,无敌蛇将会自动前进,不断成长。

游戏界面如下:



如何无敌

自顶向下,逐步求精,无敌蛇的程序开头见下图:



其中GameStart()和GameOver()各负责游戏的开头和结尾;initialization()负责初始化游戏;move()负责移动;judge_head()负责判断;static_info()和dynamic_info()负责变量的显示;其他部分代码如下:

gotoxy()即根据坐标防止光标,在各部函数均有应用:



draw_cube()负责展示游戏画面:



food()负责食物部分:



smart()是智能模式开启后将要执行的部分,智能模式给出的伪代码:

// Hx,Hy: 头的位置
// Fx,Fy:食物的位置
function whereGoNext(Hx,Hy,Fx,Fy) {
// 用数组movable[3]={“a”,”d”,”w”,”s”} 记录可走的方向
// 用数组distance[3]={0,0,0,0} 记录离食物的距离
// 分别计算蛇头周边四个位置到食物的距离。H头的位置,F食物位置
//     例如:假设输入”a” 则distance[0] = |Fx – (Hx-1)| + |Fy – Hy|
//           如果 Hx-1,Hy 位置不是Blank,则 distance[0] = 9999
// 选择distance中存最小距离的下标p,注意最小距离不能是9999
// 返回 movable[p]
}


p_move()负责链表指针的变动(蛇每部位都存在结构体变量中):



总结

十分认同写程序时,一个完整框架万分重要。

而在这个程序里,有许多函数是我们没有接触过的,比如光标的放置,比如kbhit(),即作业要求中说的“在字符终端上完成“清屏”“修改光标位置”“设置字符前景和背景色”等操作”,于是这就更考验程序员检索信息和学习应用的能力了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: