我羅斯方塊最終匯報

2022-05-24 18:03:11 字數 3577 閱讀 6153

這個作業屬於哪個課程

物件導向程式設計2020

這個作業的要求在**

我羅斯方塊

這個作業的目的

我羅斯方塊最終匯報

作業正文

我羅斯方塊

github位址

我羅斯方塊

其他參考文獻

windows程式設計

小組成員

041901328 王真平

視窗的建立

對於製作我羅斯方塊來說,第一點也是最重要的一點就是得先建立出用於遊戲介面。

我採用的是win32程式設計來建立視窗。

int winapi winmain(hinstance hinstance, hinstance hpreinstance, lptstr lpcmdline, int ncmdshow)

//建立視窗

if (null == hwnd) //視窗控制代碼

//顯示視窗

showwindow(hwnd, sw_shownormal);

//訊息迴圈

while (getmessage(&msg, null, 0, 0))

return 0;

}

而實現遊戲功能的部分則在放在**函式中

lresult callback myluosi(hwnd hwnd, uint nmsg, wparam wparam, lparam lparam)

return defwindowproc(hwnd, nmsg, wparam, lparam);

}

方塊變形
這個模組是比較難處理的,我剛開始的想法是羅列出所有可能的情況,但是這個方法過於簡單粗暴,而且不易實現。
二維陣列每一縱行的橫座標不變,縱座標依次遞增根據這個規律,第一種演算法的思路就一目了然了,根據方塊的座標,從背景陣列裡複製出待變形的方塊,再通過遍歷賦值的方法,將變形後的方塊直接複製到背景上。

int arrsquare[3][3] = ;

int i, j;

int temp = 2;

//背景塊複製

for (i = 0; i < 3; i++) }

//變形複製回去

for (i = 0; i < 3; i++)

temp = 2;

}

對於長條方塊變形時:先判斷其橫向還是縱向,然後按照下圖所表示的基準點,先將背景陣列中原陣列清空,再將變形後的長條直接複製回背景陣列完成變形。

這是第一種變形的基準點,對應一般情況

第二種變形的基準點,對應特殊情況:

當然再複製回去時要考慮多種情況,就是橫變縱或者縱變橫時,是否可以直接按照基準點進行複製回去。所以對於變形,有以下**對不同情況進行判斷賦值:

if (arr_background[y_square][x_square-1]==1)//橫著

else if (arr_background[y_square + 2][x_square] == 2)

else

}else //豎著

else if (arr_background[y_square][x_square + 2] == 2||x_square == 8 )

else if (arr_background[y_square][x_square - 1] == 2|| x_square == 0)

else

}

增行消行

這個部分是我自己出bug最多的地方,曾經使遊戲數次崩潰出錯。

對於消行函式還是比較容易判斷的,唯一乙個可能出bug的點我覺得是一次消多行的情況。我對於這給消行的處理是:從下往上,遍歷背景陣列,判斷每一行陣列相加之和是否等於20(對於落下的方塊,已經賦值為2),如果等於20,就可以從此行開始,將其上的元素賦值給它的下一行。從而實現消一行。為了解決消多行的問題,我採取了乙個簡單粗暴的方法,每次消一行後,再次從最底部開始遍歷,判斷是否有滿行存在。

int i, j;

int sum = 0;

int temp = 0;

for (i = 19; i >= 0; i--)

if (sum == 20)

}p.score1++;

i = 20;

//i+=1;//第二種思路

}sum = 0;

}

在消行**裡,還有乙個增行函式,對於這個增行函式,其實不是太難實現,就是需要理解一些特殊情況下的賦值問題。

1.從上向下,將每乙個元素的值賦給它下乙個時,需要注意第一行不可以給它上一行賦值,否則會出現訪問越界的問題,第一行的值會付給最後一行,導致出錯。

2.存在一種特殊就是當玩家一剛好增行時,他的方塊剛剛在第一行生成,存在乙個將其方塊覆蓋的問題。要解決此問題,需要乙個判斷函式,在整體向上移動時,判斷第一行是否有新生成的方塊存在,如果有,那麼前三行就不參與向上移動來保證新生成的方塊不會被覆蓋掉。而對於一般情況,下落中的方塊要也要向上移動,來保證不會被已經固定的方塊所覆蓋(其方塊縱座標也要相應上移),**如下

bool can_moveup_1()

}if (!a)

else

}

void addline_p1()

}} else

}} for (int i = 0; i < 10; i++)

}

真的很不容易,不過也正因如此,我學習了很多關於win32程式設計的知識,學會了如何建立乙個視窗,和用它來顯示內容。其次,

如此大的碼量不僅鍛鍊了我的打字速度,還讓我熟練了vs2019的用法,發現了很多新的功能。最後一點,我認為通過這次的專案,

鍛鍊了我找bug和分析問題的能力。

1.沒有找到隊友。我認為這是我在這次大作業裡存在最大的問題。缺乏了與隊友溝通的環節,所有問題都是在單打獨鬥

這一點確實是很糟糕的一點。而且也缺少了對使用git的練習。這個問題的責任在我,沒有勇氣去和其他同學溝通,錯過了組隊

的機會導致只能乙個人做。

2.**組織的不好。整個專案都是在乙個cpp檔案裡完成,我認為這個也是很不好的習慣,當進度一半多以後,整個行數

過多,除錯和修改都很不方便。

3.雖然本次使用了c++進行程式設計,我覺得自己的**仍然不能稱作物件導向程式設計。感覺除了使用了類以外,不太符合面向

物件的要求。物件導向的方法使用不到位,只是用了類來組織函式和方法,缺少了對繼承以及其他特性的使用。

4.存在當一名玩家長按某一方向操作鍵時,會影響另一玩家的相同操作的bug。暫時無法解決,只能禁止在遊戲中長按按鍵。

5.還未實現遊戲結束後後開始新遊戲這一功能,只能關閉視窗再重新開啟。

6.可能存在其他隱藏的bug,在測試時沒有發現(在消行的時候)。

7.還沒能進行視窗的美化,感覺還是都點醜。

我羅斯方塊匯報 一

我羅斯開發日記 這個作業要求在 2020物件導向程式設計 這個作業要求在 我羅斯方塊匯報 1 這個作業的目標 匯報自己這個階段的開發進度,製作一篇開發日記 參考文獻 c 如何移動游標 參考文獻 c語言控制台讀取上下鍵指令 github位址 teris plus 小組成員 學號 肖清江 1319011...

我羅斯方塊匯報(1)

這個作業屬於哪個課程 班級的鏈結 這個作業要求在 作業的要求 這個作業的目標 匯報自己這個階段的開發進度。完成了哪幾個模組 講述自己遇到的問題和嘗試解決的方法和最後的結果 解決與否 製作一篇開發日記,例子如此,描述自己開發某乙個模組的過程。作業正文 作業github 暫存在本地 小組成員 03190...

我羅斯方塊匯報(1)

這個作業屬於哪個課程 物件導向程式設計 這個作業要求在 我羅斯方塊匯報 1 這個作業的要求 1 匯報自己這個階段的開發進度。完成了哪幾個模組 2 講述自己遇到的問題和嘗試解決的方法和最後的結果 解決與否 3 製作一篇開發日記,例子如此,描述自己開發某乙個模組的過程。專案位址 github 小組成員 ...