C 實現俄羅斯方塊

2022-02-27 09:24:10 字數 4391 閱讀 1440

c++ 實現俄羅斯方塊

一、實驗介紹

1.1 實驗內容

本節實驗我們進行設計俄羅斯方塊前的思路分析,以及介紹ncurses 庫的使用方法。

1.2 實驗知識點

c++ 程式設計基礎

ncurses 庫的使用

俄羅斯方塊邏輯設計

1.3 實驗環境

xfce 終端

g++ 編譯器

ncurses 庫

1.4 適合人群

本課程難度一般,適合有 c++ 程式設計基礎,對遊戲設計、邏輯分析感興趣的同學。

1.5 **獲取

git clone

二、開發準備

2.1 安裝 ncurses 庫

sudo apt-get update

sudo apt-get install libncurses5-dev

​2.2 編譯程式

編譯命令要加上 -l 選項引入 ncurses 庫:

g++ main.cpp -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 ​

int main()

在以上例項中我們介紹了 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_newwin(int height, int width, int starty, int startx)

​關於 ncurses 庫的基本使用方法就介紹到這裡了,在具體使用中遇到問題仍需要查閱相關資料。

c++實現俄羅斯方塊**

#include #include #include #include #include #include ​

using namespace std;

​void swap(int &a, int &b)

int getrand(int min, int max)

​window *create_newwin(int height,int width,int starty,int startx);

void destory_win(window *local_win);

​int game_win_height=30;

int game_win_width=45;

​int hint_win_height=10;

int hint_win_width=20;

window * game_win, *hint_win ,*score_win;

int key;

​class piece;​

int main()

​ destory_win(game_win);

destory_win(hint_win);

destory_win(score_win);

delete pp;

system("clear");

​ int row,col;

getmaxyx(stdscr,row,col);

mvprintw(row/2,col/2 ,"%s","gamer over ! \n ");

mvprintw(row/2+2,col/2-2 ,"%s","wait 5s to return tthe erminal ! \n ");

refresh();

​ sleep(5);

endwin();

return 0;}​

window *create_newwin(int height, int width, int starty, int startx)

​void destory_win(window *local_win)​​

void piece::initial()

}​ }}​

void piece::move()

}wrefresh(game_win);

}​ }

if (fd_isset(0, &set))

}wrefresh(game_win);}}

​ if(key==key_right)

}wrefresh(game_win);}}

​ if(key==key_down)

}wrefresh(game_win);}}

​ if(key==key_up)

rotate();

​ if(head_x+size_w+1>game_win_width)

head_x=game_win_width-size_w-1;

if(head_x<1)

head_x=1;

}}​bool piece::isaggin()

}return false;}​

bool piece::exsqr(int row){

for(int j=1;j=2;i--){

int s=i;

if(exsqr(i)==0){

while(s>1 && exsqr(--s)==0);

for(j=1;jnext_shape=getrand(0,6);

set_shape(next_shape,next_box_shape,next_size_w,next_size_h);​​

for(int i =1;i執行如下 有點low 基本功能都有

執行結果.jpg

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...

C 俄羅斯方塊

因為要得找工作了,不得不寫些文章讓hr更多的了解到我,同時能幫到別的同學也是好的。因為接觸unity時間不是特別久,所以這裡先帖出早期開發的c 遊戲,然後再帖unity遊戲。另外提醒,我的所有作品都是自己開發的,絕無抄襲 程式 和程式設計思想絕沒超抄過別人的 最多也就是高仿別人的遊戲 貪吃蛇算嗎?俄...

俄羅斯方塊 C

include include include include includeusing namespace std define a1 0 a代表長條型,b為方塊,c為l型,d為閃電型 實在無法描述那個形狀 define a2 1 define b 2 define c11 3 define c1...