作者PsMonkey (痞子軍團團長)
看板java
標題Re: 打地鼠
時間Sat Dec 31 18:07:31 2005
※ 引述《[email protected] (習慣與應付)》之銘言:
: 請問要作一個類似打地鼠的程式
: 他的邏輯程序到底該怎樣呢~~>"<
: 完全沒頭緒
: 關於如何地鼠何時出現
: 又要如何控制它出現的時間
: 又要如何控制當我點到正確的位置時他會消失
: 那地鼠所在的位子固定的話
: 那是不是就控制它出現的時機就好呢
: 可是如果位置固定
: 我要如何判斷滑鼠點的位子是正確的呢
: 整各邏輯好亂喔~~>"<
還是沒案子可以寫,所以拿這個來練打字一下
(否則對不起手上的 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