代碼地址以下:<br>http://www.demodashi.com/demo/14593.htmlphp
使用C++編寫一個簡單的俄羅斯方塊遊戲。html
使用C++圖形庫SFML,官網下載地址爲https://www.sfml-dev.org/download.phpc++
解壓安裝spa
假設安裝路徑爲:C:\Program Files\SFMLcode
VS配置htm
就一個.cpp
文件,同目錄下有兩個文件夾:用來描繪背景的圖片素材的images
和 音樂素材的 audio
。教程
整個代碼分爲簡單的5個模塊:計時器、檢查、轉換、消除、新塊生成遊戲
計時器圖片
遊戲運行核心、設置 delay 值後,計時器每到delay值,處理遊戲的檢查、消除和新塊生成邏輯get
//// Timer 邏輯 while(window.isOpen()) // SFML 窗口 { timer += time; // time是上次計時到本次的時間 if(timer>delay){ // check // transpose // new block timer = 0; } }
檢查
檢查主要檢查兩樣東西:1是檢查是否當前塊落地,2是檢查構成消除條件的行。
1.檢查是否落地
磚塊描述存儲在 int field[20][10]
中,每次有磚塊落地,都會將該磚塊的對應的位置賦值,後續磚塊在下落過程當中遇到有值的場地,則中止下落。檢查落地用 check 描述
bool check() { for (int i = 0; i<4; i++) if (a[i].x<0 || a[i].x >= N || a[i].y >= M) return 0; else if (field[a[i].y][a[i].x]) return 0; return 1; };
2.檢查消除行
當知足一行的field值都不爲0的時候,構成消除行,消除邏輯由 checkline 描述
int k = M - 1; for (int i = M - 1; i>0; i--) { int count = 0; for (int j = 0; j<N; j++) { if (field[i][j]) count++; field[k][j] = field[i][j]; } if (count < N) { k--; } else { score += 1; } }
新塊生成
新塊生成無非是rand一個顏色和磚塊樣式。對於磚塊樣式,羅列在下:
用位置描述全部類型的俄羅斯磚塊。以後再轉換爲座標便可。
畫圖
只要窗口打開着,就須要畫圖,畫圖用draw描述:
/////////draw////////// window.clear(Color::White); window.draw(background); for (int i = 0; i<M; i++) for (int j = 0; j<N; j++) { if (field[i][j] == 0) continue; s.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18)); s.setPosition(j * 18, i * 18); s.move(28, 31); //offset window.draw(s); } for (int i = 0; i<4; i++) { s.setTextureRect(IntRect(colorNum * 18, 0, 18, 18)); s.setPosition(a[i].x * 18, a[i].y * 18); s.move(28, 31); //offset window.draw(s); } // next box nextBox.setTextureRect(IntRect(0, 0, 72, 108)); nextBox.setPosition(240, 20); window.draw(nextBox); // draw next item for (int i = 0; i<4; i++) { s.setTextureRect(IntRect(colorNum_next * 18, 0, 18, 18)); s.setPosition(240+18+a[i].x_next * 18, 20+18+a[i].y_next* 18); //s.move(28, 31); //offset window.draw(s); } window.draw(frame); window.display();
C++編寫簡單的俄羅斯方塊遊戲
代碼地址以下:<br>http://www.demodashi.com/demo/14593.html
注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權