一、實驗介紹
1.1 實驗內容
本節實驗我們進行設計俄羅斯方塊前的思路分析,以及介紹ncurses 庫的使用方法。
1.2 實驗知識點
C++ 編程基礎
ncurses 庫的使用
俄羅斯方塊邏輯設計
1.3 實驗環境
xface 終端
g++ 編譯器
ncurses 庫
1.4 適合人群
本課程難度一般,適合有 C++ 編程基礎,對游戲設計、邏輯分析感興趣的同學。
1.5 代碼獲取
git clone https://github.com/Gamerchen/game_zero.git
二、開發準備
2.1 安裝 ncurses 庫
sudo apt-get updatesudo apt-get install libncurses5-dev
2.2 編譯程序
編譯命令要加上 -l 選項引入 ncurses 庫:
g++ main.c -l ncurses
三、實驗原理
3.1 設計前的分析
在開始程序編寫之前,我們要先分析程序設計需要實現哪些功能,劃分為哪些模塊,在俄羅斯方塊中我們首先想到的應該是顯示方塊,其次是方塊的下落,左右移動,旋轉,最后的層滿消行,另外一個基本的俄羅斯方塊游戲還應該有下一個方塊形狀的提示功能。
所以我們編程中需要解決的問題有:
顯示方塊
實現方塊的移動
方塊旋轉
對層滿的方塊消行
提示下一個方塊形狀
3.2 基本圖形
每個方塊由四個 box 組成,從游戲框的中心位置掉落,在框內不碰撞邊界和其他方塊的情況下可以進行旋轉。
3.3 NCURSES庫的使用
簡單地說, NCURSES 是一個從 System V Release 4.0 (SVr4) 中 CURSES 的克隆,這是一個可自由配置的庫,完全兼容舊版本的 CURSES,是一個可以使應用程序直接控制終端屏幕顯示的庫。NCURSES封裝了底層的終端功能,包含了一些創建窗口的函數,并且有 Menu 、 Panel 和 Form 對CURSES基礎庫的擴展,我們可以建立一個同時包含多窗口(multiple windows)、菜單(menus)、面板(panels)和表單(forms)的應用程序。窗口可以被獨立管理,例如讓它卷動(scrollability)或者隱藏。 菜單(Menus)可以讓用戶建立命令選項,從而方便執行命令。而窗體(Forms)允許用戶建立一些簡單的數據輸入和顯示的窗口。面板(Panels)是 NCURSES 窗口管理功能的擴展,可以用它覆蓋或堆積窗口。
3.3.1 NCURSES--從Hello World程序開始
如果調用 NCURSES 庫中的函數,必須在代碼中加載 ncurses.h 文件( ncurses.h中已經包含stdio.h )
例:
#include <ncurses.h>int main(){ initscr(); //初始化,進入NCURSES模式 printw("Hello World!"); //在虛擬屏幕上打印 Hello Wowrld! refresh(); //將虛擬屏幕上的內容寫到顯示器上,并刷新 getch(); //等待用戶輸入 endwin(); //退出NCURSES模式 return 0;}
在以上實例中我們介紹了 NCURSES 庫中最基本函數的使用方法,函數的功能已在注釋中說明,這里不再贅述。
3.3.2 窗口機制
當 NCURSES 初始化的時候,它會默認創建一個叫做 stdscr 的窗口,大小一般是 80 列,25 行(根據顯示器或者顯卡的不同,可能會出現不同的大?。?,除此之外,你還可以通過窗口系統的函數創建你自己的窗口。
舉例說明,如果調用以下函數:
printw("Hi!");refresh();
它會在stdscr上當前光標位置輸出 "Hi!",調用 refresh() 函數,只更新 stdscr 上的緩沖區。
如果你已經建立了一個叫做win的窗口,想要在win窗口上輸出內容,可以再普通函數前添加w,同時參數也要發生變化。
printw(string) //在stdscr的當前光標位置打印字符串string
mvprintw(y,x,string) //將字符串string打印在坐標(y,x)處
wprintw(win,string) //在窗口win的當前光標位置打印字符串string
mvwprintw(win,y,x,string) //將光標移動到窗口win的(y,x)處然后打印字符串string
相信看完上面的例子,你已經能夠通過函數的命名規則看出各個函數的功能區別
3.3.3 newwin和box函數
一個窗口的建立是通過 newwin() 函數開始的,函數返回一個指向窗口的結構指針,這個指針可以被傳送至一些類似于 wprintw() 這樣需要窗口參數的函數中。
然而,我們創建了一個窗口卻無法看見它,需要用 box() 函數在已經定義的窗口外圍畫上邊框。
例:
WINDOW *create_newin(int height, int width, int starty, int startx){ WINDOW *local_win; local_win = newin(height, width, starty, startx); box(local_win, 0, 0); wrefresh(local_win); return local_win;}
關于 NUCRSES 庫的基本使用方法就介紹到這里了,在具體使用中遇到問題仍需要查閱相關資料。
新聞熱點
疑難解答