[问题] 贪食蛇遇到阻断式getch问题

楼主: andrew771027 (老柏~)   2015-08-13 21:39:58
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Mac OS (g++)
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
ncurses.h
问题(Question):
目前写的贪食蛇练习题,可以分别让蛇自动前进及按上下左右键盘前进
但尝试想把两个功能合并,却疑似发生阻断,已经爬文过但还不知道怎么解
在下面的程式码有highlight,求解
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
#include <iostream>
#include <ncurses.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
using namespace std;
//int move(int y , int x);
#define Initial_Length 5
#define width 50
#define hieght 20
typedef struct snack{
int x;
int y;
}Snack;
Snack Sbody[1000];
Snack Newbody;
Snack Food;
void Show_Bulletinboard()
{
mvaddstr(2,55,"Press Enter or Space to start.");
mvaddstr(6,55,"Press P or p to pause.");
mvaddstr(10,55,"Press to arrow key to move.");
//加一个状态字段
//mvaddch(10,55,'\x18\x19\x1a\x1b');
mvaddstr(14,55,"Grade:");
mvaddstr(18,55,"Speed:");
}
void Initial_Snack_Position()
{
for (int i = 0; i < Initial_Length ; i++)
{
Sbody[i].y = 2;
Sbody[i].x = Initial_Length + 1 - (i);
}
}
void Print_Snack(int *Length)
{
for (int i = 0; i < *Length ; i++)
{
if (i == 0)
{
//改变头的颜色
mvaddstr(Sbody[i].y, Sbody[i].x , "@");
//printf("\033[33m@");
}
else
{
mvaddstr(Sbody[i].y, Sbody[i].x , "@");
}
}
}
void Print_Dot(int Pos_y, int Pos_x, char ch )
{
mvaddch(Pos_y, Pos_x , ch);
//printf("\033[33m@");
}
void Initial_GameZone()
{
for (int j = 1 ; j <= hieght ; j++)
{
for (int i = 1; i <= width ; i++)
{
if (j == 1 || j == hieght)
{
Print_Dot(j,i,'#');
}
else if(i == 1 || i == width)
{
Print_Dot(j,i,'#');
}
}
}
}
void Change_Snack_Position(int * Length)
{
for(int i = *Length -1 ; i >= 0 ; i
作者: Feis (永远睡不着 @@)   2015-08-13 21:43:00
你是不是连按会连走? 方向键控制方向, 他不会走.
楼主: andrew771027 (老柏~)   2015-08-13 21:57:00
对两个功能分开是OK的,但是合在一起就不行
作者: Feis (永远睡不着 @@)   2015-08-13 22:05:00
所以你是希望连按连走 ? 不懂. "方向键控制方向. 不要走"然后看你要 multithread 还是要把 sleep 换掉
楼主: andrew771027 (老柏~)   2015-08-13 22:08:00
应该是我按一次上下左右 蛇就会转向不按的时候就照着原方向移动
作者: Feis (永远睡不着 @@)   2015-08-13 22:09:00
正常的贪吃蛇在你按上下左右的时候是不会转的他只是改变方向. 等下一个时间点移动你才看得到转"方向键控制方向. 不要移动"剩下的问题就是你怎么控制时间点. 你用 sleep 的话一旦睡了要怎么收到键盘资料?
楼主: andrew771027 (老柏~)   2015-08-13 22:11:00
是的,我现在可以单独控制上下左右 让他转向也可以单独施作,当没有碰触上下左右的时候蛇会往前跑但是这两个功能和不起来
作者: Feis (永远睡不着 @@)   2015-08-13 22:13:00
好吧. 我放弃. 简单讲就是你上下左右实作是错的你按方向就会动本身是不对的. 其他的我就不跳针了
楼主: andrew771027 (老柏~)   2015-08-13 22:15:00
我原本是把sleep放在外面http://codepad.org/jI1i5ln9谢谢你
作者: Feis (永远睡不着 @@)   2015-08-13 22:16:00
那有没有想过是因为不能用 sleep ?你在睡的时候要怎么收到键盘资料?
楼主: andrew771027 (老柏~)   2015-08-13 22:17:00
我在思考看看 “方向键控制方向,不要移动”
作者: Feis (永远睡不着 @@)   2015-08-13 22:42:00
如果你把 sleep 放在后面, 逻辑上应该就是我要的但是我研究了一下你的 code. 感觉 stdin 被弄烂了看起来意图比较像是用 stdin 的 buffer 来避免 multithread看看这样有没有比较好? http://codepad.org/gi1cVofH然后 refresh 跟 sleep 要对调. 不然会 lag..
作者: EdisonX (卡卡兽)   2015-08-13 23:22:00
为什么我觉得最大的问题是在 getch() @@不知道 linux 有没有像 windows 类似 GetKeyState 的东西
作者: Feis (永远睡不着 @@)   2015-08-13 23:25:00
看你怎么想. getch 感觉没什么错啊. 只是他乱用
作者: EdisonX (卡卡兽)   2015-08-13 23:26:00
@Feis : 但 getch 不是 Blocking 吗 ?
作者: Feis (永远睡不着 @@)   2015-08-13 23:27:00
nodelay
作者: EdisonX (卡卡兽)   2015-08-13 23:35:00
试了一下, 原来是我误会了 @@
作者: Feis (永远睡不着 @@)   2015-08-13 23:41:00
不过我发现原 po 没加, 也许这才是他想问的.. Orz
作者: ctrlbreak   2015-08-13 23:43:00
看看能不能让kbhit改成直接返回按键讯息, 不要再去getch第2次.
楼主: andrew771027 (老柏~)   2015-08-14 08:34:00
我自己觉得是和c大一样,被kbhit卡住
作者: Feis (永远睡不着 @@)   2015-08-14 08:37:00
我给的版本没有 kbhit 阿我发现因为中文所以贴烂了: http://codepad.org/lyZQziS9
楼主: andrew771027 (老柏~)   2015-08-14 13:30:00
F大,不是指你的code(我还在研究),我原本已为我的code是在kbhit卡住
作者: Feis (永远睡不着 @@)   2015-08-14 15:14:00
你的 kbhit 是自己写的吗?
楼主: andrew771027 (老柏~)   2015-08-14 20:08:00
不是,从网络上找到的,因为linux不支援我原本有想要直接用全域变量处理kbhit里的问题但我也不确定我觉得的问题是不是真正的问题@@谢谢F大解惑

Links booklink

Contact Us: admin [ a t ] ucptt.com