使用linux curses開發控制台的打字遊戲

2021-09-30 07:09:33 字數 1963 閱讀 7517

1. 關於linux curses庫,不多說,google下便知道,就像當年的tc下的視窗程式庫一樣

2.  事情源於在chinaunix上看到了the4king在c/c++論壇上的帖子:

**的編譯命令是:

#  gcc file.c  -lrt -lcurses

我的平台是ubuntu10.04

3.  先閱讀原**,了解其思想。

該打字遊戲的實現思想大致如下:

介面如下幾部分組成,topwin(也就是顯示字母下落動畫效果的視窗),numwin(成績框,記錄輸入字元數及命中數)

其它訊號處理倒是簡單,對應了'1'暫停,'2'退出等功能。

主線程: 

以字串darwscr代表整個topwin的輸出內容

docheckkey()執行緒:

do4. 觀察其**,發現一些不足之處

第乙個地方,新增乙個basewin,完全覆蓋原始主視窗,因為發現在不同的終端下,預設原始主視窗的背景不一致,現在用basewin來統一一下,這樣做有些移植性的意思哈。

首先,changekey()函式與函式之間用了不必要的訊號量,完全可以用函式呼叫來代替

其次,每交topwin下移一行(產生動畫效果)時,呼叫changekey()函式一次,實際上最多只能處理乙個input字元,效果就是如果某一行的字元數大於topwin的高度lines,

那麼很悲劇,你無論鍵盤敲得多快,只能眼睜睜看著這一行落地而毫無辦法。而且原**裡只用了乙個變數去儲存最近的命中字元,如果你輸入很快,後面就會覆蓋前面的。

解決辦法很簡單:

先建立輸入緩衝區,這裡用了乙個迴圈佇列,長度為1000,客觀地講應該不會溢位。

接著,就是改動changekey()的stop()時間,把節省下來的時間用於迴圈讀緩衝區,爭取在有限的時間裡多處理幾個命中的字元。

最後, 完成上面這些改動之後,編譯執行,緩衝區的效果是有了,可以在一次動畫效果之間命中多個字元,但問題又來了,發現顯示命中效果有問題,個別字元的命中效果產生了偏離,比如明明是第n行的第12個字元命中,卻顯示成了第n-行的第12個字元命中。檢查了下**,發現是多執行緒的問題。原**在checkkey()裡檢查命中字元,並把其位置記錄到緩衝區裡,問題是,如果checkkey()恰好發生在一次動畫效果之前,那麼由於隨後發生了動畫效果,剛剛在checkkey()裡記錄的命中位置就不準確了,於是需要在動畫效果的**中檢查緩衝區,並修正已有資料的偏移。同時,應該保證checkkey()修改緩衝區的**與動畫**互斥。同一時刻只能有乙個執行, 不然就混亂了!

可以通過增加訊號量控制來改進這個問題

checkkey()執行緒:

迴圈接收鍵盤輸入

訊號量p操作,進入臨界區

在當前darwscr裡,找出命中位置,並記錄到緩衝區中

訊號量v操作,退出臨界區

主線程,對應地改動:

sem_wait(&sem_location);

動畫效果區**

sem_post(&sem_location);

改動後的**如下:

5.   在完成原打字遊戲的改進後,我想再增加功能,把打字遊戲變成單詞練習遊戲,就像一些打字練習的軟體一樣

基本思路是,生成一系列的小視窗,視窗有兩行,一行是單詞,隨機產生,一行空等待使用者輸入

動畫效果還是主線程實現,定時迴圈。

當使用者輸入的單詞完全匹配小視窗上的單詞時,視窗消失(不要delwin(),應該**到乙個pool中,以重複使用)

**如下:

這個單詞練習遊戲還有很多地方沒有完善,比如單詞庫隨機功能,計數功能有問題(懶得改了),或者還有bug,但跑起來還像那麼回事,如下圖:

6.  需要說明的是refresh()函式的功能,在這上面犯了不少錯誤:

refresh()就是重新整理主螢幕(預設的螢幕)

a)    程式初始化階段,清除主螢幕,否則有時候程式啟動後,視窗上很多亂碼和不知名的符號!

b) 如果程式裡生成了好幾個視窗,並頻繁操作它們的位置,那麼也需要定時地重新整理主螢幕,否則同樣是視窗上顯示混亂!

Linux curses 總結三(視窗)

windows結構 建立和銷毀視窗 通用函式 乙個小栗子 乙個curses程式不僅僅只有乙個視窗,stdscr就是curses程式的預設視窗,stdscr就是特殊的windows結構函式名 返回值作用 newwin window 建立視窗 delwin int銷毀視窗 前面已經學習了對strscr的...

Linux curses 之 顯示中文亂碼

剛上班沒啥事,打算做些以前想做的事情,做個貪吃蛇吧。然後就接觸到了curses庫,在學習的過程中發現中文亂碼,以下是解決方法。sudo apt get install libncurses5 libncursesw5 libncursesw5 dbg libncursesw5 dev新增 inclu...

Linux curses 總結三(對鍵盤的操作)

cbreak cooked 預處理模式 curses程式的控制模式函式 curses程式的鍵盤操作函式 小栗子curses程式的鍵盤操作是對底層的簡單封裝介面 cooked 標準輸入模式,處理的是一行資料,每次遇到 r 換行符 才會把輸入到快取的資料傳遞給程式,這種情況下鍵盤輸入特殊字元可以被處理 ...