您現在的位置是:首頁 > 遊戲
「CC++」有手就能學會系列——經典俄羅斯方塊
俄羅斯方塊為什麼留一條
小白手寫遊戲經典-俄羅斯方塊
兒時經典的掌機遊戲,你還記得嗎?
花式消行技巧,榮耀夥伴的最高紀錄,彷彿又回到了純真的戰鬥時代。
致敬俄羅斯方塊之父“阿列克謝·帕基特諾夫”,一起實現這個傳奇經典遊戲吧!
當時他耗費了6天時間,今天的你需要幾天呢?
在我們的B站中有詳細的講解影片,以及相關的素材,只需90分鐘就能實現這個經典!
>>>>私信我獲得詳細教程地址
先看一下游戲效果:
搭建環境
首先,我們來搭建開發環境:
VC++2010或以上版本,推薦使用VS2015以上版本。
下載SFML庫,可以到SFML官網下載,或者聯絡作者。
SFML是一個非常方便的工具庫,我下載的是SFML2。5。1 32位版本(32位可以在32位和64位平臺執行)
下載後解壓到電腦的任意位置,比如:C:\SFML\SFML-2。5。1_32bit
3。使用VC++或者VS建立一個空專案,然後配置標頭檔案以及庫檔案。
配置使用的庫檔案:
sfml-window-d。lib
sfml-system-d。lib
sfml-graphics-d。lib
sfml-audio-d。lib
準備遊戲素材
準備好遊戲的素材(圖片,背景音樂,音效音樂, 字型檔案)。
背景圖片如下,也可以更換成自己喜歡的其他圖片。
遊戲區域四周的方框圖片,這個圖片可以讓遊戲介面更好看哦,也可以省略不要。
俄羅斯方塊的紋理圖片如下。在程式碼中,我們會按照小方塊的大小進行切割,得到多個不同顏色的小方塊。
遊戲邏輯結構
搭建遊戲框架
先寫好遊戲框架:
#include
#include
#include
using namespace sf;
void keyEvent(RenderWindow * window) {
Event e;
// pollEvent 從事件佇列中取出一個事件
while (window->pollEvent(e))
{
if (e。type == Event::Closed)
window->close();
if (e。type == Event::KeyPressed) {
switch (e。key。code) {
case Keyboard::Up:
break;
case Keyboard::Left:
break;
case Keyboard::Right:
break;
default:
break;
}
}
}
}
int main()
{
srand(time(0));
// 建立視窗
RenderWindow window(
VideoMode(320, 416), //視窗大小
“Rock”); //標題
// 建立表示圖片的精靈
Texture t2, t3;
t2。loadFromFile(“images/bg2。jpg”);
t3。loadFromFile(“images/frame。png”);
Sprite spriteBg(t2);
Sprite spriteFrame(t3);
while (window。isOpen())
{
keyEvent(&window);
window。clear(Color::White);
window。draw(spriteBg);
window。draw(spriteFrame);
window。display();
}
return 0;
}
執行後,效果如下:
俄羅斯方塊的設計
俄羅斯方塊的實現,有很多實現方式,最簡單的方式是使用多個二位陣列,每個二位陣列來表示一種方塊。不過有更高效的實現方式,使用一個二維陣列來表示多種俄羅斯方塊。
const int ROW_COUNT = 20;
const int COL_COUNT = 10;
int blocks[7][4] = {
1,3,5,7, // I
2,4,5,7, // Z 1型
3,5,4,6, // Z 2型
3,5,4,7, // T
2,3,5,7, // L
3,5,7,6, // J
2,3,4,5, // 田
};
把方塊資訊轉換成位置座標
所以對於“I”字型的方塊,{1,3,5,7} 就使用4個座標來表示,(1,0),(1,1),(1,2),(1,3)
struct Point {
int x, y;
} curBlock[4], BakBlock[4];
……
for (int i = 0; i < 4; i++)
{
curBlock[i]。x = blocks[n][i] % 2;
curBlock[i]。y = blocks[n][i] / 2;
}
俄羅斯方塊的旋轉
旋轉效果,最簡單的方式是,為每一種方向使用一個二位陣列。我們使用最靈活的方式,對俄羅斯方塊進行旋轉處理。
直接使用通用的數學公式,就可以直接得到旋轉後的座標位置。
直接使用數學公式,平面中,一個點(x,y)繞任意點(dx,dy)順時針旋轉a度後的座標
xx= (x - dx)*cos(-a) - (y - dy)*sin(-a) + dx ;
yy= (x - dx)*sin(-a) + (y - dy)*cos(-a) +dy ;
平面中,一個點(x,y)繞任意點(dx,dy)逆時針旋轉a度後的座標
xx= (x - dx)*cos(a) - (y - dy)*sin(a) + dx ;
yy= (x - dx)*sin(a) + (y - dy)*cos(a) +dy ;
我們需要的是逆時針旋轉90度代入公式,得:
Point p = curBlock[1]; //center of rotation
for (int i = 0; i < 4; i++)
{
struct Point tmp = curBlock[i];
curBlock[i]。x = p。x - tmp。y + p。y;
curBlock[i]。y = p。y + tmp。x - p。x;
}
使用時鐘控制自由下落
每次迴圈開始的時候,就累加時間,如果時間超過延時間隔,就呼叫自定義的降落函式drop()
……
while (window。isOpen())
{
float time = clock。getElapsedTime()。asSeconds();
clock。restart(); //計時器重啟及時
timer += time;
keyEvent(&window);
if (timer > delay) {
drop(); //下降一個位置
timer = 0;
}
。。。。。
}
遊戲方塊的渲染
消行的實現
從底部向上逐行掃描。
擼碼捷徑
邊看影片邊寫程式碼,遇到問題,私信小編。
>>>>私信我獲得詳細教程地址
推薦文章
- 融創核心利潤125億,資產減值致420億虧損,或於明年迴歸正軌?
也就是說融創去年一年的利潤加上所餘金額是無法償還全部的欠款的,這無疑給融創在今年的發展埋下了隱患,一方面需要快速恢復正常利潤增長,另一方面還需要所帶款項準備償還的資金...
- 直男會送的6件禮物,希望你準備得不在其中!網友:不如發紅包!
男生們,不要再送女生刻字的水杯了,不僅沒有創意,而且還很俗,甚至價格也很透明~高跟鞋送雙高跟鞋,看似沒有任何毛病,高貴又大氣,然而也依舊登上了直男禮物的榜單,當你在購買高跟鞋時,有沒有想到這是要當作禮物送給對方呢...
- 王一博舞蹈被全民翻跳,正確示範“破圈力”,小眾文化變大眾
關注王一博在節目中多年的表現的朋友會發現,剛開始的時候大家也會質疑王一博,但是隨著節目多年的播出,街舞慢慢地滲透在各行各業,它可以是一種愛好,也可以是一種業餘活動...