Re: 打地鼠

看板java作者 (痞子軍團團長)時間19年前 (2005/12/31 10:42), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ 引述《loun.bbs@inf.csie.thu.edu.tw (習慣與應付)》之銘言: : 請問要作一個類似打地鼠的程式 : 他的邏輯程序到底該怎樣呢~~>"< : 完全沒頭緒 : 關於如何地鼠何時出現 : 又要如何控制它出現的時間 : 又要如何控制當我點到正確的位置時他會消失 : 那地鼠所在的位子固定的話 : 那是不是就控制它出現的時機就好呢 : 可是如果位置固定 : 我要如何判斷滑鼠點的位子是正確的呢 : 整各邏輯好亂喔~~>"< 還是沒案子可以寫,所以拿這個來練打字一下 (否則對不起手上的 TaClick 阿) 抬頭看一下發信站台? [驚] 這就不好意思遞名片,問要不要作業外包了 [逃] 你的問題,有一些是 Java 技術的問題 有一些則是單純的邏輯問題... 我假設你的目標是這個遊戲,但是作某種程度的簡化 http://www.eyezmaze.com/tontie/v1/index.html (有個實品總是比較好說明...) 從地鼠開始想起... 在 eyezmaze 當中的地鼠有很多屬性 不過,我們意思意思就好,簡化成兩個屬性 血量、打到的得分 既然都搞了屬性了,當然就要多生幾種地鼠,增加豐富性 所以地鼠的類別大概就是 public class Shrew { private int hp; private int hitScore; private int missScore; private Shrew(int hpAmount, int hitS, int missS){ this.hp=hpAmount; this.hitScore=hitS; this.msiiScore=missS; } public static Shrew aShrew(){ return new Shrew(1, 100, 25); } public static Shrew aBigShrew(){ return new Shrew(2, 200, 25); } //高興的話,可以多生幾種地鼠 //下面省略 getter //當地鼠被打到的時候,要扣 hp public void hit(int amount){ this.hp -= amount; } } 地鼠準備好了,接下來就是想 "洞" 要怎麼搞 洞要負責 "生" 出地鼠,時間到了要把地鼠藏起來,然後扣分 另外還要承受攻擊,如果玩家亂打沒地鼠的洞要給他懲罰性的扣分 萬一 (?) 地鼠被打到 hp 小於 1,還要幫他收屍 當然還免不了要提供一些狀態資訊 例如現在的地鼠是哪一隻... etc 所以,洞的類別大概是長成這樣子: public class Hole { private Shrew shrew; private int showTime; public Hole(){} public void createShrew(int race, int showT){ shrew = Shrew.newShrew(race); showTime = showT; } public int receiveShot(int amount){ if(shrew!=null){ shrew.hit(amount); if(shrew.getHp()<1){ int score = shrew.getHitScore(); shrew = null; return score; }else{ return 0; } }else{ return Parameter.Disorder_Penalty; } } public int cycleProcess(){ if(shrew!=null){ showTime--; if(showTime==0){ int score = -1 * shrew.getMissScore(); shrew=null; return score; } } return 0; } public Shrew getShrew(){ return shrew; } } 有了洞,接下來要想的是遊戲機台的設計 機台要有一個屬性,就是紀錄玩家的狀態 就算只打算紀錄分數,不過還是包成一個物件 這樣子哪天要擴充的話,寫起來會比較... 快樂? 當然,還要有一個屬性,就是洞 因為洞有很多個,所以我就開一個陣列來存 我想,讓機台每 x 秒算一個回合 每回合自動決定某個空的洞是不是要有地鼠冒出來 以及檢查有地鼠的洞,是不是該讓地鼠回家安養天年 既然這樣子,就偷偷用 java.util.Timer 來作這件事情 省時又省力 \囧/ 最後,就是要有一個 method,讓使用者打機台 整個程式碼,大概長成這樣 import java.util.Timer; import java.util.TimerTask; public class PlatForm { private Hole hole[]; private Player player; private Timer timer; private int cycleLength; public PlatForm(Player p, int holeAmount){ this.player = p; this.hole = new Hole[holeAmount]; initHole(); } public void start(){ TimerTask cycleTask = new TimerTask(){ public void run() { cycleRoutine(); } }; cycleLength=500; timer = new Timer(); timer.scheduleAtFixedRate(cycleTask, 0, cycleLength); } private void cycleRoutine() { for(int i=0; i<hole.length; i++){ if(hole[i].getShrew()==null){ callShrewToWorkAtHole(i); }else{ player.setScore( player.getScore()+hole[i].cycleProcess() ); } } } public void fireInTheHole(int i, int amount){ player.setScore( player.getScore()+hole[i].receiveShot(amount) ); } private void callShrewToWorkAtHole(int i) { //這是會讓玩家噴血的寫法 //實際上要依現況調整地鼠出現的機率 double ratio = Math.random(); if(ratio>0.9){ hole[i].createShrew(Shrew.BIG, 6); return; } if(ratio>0.5){ hole[i].createShrew(Shrew.NORMAL, 6); return; } } private void initHole() { for(int i=0; i<hole.length; i++){ this.hole[i]=new Hole(); } } public Hole[] getHole() { return hole; } public void stop() { timer.cancel(); } } 這些寫好之後,剩下來的就是畫面的製作 你用 JButton 來實作也好 用 Graphic 刻畫面也好 只要將玩家的操作,作一個 mapping 到 index 然後呼叫 PlatFrom.fireInTheHole() 就輕鬆自在啦... 後頭就不寫了... 整個寫下來,堪玩的版本大概三個小時就能生出來啦... ===== 學弟想聽現場版的話,可以在禮拜二來上最後一次計概輔導 哈哈哈... [逃] -- 侃侃長論鮮窒礙 http://www.psmonkey.idv.tw 眾目睽睽無心顫 telnet://legend.twbbs.org 煢居少聊常人事 殺頭容易告白難 拜託不要,我對女案主過敏 \囧/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.204.16.17
文章代碼(AID): #13jV0Bzx (java)
文章代碼(AID): #13jV0Bzx (java)