Created
August 31, 2012 11:23
-
-
Save aya-eiya/3551657 to your computer and use it in GitHub Desktop.
@singletonなマリオを機能付きEnumで実装してみた
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
abstract class Abs敵キャラ{ | |
String _name = "名無しさん" | |
@Override | |
public String toString(){ | |
return _name | |
} | |
} | |
interface Iマリオ行動 { | |
public Iマリオ行動 アイテムとる(Eアイテム アイテム) | |
public Iマリオ行動 敵に触れる(Abs敵キャラ 敵キャラ) | |
} | |
enum Eマリオ状態 implements Iマリオ行動 { | |
チビ , デカ , 無敵 , 死体 | |
private Abs敵キャラ マリオに触れた敵 | |
public Iマリオ行動 アイテムとる(Eアイテム アイテム){ | |
HashMap<Eアイテム,Eマリオ状態> アイテム効果テーブル = new HashMap<Eアイテム,Eマリオ状態>() | |
アイテム効果テーブル.put(Eアイテム.キノコ,デカ) | |
アイテム効果テーブル.put(Eアイテム.スター,無敵) | |
マリオに触れた敵 = null | |
return アイテム効果テーブル.get(アイテム) | |
} | |
public Iマリオ行動 敵に触れる(Abs敵キャラ 敵キャラ){ | |
HashMap<Eマリオ状態,Eマリオ状態> 接触効果テーブル = new HashMap<Eマリオ状態,Eマリオ状態>() | |
接触効果テーブル.put(チビ,死体) | |
接触効果テーブル.put(デカ,チビ) | |
接触効果テーブル.put(無敵,無敵) | |
接触効果テーブル.put(死体,死体) | |
マリオに触れた敵 = 敵キャラ | |
return 接触効果テーブル.get(this) | |
} | |
public String どう(){ | |
switch(this){ | |
case チビ: | |
return "ちっちゃくなっちゃった!" | |
case デカ: | |
return "でっかくなっちゃった!" | |
case 無敵: | |
return (マリオに触れた敵!=null)?"${マリオに触れた敵}を倒した":"無敵になっちゃった!" | |
case 死体: | |
return "殺された……" | |
default : | |
return this.toString() | |
} | |
} | |
} | |
enum Eアイテム{ キノコ,スター } | |
@Singleton | |
class マリオ implements Iマリオ行動 { | |
private Eマリオ状態 状態 = Eマリオ状態.チビ | |
public boolean is状態 (Eマリオ状態 _状態){ | |
return _状態 == 状態 | |
} | |
@Override | |
public String toString(){ | |
return "${状態}マリオ" | |
} | |
public Iマリオ行動 アイテムとる(Eアイテム アイテム){ | |
println "${アイテム}とって" | |
状態 = 状態.アイテムとる(アイテム) | |
println 状態.どう() | |
return this | |
} | |
public Iマリオ行動 敵に触れる(Abs敵キャラ 敵キャラ){ | |
println "${敵キャラ}に触ったら" | |
状態 = 状態.敵に触れる(敵キャラ) | |
println 状態.どう() | |
return this | |
} | |
} | |
def myマリオ = マリオ.instance | |
def Abs敵キャラ myノコノコ = new Abs敵キャラ(){ {_name = "ノコノコ"} } | |
for( Eアイテム アイテム : [null,Eアイテム.キノコ,Eアイテム.スター] ){ | |
if(アイテム != null ) myマリオ.アイテムとる(アイテム) | |
println "(${myマリオ}が敵に触れ続けてみる)" | |
def i=0 | |
while(!myマリオ.is状態(Eマリオ状態.死体) && i<3 ){ | |
myマリオ.敵に触れる(myノコノコ) | |
i++ | |
} | |
println """⇒次 | |
""" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Javaっぽく書いているのはわざとです。