打磚塊專案記錄日記
前言 :
這周我們做的專案是打磚塊游戲,老實說,在做之前,我的信心還是很足的,因為有喬布斯珠玉在前,框架已經被構建好,加上網上還有很多的教程,本以為可以借鑒這些大哥們的專案,來成就自己,沒想到啊,還是年輕了,剛上手就被幾個bug打懵逼了,看了半天都不知道問題在哪,
說起程序,都是淚,要讓我現在說專案怎么樣,實在是不好開口了,說簡單吧,那是在騙自己,要說難,有這么多參考資料,還真難不到哪去,只能說吃一塹長一智吧,這次專案讓我體會到了,無論是看似多么簡單的代碼,都不可小覷,作為一個合格的程式員,必須要時刻保持一個清晰的頭腦和一份縝密的思維,僅以此文來記錄那些靈光一閃的想法和突如其來的bug,
設定的游戲特性:
1.初始化了界面,使得小球,擋板和磚塊出現在螢屏上
2.擋板可以反彈小球,小球打到磚塊會使磚塊消失,并在左上角的積分上面加1,當小球將界面上的所有磚塊打掉之后,會在螢屏正中顯示通關的提示
3.添加了三條生命,照顧一下手殘的玩家(比如說我)
4.當螢屏上磚塊數目消失一半的時候,擋板也會變為原先長度的1/2,
5.添加了一個加速按鈕,當按下加速按鈕的時候小球加速
6.在磚塊背后隱藏了一張非常好看的照片
7.添加了兩個類似彩蛋的按鈕,按下去會有一些意想不到的功能
功能實作:
1.小球、擋板、磚塊的創建:
// 設定小球為空心
ball.setFilled(true);
// 填充顏色是黑色
ball.setColor(Color.YELLOW);
// 添加到畫布上(20,20)的位置
add(ball, 400, 400);
}
2.通過初始化的時候參考添加的方法,使得小球在一開始的時候出現
public void init() {
createTheCanvas();
setTitle(“一場愛情游戲”);//游戲名稱
label1 = new GLabel(“當前積分為:” + b);
label1.setColor(Color.BLUE);
label1.setFont(“宋體”);
pushButton();//呼叫按鈕功能
makeBall();// 往螢屏上添加小球
makeBricks();
makePaddle();
3.磚塊消失的實作
} else if (getCollidingObject() != null) {
vx = -vx;
vy = -vy;
b++;
remove(getCollidingObject());
}
這里呼叫了函式getCollidingObject()
public GObject getCollidingObject() {
double x = ball.getX();
double y = ball.getY();
double x1 = ball.getX();
double y1 = ball.getBottomY();
double x2 = ball.getRightX();
double y2 = ball.getY();
double x3 = ball.getRightX();
double y3 = ball.getBottomY();
if (getElementAt(x, y) != null) {
return getElementAt(x, y);
} else if (getElementAt(x1, y1) != null) {
return getElementAt(x1, y1);
} else if (getElementAt(x2, y2) != null) {
return getElementAt(x2, y2);
} else if (getElementAt(x3, y3) != null) {
return getElementAt(x3, y3);
} else {
return null;
}
}
在呼叫的函式里設定了小球的四個點,當小球的四個點檢測到圖形,就會傳輸到圖形的x值和y值,結合前面所寫的代碼,當回傳的值不為空的時候,就會將回傳的值圖形洗掉,
4.積分計數
積分計數主要也是依賴于回傳值的實作,在類下面添加了一個int b,設定b的初始值為0,每當函式回傳一次數值,b就自加1,然后在前面添加一個label,用來裝載b,
5.添加三條命
因為在本專案中,我的設定是當小球撞到底部就跳出回圈,相當于游戲失敗,為了實作三條命的實作,我在判斷撞擊到底部的陳述句下加了一個if陳述句
if (a < 3) {
remove(ball);
GLabel label = new GLabel(“點擊螢屏繼續開始”);
add(label, 400, 400);
++a;
makeBall();
waitForClick();
remove(label);
設定成員變數a,初始值為1,每次回圈加1,每次進入if陳述句,會將原先的小球洗掉掉,然后添加一個新的小球,回到初始位置,然后設定等待用戶點擊事件,當滑鼠點擊,程式就開始繼續運行,
6.擋板的變化
我設定的是,當打掉界面上一半的小球之后,直接就把原先的擋板刪掉,再新建一個擋板到初始位子,寬度為之前擋板的一半,然后把這些代碼打包成方法,添加到回傳值判斷的陳述句里
public void fangFa() {
if (getCollidingObject() == paddle) {
vx = randomGenerator.nextInt(-10, 10);
vy = -vy;
} else if (getCollidingObject() == image || getCollidingObject() == jep) {
} else if (getCollidingObject() != null) {
vx = -vx;
vy = -vy;
b++;
remove(getCollidingObject());
}
if (b == 90) {
baffleChange();
這里也主要用到的是b的值來判定,前文中有提到,b的值和回傳刪掉當班的值是相同的,當b的值等于螢屏上一半的磚塊的值,就直接呼叫打包好的方法,實作擋板變短的操作,
7.添加照片
這個很簡單,就利用Gimge函式創建一個jep物件,將圖片路徑復制到Giimge函式里就行了
public void createTheCanvas() {
image = new GImage(“img/1.jpeg”);
image.setSize(800, 243);
jep = new GImage(“img/2.jpeg”);
jep.setSize(840, 800);
add(jep, 0, 0);
add(image, 0, 40);
}
在函式init()初始化的時候呼叫這個方法,放到最前面,后面呼叫添加磚塊方法的時候,磚塊就會把圖片覆寫啦,
致那些終將出現的bug:
東野圭吾說過,程式員只有兩種東西不能直視,一種是太陽,另一種是bug,這東西,無法消除,就像陽光只能遮擋而不能傾覆,往往當你以為自己擺脫了bug的時候,你知識進入了另一個不明顯的bug,畢竟程式本身就是最大的bug,所以我們只能盡力避免犯錯,但是它終將會在你疏忽的時候出現,意料之外,情理之中,帶給你一點感觸,一點崩潰,這個時候,不要驚慌,不要害怕,鼓起勇氣,堅定向前,沒有就著眼淚修改bug,是不懂得編程之味的,bug修改的多了,看到那么一些奇怪的bug現象,自然會積累一些奇怪的想法,創造力也就上來了,改bug還可以修身養性,bug的美麗,是抹平性格棱角的尖刀,這是砥礪,也是前行的動力,之所以說這么多,是因為我突然發現,我不記得在本專案具體遇到了啥bug了,這么說在修身養性的同時,記憶力也有可能下降…所以這個環節就只能告一段落啦,我們下期再見,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248983.html
標籤:其他
上一篇:用撲克游戲操練List常用方法
下一篇:【題解】康娜的線段樹
