2011-06-16 62 views
0

我最近写了一个Java扑克牌游戏,有一个叫做类游戏中所有的游戏逻辑写的一种方式。在可能的情况下,我尽量让所有的GUI处理都在这个类之外。我现在正在尝试将此游戏转换为Android应用程序。有没有确定是否“主要”是Android或Java的

内playAutomaticTurn()方法(通过Android的活动和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(); 

感谢您提供任何帮助和建议。

回答

4

闪亮大量的在你的代码if s的不好的做法,我建议创建接口(S),其捕获特定于平台的行为,像

interface SoundService { 
    playSound(/* ... */); 
} 

这样,你可以创建你的接口的多个实现,包括一个简单的NoOp实现懒惰的,并且具有非常鉴于地方所有的平台特定的代码。

+1

比我的答复:) +1 – Blundell 2011-06-16 15:36:16

+0

@Blundell你已经被授予我个人的体育道德徽章:-) – Waldheinz 2011-06-16 15:38:28

+0

谢谢大家更好。目前,我已经采取了“无视这个问题,直到后来办法”和remmed的SoundEffect中的命令了,但它看起来像我会回来的接口方法后。 – 2011-07-09 10:11:54

0

瞎猜

你可以使用反射来进行布尔为只适用于Android的库:

  boolean isAndroid = false; 
      try { 
        Context.class.getMethod("getApplicationContext", null); 
        isAndroid = true; 
      } catch (NoSuchMethodException e) { 
        isAndroid = false; 
      } catch (Exception e) { 
        isAndroid = false; 
      } 
0

使用Waldheinz和布伦德尔想法,我们可以创建基本的工厂模式,我们可以看到游戏不需要了解平台依赖性......而且所有Sound对象的初始化都是在工厂完成的,并且决定创建什么样的对象将是工厂的决定......并且Blundell的方法可以用于相同的工作 请查找示例工厂模式代码http://www.devdaily.com/java/java-factory-pattern-example

相关问题