命令贪吃蛇2_0
游戏规则
吃食物变长,撞到墙里或咬到自己死亡,占满全屏算赢。
代码
运行前先把输入法调至英文!(我因为没调在测试时死了无数次)
http://www.cnblogs.com/cbattle/p/6383867.html
过程
看了大佬推荐的博客( http://blog.sina.com.cn/s/articlelist_2233904382_0_1.html ),通过移动光标插入字符解决了频繁闪烁的问题。
Console.SetCursorPosition(2 * y, x); Console.Write(c);
百度到可以隐藏光标的方法
Console.CursorVisible = false;
输入后字母依旧存在。用空格遮盖。
但是输入较快时个别字母跳至后面位置,无法清除。用了个笨办法,写了个循环,强行进行4次替换。
后来发现每次计算光标跳转位置(x、y是反的,还有2倍关系)太麻烦,就写了个函数,实现跳转替换调回
void draw(int x, int y, char c) { Console.SetCursorPosition(2 * y, x); Console.Write(c); Console.SetCursorPosition(0, _sca); }
把读取按键和移动写在一个循环里,运行是发现卡顿明显。用多线程解决。
Thread th = new Thread(new ThreadStart(ReadKey));//Thread th = new Thread(new ThreadStart(fun_name)); th.Start();
想加入按下按键时的声音,用Console.Beep(),但是运行时延时严重,放弃了。
运行时发现有一个回头的bug
假设现在方向是向右,快速按上(w)左(a)或下(s)左(a)蛇会原路返回,撞向自己的身体,如果未吃任何食物,身体不够长,会穿透过去,有吃过食物就直接死了。
后来发现是读取按键时间间隔小于移动时间间隔导致的。读取按键时间间隔不能比移动时间间隔大太多,会卡顿明显。故把读取按键时间间隔设为比移动时间间隔多
1ms。
字母bug(未解决)
有时字母会直接出现在游戏框中
大概是因为多线程造成的。光标跳到框内时正好输入
尝试用一个bool型drawing来表示draw()函数的运行状态,drawing==true时不运行ReadKey,无效。没有读入,但是可以输入显示在屏幕上。
玩家体验
偶尔会有bug,字母会显示出来。但是对游戏影响不大。