這個作業屬於哪個課程
物件導向程式設計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 小組成員 ...