我最近写了一个Java扑克牌游戏,所有游戏逻辑都写在一个名为Game的Class中。在可能的情况下,我尝试将所有GUI处理保留在此类之外。我现在正在尝试将此游戏转换为Android应用程序。
在playAutomaticTurn()方法(由Android Activity和Java桌面应用程序使用)中,如果计算机玩家希望宣布他们已经赢了,我会在游戏中调用另一种方法。这会使用我创建的SoundEffect类(使用javax.sound.sampled。*库)播放依赖于结果的两种声音效果。
而不是完全重写代码以将声音效果移回到调用方法(我想我必须从我的announceWin()方法返回一个状态,然后从playAutomaticTurn()返回它是否有一个简洁确定主要调用应用程序是否为Android的方法?
通过这种方式,我可以使用if或case语句并以不同的方式处理声音效果?
E.g。
if (androidApp) {
playAndroidSoundEffect
} else {
playJavaxSoundEffect();
}
或者是在类的开头创建常量声明并使用Java和Android版本的不同值编译它的唯一方法吗?
E.g。为Android编译版本(尚未实现Android声音)
private static final boolean SOUND = false;
//...
if (SOUND)
playJavaxSoundEffect();
感谢您提供的任何帮助和建议。
答案 0 :(得分:4)
代码周围闪烁大量if
是不好的做法,我建议创建捕获平台特定行为的接口,例如
interface SoundService {
playSound(/* ... */);
}
通过这种方式,您可以创建接口的多个实现,包括惰性的简单NoOp
实现,并在非常查看的位置具有所有特定于平台的代码。
答案 1 :(得分:0)
在黑暗中拍摄
你能否使用反射为只在android中提供的库做一个布尔值:
boolean isAndroid = false;
try {
Context.class.getMethod("getApplicationContext", null);
isAndroid = true;
} catch (NoSuchMethodException e) {
isAndroid = false;
} catch (Exception e) {
isAndroid = false;
}
答案 2 :(得分:0)
使用Waldheinz和Blundell的想法,我们可以创建基本的工厂模式,我们可以看到游戏不需要了解平台依赖...并且所有Sound对象初始化都在工厂完成并决定要创建什么样的对象工厂的决定......而Blundell的方法也可以用于此 请查找示例工厂模式代码http://www.devdaily.com/java/java-factory-pattern-example