如何回归游戏?完成比赛后

时间:2011-01-24 22:21:36

标签: java

我正在做一个TicTacToe计划,唯一缺少的部分是让用户选择是退出游戏还是重播。我无法找到回归游戏的方法。

import java.io.*;

public class Expierment
{
        static char c1 [] = new char[10];
        static char c2 [] = new char[10];
        static char c3 [] = new char[10];
        static char p1;
        static char p2;
        static boolean gameOver = false;
        public static void main(String args[])
        {
            int counter = 0;
            int p1Wins = 0;
            int p2Wins = 0;
            int r1 = 0;
            int r2 = 0;
            int r3 = 0;
            int r4 = 0;
            int r5 = 0;
            int r6 = 0;
            int r7 = 0;
            int r8 = 0;
            int r9 = 0;
            int pick1 = 0;
            int pick2 = 0;
            int pick3 = 0;
            int pick4 = 0;
            int pick5 = 0;
            int pick6 = 0;
            int pick7 = 0;
            int pick8 = 0;
            int pick9 = 0;
            char turn = 'X';
            int choice = menu();
            switch(choice)
            {
                case 1:
                    System.out.println("The game is called 'Tic-Tac-Toe', you should have known it. If you don't, search it.")  ;
                case 2:
                    gameOver = false;
                    break;
                case 3:
                    System.out.println("\nSee you next time !!");
                    return;
                default:
                    System.out.println("\nYou hit the wrong key......\n");
                    return;
            }//end of switch
            System.out.println("\nPlayer 1 initials ?");
            String n1 = GCS();
            p1 = n1.charAt(0);
            System.out.println("\nPlayer 2 initials ?");
            String n2 = GCS();
            p2 = n2.charAt(0);
            c1[2]='1';
            c2[2]='2';
            c3[2]='3';
            c1[1]='4';
            c2[1]='5';
            c3[1]='6';
            c1[0]='7';
            c2[0]='8';
            c3[0]='9';
        printBoard ();
        while(gameOver!=true)
        {
            System.out.println("Which spot ?");
            int pick = Integer. parseInt(GCS());
                switch (pick)
            {
                case 1:
                    if (r1<1)
                {
                    c1[2] = turn;
                    r1++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;                  
                case 2:
                    if (r2<1)
                {
                    c2[2] = turn;
                    r2++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;                  
                case 3:
                    if (r3<1)
                {
                    c3[2] = turn;
                    r3++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                case 4:
                    if (r4<1)
                {
                    c1[1] = turn;
                    r4++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                case 5:
                    if (r5<1)
                {
                    c2[1] = turn;
                    r5++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                case 6:
                    if (r6<1)
                {
                    c3[1] = turn;
                    r6++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                case 7:
                    if (r7<1)
                {
                    c1[0] = turn;
                    r7++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                case 8:
                    if (r8<1)
                {
                    c2[0] = turn;
                    r8++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                case 9:
                    if (r9<1)
                {
                    c3[0] = turn;
                    r9++;
                }
                else
                {
                    System.out.println("That column is full, pick another.\n");
                    continue;
                }
                    break;
                default:
                    System.out.println("Seriously?! Pick a possible spot.\n");
                    continue;
                }//end of switch
            if (turn=='X') turn = 'O';
            else turn = 'X';
            printBoard();
            if (checkWinner())
            {
                while(gameOver==true)
                {
                    int Echoice = EGM();
                    switch(Echoice)
                    {
                        case 1:
                            System.out.println("The game is called 'Tic-Tac-Toe', you should have known it. If you don't, search it.")  ;
                        case 2:
                            gameOver = false;
                            menu();

                            break;
                        case 3:
                            System.out.println("\nSee you next time !!");
                            return;
                        default:
                            System.out.println("\nYou hit the wrong key......\n");
                            return;
                    }//end of switch
                }//end of while true
                return;
            }
            counter ++;
            if (counter==9)
            {
                System.out.println("\n\nYou tied.\n");
                return;
            }
        }//end of while not true
    }//end of main

    public static boolean checkWinner()
    {
            for (int k=0; k<2; k++)
        {
            if ((c1[k]!=' ')&&(c1[k]==c2[k])&&(c1[k]==c3[k]))
            {
                System.out.println("\nYo " + c1[k] + " is the winner!\n");
                gameOver=true;
                return true;
            }//checks column 1-3 horizontally
        }//end of horizontal check

        for (int m=0; m<2; m++)
        {
            if((c1[m]!=' ')&&(c1[m]==c1[m+1])&&(c1[m+1]==c1[m+2])&&(c1[m]==c1[m+2]))
            {
                System.out.println("\nYo " + c1[m] + " is the winner!\n");
                gameOver=true;
                return true;
            }//checks column 1 vertically
            if((c2[m]!=' ')&&(c2[m]==c2[m+1])&&(c2[m+1]==c2[m+2])&&(c2[m]==c2[m+2]))
            {
                System.out.println("\nYo " + c2[m] + " is the winner!\n");
                gameOver=true;
                return true;
            }//checks column 2 vertically
            if((c3[m]!=' ')&&(c3[m]==c3[m+1])&&(c3[m+1]==c3[m+2])&&(c3[m]==c1[m+2]))
            {
                System.out.println("\nYo " + c3[m] + " is the winner!\n");
                gameOver=true;
                return true;
            }//checks column 3 vertically
                if ((c1[m]!=' ')&&(c1[m]==c2[m+1])&&(c1[m]==c3[m+2]))
            {
                System.out.println("\nYo " + c1[m] + " is the winner!\n");
                gameOver=true;
                return true;
            }//checks upward diagonal
                if ((c3[m]!=' ')&&(c3[m]==c2[m+1])&&(c3[m]==c1[m+2]))
            {
                System.out.println("\nYo " + c1[m] + " is the winner!\n");
                gameOver=true;
                return true;
            }
        }//end of vertical check
                return false;
    }//end of checkWinner

    public static void printBoard()
    {
        System.out.println("_______");
        for (int j = 2; j > -1; j--)
        {
            System.out.println("|" + c1[j] + "|" + c2[j] + "|" + c3[j] + "|");
            System.out.println("-------");
        }
    }//end of printBoard

    public static int menu()
    {
        System.out.println("Tic-Tac-Toe ~ Main Menu\n\n1. Instructions\n2. Play a 1 player game"+"\n3. Exit\n");
        int selection = Integer.parseInt(GCS());
        return selection;
    }//end of menu

    public static int EGM()
    {
        System.out.println("Tic-Tac-Toe ~ End of Game Menu\n\n1. Instructions\n2. Play again"+"\n3. Exit\n");
        int Eselection = Integer.parseInt(GCS());
        return Eselection;
    }

    public static String GCS()
    {
        int noMoreInput=-1;
        char enterKeyHit='\n';
        int InputChar;
        StringBuffer InputBuffer = new StringBuffer(100);

        try
        {
            InputChar=System.in.read();
            while(InputChar != noMoreInput)
            {
                if((char)InputChar !=enterKeyHit)
                {
                    InputBuffer.append((char)InputChar);
                }
                else
                {
                    InputBuffer.setLength(InputBuffer.length()-1);
                    break;
                }
                InputChar=System.in.read();
            }
        }
        catch (IOException IOX)
        {
            System.err.println(IOX);
        }
        return InputBuffer.toString();
        }//end of GCS
}//end of public class

5 个答案:

答案 0 :(得分:2)

你真的应该从main函数中获取一些代码。

具体来说,我将整个游戏循环放在一个单独的函数中,可能称为playGame(),其中包含玩游戏,检查获胜者等的逻辑,并返回获胜者或只是打印获胜者并返回无效。

然后main函数可以在循环中调用playGame(),并在循环结束时询问用户他/她是否想再次播放。

通常,您希望每个功能都执行一个逻辑任务。移动checkWinner已经做得很好,现在对其他一些代码执行相同的操作。

如果您在“要求用户再次播放”方面需要帮助,请发表评论,然后我会进行编辑以解决此问题。

答案 1 :(得分:1)

quick and dirty pseudo-code - not modular

do {    
   //everything in your main goes here
   .
   .
   .    
   playAgain = prompt the user
} while(playAgain);

答案 2 :(得分:1)

比do-while方法更脏。最终会导致堆栈溢出。

//your current main method
boolean playAgain = prompt the user
if(playAgain){
    main(args);
}

答案 3 :(得分:1)

使用当前的程序布局,没有“干净”的方法来实现它。以下是一些建设性的批评:

  • 您的主要方法应该只是一个引导程序

您应该只使用main方法初始化您的程序。因此,尝试 1 方法仅执行 1 事情。你现在设计的游戏菜单和游戏主循环都在同一个方法中。

您的游戏循环可能如下所示:

while still playing
   read input from user
   if game is active
      process game input
      update game
   else
      process menu input
      update menu

这样,你只需要为菜单或游戏开启game is active状态。等

您的GCS方法过于复杂,只需将其替换为:

Scanner scanner = new Scanner();     // put this somewhere at the class level (so it is reusable)
...
String input = scanner.nextLine();   // put this somewhere in a method reading an input
  • 可变滥用

可能(可能像其他人建议的那样)使用数组,或者更具体地说是二维数组,而不是初始化许多变量。

int grid[][] = new int[3][3];
// grid[0][0] points to the top-left cell, grid[2][2] points to the bottom right one

或者您可以使用单个int来存储所有内容;将您的网格表示为bit array

int grid = 0;   // empty grid
...
// set player move
grid |= (1 << (y*3)+x) << PLAYER_OFFSET;  // PLAYER_OFFSET: 0=player 1, 16=player 2
// reset (clear) player move
grid &= ~((1 << (y*3)+x) << PLAYER_OFFSET); // ...
// check if player move is set
boolean isSet = (grid >> ((1 << (y*3)+x) << PLAYER_OFFSET)) && 1;   // ...

为什么位阵列很酷?因为要检查玩家是否获胜,你不需要花哨的for..loop和其他复杂的算法,只需要对获胜模式进行验证......:

int pattern = 273; // test for diagonal from [0,0] to [2,2], or bits "100 010 001"
boolean isWinning = (grid && (pattern << PLAYER_OFFSET)) != 0;

就是这样!


此外,使用09可能很适合识别网格单元格,但是因为输入值不是 直观的玩家。例如,许多游戏(象棋,西洋跳棋,LOA等)和应用程序(Excel,Calc等)都在使用Algebraic chess notation系统。转换xy中的表示法非常简单。例如:

boolean cellPlayed = false;
while (!cellPlayed) {
   String cellStr = scanner.readLine().toLower();   // ex: "b2" for the center cell
   try {
      int gridx = cellStr.charAt(0) - 'a';   // ex: for "b2" should return 1
      int gridy = cellStr.charAt(1) - '1';   // ex: for "b2" should return 1

      grid(gridx][gridy] = playerValue;      // 1 for "player 1" and 2 for "player 2"
      cellPlayed = true;
   } catch (Exception e) {
      System.out.println("Error! Invalid input");
   }
}

不要气馁!我们都从某个地方开始! :)

答案 4 :(得分:0)

使用更简洁的主要方法可以更加清晰。真正快速和肮脏的方法是将main方法中的所有内容复制到一个新方法中,然后从主要方法调用该方法,并在用户选择开始新游戏时使用。