C++編寫簡單的俄羅斯方塊遊戲

代碼地址以下:<br>http://www.demodashi.com/demo/14593.htmlphp

C++編寫簡單的俄羅斯方塊遊戲

使用C++編寫一個簡單的俄羅斯方塊遊戲。html

1 環境要求

使用C++圖形庫SFML,官網下載地址爲https://www.sfml-dev.org/download.phpc++

  1. 解壓安裝spa

    假設安裝路徑爲:C:\Program Files\SFMLcode

  2. VS配置htm

    • 新建項目之後,選中項目右擊選中屬性
    • 在左上方的平臺選擇:X64
    • 左邊的配置屬性選擇:VC++ 目錄,在右邊方框能夠看到,可執行目錄、包含目錄等等
    • 可執行目錄中添加 C:\Program Files\SFML\SFML-2.4.2\bin(添加的路徑已本教程 SFML 的解壓路徑相應來寫的,看官本身的路徑對照着來就好了)
    • 包含目錄添加:C:\Program Files\SFML\SFML-2.4.2\include
    • 庫目錄添加:C:\Program Files\SFML\SFML-2.4.2\lib
    • 選擇鏈接器–輸入–附加依賴項,添加: sfml-graphics-d.lib sfml-window-d.lib sfml-audio-d.lib sfml-network-d.lib

2 項目目錄結構

就一個.cpp 文件,同目錄下有兩個文件夾:用來描繪背景的圖片素材的images 和 音樂素材的 audio教程

3. 遊戲邏輯結構

整個代碼分爲簡單的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();

4. 運行演示

C++編寫簡單的俄羅斯方塊遊戲

代碼地址以下:<br>http://www.demodashi.com/demo/14593.html

注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索