使用C++一步步實(shí)現(xiàn)俄羅斯方塊
一、實(shí)驗(yàn)介紹
1.1 實(shí)驗(yàn)內(nèi)容
本節(jié)實(shí)驗(yàn)我們進(jìn)行設(shè)計(jì)俄羅斯方塊前的思路分析,以及介紹ncurses 庫的使用方法。
1.2 實(shí)驗(yàn)知識點(diǎn)
C++ 編程基礎(chǔ)
ncurses 庫的使用
俄羅斯方塊邏輯設(shè)計(jì)
1.3 實(shí)驗(yàn)環(huán)境
xface 終端
g++ 編譯器
ncurses 庫
1.4 適合人群
本課程難度一般,適合有 C++ 編程基礎(chǔ),對游戲設(shè)計(jì)、邏輯分析感興趣的同學(xué)。
1.5 代碼獲取
git clone https://github.com/Gamerchen/game_zero.git
二、開發(fā)準(zhǔn)備
2.1 安裝 ncurses 庫
sudo apt-get update sudo apt-get install libncurses5-dev
2.2 編譯程序
編譯命令要加上 -l 選項(xiàng)引入 ncurses 庫:
g++ main.c -l ncurses
三、實(shí)驗(yàn)原理
3.1 設(shè)計(jì)前的分析
在開始程序編寫之前,我們要先分析程序設(shè)計(jì)需要實(shí)現(xiàn)哪些功能,劃分為哪些模塊,在俄羅斯方塊中我們首先想到的應(yīng)該是顯示方塊,其次是方塊的下落,左右移動,旋轉(zhuǎn),最后的層滿消行,另外一個基本的俄羅斯方塊游戲還應(yīng)該有下一個方塊形狀的提示功能。
所以我們編程中需要解決的問題有:
顯示方塊
實(shí)現(xiàn)方塊的移動
方塊旋轉(zhuǎn)
對層滿的方塊消行
提示下一個方塊形狀
3.2 基本圖形
每個方塊由四個 box 組成,從游戲框的中心位置掉落,在框內(nèi)不碰撞邊界和其他方塊的情況下可以進(jìn)行旋轉(zhuǎn)。
3.3 NCURSES庫的使用
簡單地說, NCURSES 是一個從 System V Release 4.0 (SVr4) 中 CURSES 的克隆,這是一個可自由配置的庫,完全兼容舊版本的 CURSES,是一個可以使應(yīng)用程序直接控制終端屏幕顯示的庫。NCURSES封裝了底層的終端功能,包含了一些創(chuàng)建窗口的函數(shù),并且有 Menu 、 Panel 和 Form 對CURSES基礎(chǔ)庫的擴(kuò)展,我們可以建立一個同時包含多窗口(multiple windows)、菜單(menus)、面板(panels)和表單(forms)的應(yīng)用程序。窗口可以被獨(dú)立管理,例如讓它卷動(scrollability)或者隱藏。 菜單(Menus)可以讓用戶建立命令選項(xiàng),從而方便執(zhí)行命令。而窗體(Forms)允許用戶建立一些簡單的數(shù)據(jù)輸入和顯示的窗口。面板(Panels)是 NCURSES 窗口管理功能的擴(kuò)展,可以用它覆蓋或堆積窗口。
3.3.1 NCURSES--從Hello World程序開始
如果調(diào)用 NCURSES 庫中的函數(shù),必須在代碼中加載 ncurses.h 文件( ncurses.h中已經(jīng)包含stdio.h )
例:
#include <ncurses.h>
int main()
{
initscr(); //初始化,進(jìn)入NCURSES模式
printw("Hello World!"); //在虛擬屏幕上打印 Hello Wowrld!
refresh(); //將虛擬屏幕上的內(nèi)容寫到顯示器上,并刷新
getch(); //等待用戶輸入
endwin(); //退出NCURSES模式
return 0;
}
在以上實(shí)例中我們介紹了 NCURSES 庫中最基本函數(shù)的使用方法,函數(shù)的功能已在注釋中說明,這里不再贅述。
3.3.2 窗口機(jī)制
當(dāng) NCURSES 初始化的時候,它會默認(rèn)創(chuàng)建一個叫做 stdscr 的窗口,大小一般是 80 列,25 行(根據(jù)顯示器或者顯卡的不同,可能會出現(xiàn)不同的大小),除此之外,你還可以通過窗口系統(tǒng)的函數(shù)創(chuàng)建你自己的窗口。
舉例說明,如果調(diào)用以下函數(shù):
printw("Hi!");
refresh();
它會在stdscr上當(dāng)前光標(biāo)位置輸出 "Hi!",調(diào)用 refresh() 函數(shù),只更新 stdscr 上的緩沖區(qū)。
如果你已經(jīng)建立了一個叫做win的窗口,想要在win窗口上輸出內(nèi)容,可以再普通函數(shù)前添加w,同時參數(shù)也要發(fā)生變化。
printw(string) //在stdscr的當(dāng)前光標(biāo)位置打印字符串string
mvprintw(y,x,string) //將字符串string打印在坐標(biāo)(y,x)處
wprintw(win,string) //在窗口win的當(dāng)前光標(biāo)位置打印字符串string
mvwprintw(win,y,x,string) //將光標(biāo)移動到窗口win的(y,x)處然后打印字符串string
相信看完上面的例子,你已經(jīng)能夠通過函數(shù)的命名規(guī)則看出各個函數(shù)的功能區(qū)別
3.3.3 newwin和box函數(shù)
一個窗口的建立是通過 newwin() 函數(shù)開始的,函數(shù)返回一個指向窗口的結(jié)構(gòu)指針,這個指針可以被傳送至一些類似于 wprintw() 這樣需要窗口參數(shù)的函數(shù)中。
然而,我們創(chuàng)建了一個窗口卻無法看見它,需要用 box() 函數(shù)在已經(jīng)定義的窗口外圍畫上邊框。
例:
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;
}
關(guān)于 NUCRSES 庫的基本使用方法就介紹到這里了,在具體使用中遇到問題仍需要查閱相關(guān)資料。
上一篇:C 標(biāo)準(zhǔn)I/O庫的粗略實(shí)現(xiàn)教程
欄 目:C語言
本文標(biāo)題:使用C++一步步實(shí)現(xiàn)俄羅斯方塊
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1008.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言沒有round函數(shù) round c語言
- 01-10c語言 跳臺階問題的解決方法
- 01-10如何判斷一個數(shù)是否為2的冪次方?若是,并判斷出來是多少次方
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何判斷一個數(shù)是否為4的冪次方?若是,并判斷出來是多少次方
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載


