2017-04-07 44 views
0

我刚写完游戏“Tic tac toe”的Java程序(我一直是java-编码一个多月,这是迄今为止我的第二大项目)。它工作正常,一切;我的问题更多的是“清理”我的代码。在代码中的主要动作是这样的大“而”循环,开始涉及这一丑恶声明:如何调用定义'while'循环以在'while'循环内定义'if'语句的条件

while (contains(player1Selections, winningArray1) && 
contains(player1Selections, winningArray2) && 
contains(player1Selections, winningArray3) && 
contains(player1Selections, winningArray4) && 
contains(player1Selections, winningArray5) && 
contains(player1Selections, winningArray6) && 
contains(player1Selections, winningArray7) && 
contains(player1Selections, winningArray8) && 
contains(player2Selections, winningArray1) && 
contains(player2Selections,winningArray2) && 
contains(player2Selections,winningArray3) && 
contains(player2Selections, winningArray4) && 
contains(player2Selections, winningArray5) && 
contains(player2Selections, winningArray6) && 
contains(player2Selections, winningArray7) && 
contains(player2Selections, winningArray8)) { 

为了澄清,我在这里检查,如果玩家1的坐标选择或数组列表玩家2的坐标选择的数组列表包含每个可能的胜利模式的八个硬编码的3元素长数组中的任何一个(我在我的布尔'contains'方法中将其转换为数组列表,因此我可以使用'containsAll'方法两个数组列表(我从一个堆栈溢出论坛获得这个想法,惊喜))。

顺便说一句,它需要提的是,我把我的“包含”方法了,这样包含(player1Selections,winningArray1)出来真正是时候不播放器1的选择的数组列表含有中奖阵列1的数组列表 - 这就是循环工作的原因(当一个玩家的选择包含一个获奖数组列表时,它会停止)。 (对不起,关于令人困惑的名字。)

那么我的问题是什么?我的问题是,当玩家1或玩家2获胜时,我需要“玩家[x]胜利!”在最后一张纸板印出之前出现,显示出最后一张纸牌和十字架的位置(并且当有一张平局时,我需要在最后一张纸板印出之前出现“抽签”一词),以及我拥有的方式解决了这是超级混乱。循环的主要部分由这样的代码:

if (togglePlayer == 0) { 
    if (n1 == 0 && n2 == 0) { 
    if (coordinate00.equals(" ")) { // coordinate00 is a string 
    coordinate00 = "X"; 
    player1Selections.add(0.0);   //the hard-coded winning-arrays consist of doubles in this format 
    togglePlayer ++;}     
    else { System.out.println("Position already occupied."); } 
    }     // this is closing the second 'if' statement but not the first, which gets closed only before I start writing out similar stuff for player 2 

这里是我已经把循环的最后一部分中(像上面的所有语句后),为解决我的问题:

if (contains(player1Selections, winningArray1) && 
    contains(player1Selections, winningArray2) && 
    contains(player1Selections, winningArray3) && 
    contains(player1Selections, winningArray4) && 
    contains(player1Selections, winningArray5) && 
    contains(player1Selections, winningArray6) && 
    contains(player1Selections, winningArray7) && 
    contains(player1Selections, winningArray8) && 
    contains(player2Selections, winningArray1) && 
    contains(player2Selections,winningArray2) && 
    contains(player2Selections,winningArray3) && 
    contains(player2Selections, winningArray4) && c 
    contains(player2Selections, winningArray5) && 
contains(player2Selections, winningArray6) && 
    contains(player2Selections, winningArray7) && 
    contains(player2Selections, winningArray8)) { 
     if ((!coordinate00.equals(" ")) & (!coordinate10.equals(" ")) & 
     (!coordinate20.equals(" ")) & (!coordinate01.equals(" ")) & 
     (!coordinate11.equals(" ")) & 
    (!coordinate21.equals(" ")) & (!coordinate02.equals(" ")) & 
    (!coordinate12.equals(" ")) & (!coordinate22.equals(" "))) { 
     System.out.println("Draw"); 
     System.out.println("\n" + coordinate00 + "|" + coordinate10 + "|" + coordinate20 + "\n" + "-----" + "\n" + coordinate01 + "|" + coordinate11 + "|" + coordinate21 + "\n" +"-----" + "\n" + coordinate02 + "|" + coordinate12 + "|" + coordinate22 + "\n"); 
     return; 
    } 
    else { System.out.println("\n" + coordinate00 + "|" + coordinate10 + "|" + coordinate20 + "\n" + "-----" + "\n" + coordinate01 + "|" + coordinate11 + "|" + coordinate21 + "\n" +"-----" + "\n" + coordinate02 + "|" + coordinate12 + "|" + coordinate22 + "\n"); 

显然,关于这个代码最后一位真正愚蠢的事情是,我已经从字面上不得不重复的逐字“而”循环条件,我的“如果”语句,即使“如果”声明仍然在'while'循环内部。我不得不这样做,因为我无法找到更简洁的方法来确保程序只在游戏未结束时才打印棋盘。

现在,我对如何减少这个问题有了一个想法,但我不知道它是否可能......基本上,我只是想知道是否有任何方法可以“ 'while'循环条件,而不是再次写出'if'语句。我想说'这个if语句的条件与仍然有效的'while'循环完全相同。

这个问题可能是无法回答的,但知道这是不可能的事情也是有用的。

+2

您可以创建一个函数来测试所有这些条件,并返回true或false。 – Shadow

+0

“*我刚写完一个Java程序...... *”这个Java或JavaScript也是如此? – RobG

+0

使您的条件功能大列表 –

回答

0

通过“winningArray8”数组列表来制作您的“winningArray1”。我们称之为“赢得移动”列表。如果player2selections是你自己的自定义类,你可以添加一个“contains”函数遍历整个列表。然后,你的循环会看起来更像:

while (player1Selections.contains(winningMoves) 
    || player2Selections.contains(winningMoves)) { ... } 

一些棋盘游戏可以由代表董事会作为一个单一的字符串,然后使用字符串操作,如board.contains(" ")而不是拼写出每个坐标被简化。