作者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