我一直在研究其中一種蛇形遊戲,並且我有一個switch語句,說明如果按某個鍵來將蛇沿某個方向通過增加/減少,但它只會這樣做,如果我拿着它。我正在尋找一種方法讓蛇的位置不斷遞增,而用戶不必拿着那把鑰匙。我把一個以下的情況下如何讓程序重複增加,直到在switch語句中按下另一個鍵爲止
if(_kbhit()) {
switch(_getch()) {
case 'a' :
dir = LEFT;
x--;
我一直在研究其中一種蛇形遊戲,並且我有一個switch語句,說明如果按某個鍵來將蛇沿某個方向通過增加/減少,但它只會這樣做,如果我拿着它。我正在尋找一種方法讓蛇的位置不斷遞增,而用戶不必拿着那把鑰匙。我把一個以下的情況下如何讓程序重複增加,直到在switch語句中按下另一個鍵爲止
if(_kbhit()) {
switch(_getch()) {
case 'a' :
dir = LEFT;
x--;
我正在尋找一種方式來擁有......保持未持有該密鑰的用戶 遞增。」
恕我直言,你應該考慮的‘選擇()’函數(如果是在您的操作系統提供)
很久以前,我用「選擇()」與VxWorks中,我從一個男人頁面看到這個功能也適用於Ubuntu Linux操作系統。(也許它是提供給你的系統?)
使用select語句,線程或程序可以「監視多個文件描述符,等待一個或多個文件描述符爲某類I/O操作變爲」準備就緒「。輸入可能)。如果可以執行相應的操作(例如,read()沒有阻塞,或者寫入足夠小的write()),則認爲文件描述符已準備就緒。「(來自手冊頁)
實際上,我工作的系統on有一個用戶界面線程(幾個中的一個)問題讀取並監視用戶輸入的輸入fd(通過select)。我們的選擇使用1/2秒超時(您選擇速率)。因此,如果沒有用戶輸入發生在該端口(即設備),超時將釋放程序檢查位中的fd_sets。
並不阻止代碼在超時做額外activites。
我會想你將只有ne編輯readfds,並可以將其他fds留空。
換句話說,通過選擇,您的代碼會監視某個用戶輸入的超時時間,並對用戶輸入(按鍵行程)或因超時而採取行動。
這聽起來像你正在尋找的 - 沒有按鍵的動作。
忘了提到vxWorks提供了fd,FILE *和流(任何到任何)之間的簡單轉換。到目前爲止,我只發現「函數fileno()檢查參數流並返回其整數描述符。」在手冊頁。 (據報道是一個posix函數。) –
這與關於C++的原始問題有什麼關係? – Soviut
@Soviut在OP中,「我正在尋找一種方法來保持遞增,而不需要用戶持有該密鑰。」選擇是一種簡單的方法來實現這一點,但選擇使用fd's。 –
您目前的設計聽起來像它在新聞事件中移動蛇。
我認爲你正在修改設計,使按下事件更新一些當前方向標誌,而一些後臺計時器線程以某種常規幀速率移動蛇。
您的代碼只能在按鍵上移動蛇。你需要實現某種遊戲循環,它根據變量direction
定期移動蛇。然後,您可以重構您的按鍵代碼以簡單更新direction
。
僞代碼:
while: # loop forever
# below could be your switch statement
if direction == 0: # north
y--
if direction == 1: # east
x++
if direction == 2: # south
y++
if direction == 4: # west
x--
if _kbhit():
if _getch() == 'a':
direction == 4 # west
# etc...
如果你發佈你必須調用'如果(的kbhit())'也許我可以擴大我的回答 – tinkertime
代碼我將如何做一個後臺計時器線程@ yankee2905 –