[問題] 貪食蛇遇到阻斷式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