您現在的位置是:首頁 > 遊戲

「CC++」有手就能學會系列——經典俄羅斯方塊

由 程式設計小火車 發表于 遊戲2021-05-11
簡介keyEvent(&window)

俄羅斯方塊為什麼留一條

小白手寫遊戲經典-俄羅斯方塊

兒時經典的掌機遊戲,你還記得嗎?

「CC++」有手就能學會系列——經典俄羅斯方塊

花式消行技巧,榮耀夥伴的最高紀錄,彷彿又回到了純真的戰鬥時代。

「CC++」有手就能學會系列——經典俄羅斯方塊

致敬俄羅斯方塊之父“阿列克謝·帕基特諾夫”,一起實現這個傳奇經典遊戲吧!

「CC++」有手就能學會系列——經典俄羅斯方塊

當時他耗費了6天時間,今天的你需要幾天呢?

在我們的B站中有詳細的講解影片,以及相關的素材,只需90分鐘就能實現這個經典!

>>>>私信我獲得詳細教程地址

先看一下游戲效果:

「CC++」有手就能學會系列——經典俄羅斯方塊

搭建環境

首先,我們來搭建開發環境:

VC++2010或以上版本,推薦使用VS2015以上版本。

下載SFML庫,可以到SFML官網下載,或者聯絡作者。

SFML是一個非常方便的工具庫,我下載的是SFML2。5。1 32位版本(32位可以在32位和64位平臺執行)

下載後解壓到電腦的任意位置,比如:C:\SFML\SFML-2。5。1_32bit

「CC++」有手就能學會系列——經典俄羅斯方塊

3。使用VC++或者VS建立一個空專案,然後配置標頭檔案以及庫檔案。

「CC++」有手就能學會系列——經典俄羅斯方塊

配置使用的庫檔案:

sfml-window-d。lib

sfml-system-d。lib

sfml-graphics-d。lib

sfml-audio-d。lib

「CC++」有手就能學會系列——經典俄羅斯方塊

準備遊戲素材

準備好遊戲的素材(圖片,背景音樂,音效音樂, 字型檔案)。

背景圖片如下,也可以更換成自己喜歡的其他圖片。

「CC++」有手就能學會系列——經典俄羅斯方塊

遊戲區域四周的方框圖片,這個圖片可以讓遊戲介面更好看哦,也可以省略不要。

「CC++」有手就能學會系列——經典俄羅斯方塊

俄羅斯方塊的紋理圖片如下。在程式碼中,我們會按照小方塊的大小進行切割,得到多個不同顏色的小方塊。

「CC++」有手就能學會系列——經典俄羅斯方塊

遊戲邏輯結構

「CC++」有手就能學會系列——經典俄羅斯方塊

搭建遊戲框架

先寫好遊戲框架:

#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;

}

執行後,效果如下:

「CC++」有手就能學會系列——經典俄羅斯方塊

俄羅斯方塊的設計

俄羅斯方塊的實現,有很多實現方式,最簡單的方式是使用多個二位陣列,每個二位陣列來表示一種方塊。不過有更高效的實現方式,使用一個二維陣列來表示多種俄羅斯方塊。

「CC++」有手就能學會系列——經典俄羅斯方塊

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, // 田

};

把方塊資訊轉換成位置座標

「CC++」有手就能學會系列——經典俄羅斯方塊

所以對於“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;

}

。。。。。

}

遊戲方塊的渲染

「CC++」有手就能學會系列——經典俄羅斯方塊

消行的實現

從底部向上逐行掃描。

「CC++」有手就能學會系列——經典俄羅斯方塊

擼碼捷徑

邊看影片邊寫程式碼,遇到問題,私信小編。

>>>>私信我獲得詳細教程地址

推薦文章