2011-01-24 2 views
0

Я делаю программу 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 
+0

Независимо от вашего вопроса, вы можете захотеть переписать этот код, чтобы устранить необходимость в переменных 'pick1',' pick2', ..., 'pick9'. Если вы когда-либо находите себе набор переменных, которые выглядят так, вы почти всегда можете переписать его, используя массив, как в 'int [] pick = new int [9]'. Это позволяет вам получить доступ ко всем значениям как 'pick [0]', ..., 'pick [8]', но что более важно, это позволяет вам программно создавать индексы. Это может позволить вам сжать свой оператор 'switch' до нескольких строк кода, если вы готовы потратить время. – templatetypedef

+0

Пожалуйста, исправьте форматирование –

+0

Несколько советов, r1-r9, pick1-pick9, вместо этого используйте массивы, то же самое с вашими cs, измените их на массив строк и запустите их так, как это c [0] = "741"; – hhafez

ответ

2

Вы действительно должны получить некоторые из этого кода из функции main.

В частности, я бы поставил весь цикл игры в отдельную функцию, возможно, вызвал playGame(), который содержит логику игры, проверку победителя и т. Д., И либо возвращает победителя, либо просто печатает победителя и возвращает недействительным.

Тогда основная функция может поместить вызов в playGame() в цикле, а в конце цикла спросить пользователя, хочет ли он/она снова играть.

В общем, вы хотите, чтобы каждая функция выполняла одна логическая задача. Вы отлично справились с переездом checkWinner, теперь делайте то же самое с другим кодом.

Если вам нужна помощь в вопросе «попросить пользователя о воспроизведении снова», оставьте комментарий, и я сделаю для этого изменение.

1
quick and dirty pseudo-code - not modular 

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

Вещи были бы более понятными с более кратким основным методом. Действительно быстрый и грязный способ заключается в том, чтобы скопировать все в вашем основном методе в новый метод и просто вызвать этот метод из основного и когда пользователь решит начать новую игру.

+0

, но тогда как насчет того, когда второй конец игры – Blackiey

+0

по существу, цель состоит в том, чтобы иметь похожий на так называемый игровой цикл. У вас есть метод playGame(), который инициализирует ваши значения, печатает доску и т. Д. Назовите это из основного. Как только игра закончена, вы спросите пользователя, что делать дальше. Чтобы это было просто, вы можете использовать чтение объекта Scanner из System.in. Когда они дадут вам ответ, если они скажут, что игра снова, вы возвращаетесь назад к playGame и начинаете все заново. Вторая игра ничем не отличается от первой, или третьей, и т. Д. Пока вы вызываете playGame(), вы в основном начинаете свежие. – awestover89

1

Даже грязнее, чем метод do-while. В конечном итоге это приведет к переполнению стека.

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

+1 для самого простейшего простейшего кода. Я чувствую себя как стирка после прочтения этого. –

+0

это будет, если вы играете достаточно. –

+0

@ Амир Афгани это не то, что говорит мое второе предложение? – ILMTitan

1

С текущим макетом программы нет «чистого» способа достижения этого. Вот некоторые конструктивная критика:

  • Ваш главный метод должен быть только Bootstrapper

Вы должны только инициализировать программу в методе main. Следовательно, попробуйте иметь способ делая только предмет. В вашем дизайне теперь есть игровое меню и основной цикл игры внутри того же метода.

Ваш игровой цикл может выглядеть следующим образом:

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 
  • Variable злоупотребления

Вместо инициализации многих переменных, возможно (как и другие предложили), вы можете использовать массивы или, более конкретно, двумерный массив.

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; 

Вот оно!


Кроме того, с помощью 0 к 9 может быть хорошо, чтобы идентифицировать ячейки сетки, тем не менее, как входное значение не , что интуитивным для игрока. Например, многие игры (шахматы, шашки, LOA и т. Д.) И приложения (Excel, Calc и т. Д.) Используют систему Algebraic chess notation. Преобразование обозначений в x и y очень простое. Например:

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"); 
    } 
} 

Не чувствуйте себя обескураженным! Мы все начинаем где-то! :)

Смежные вопросы