【问题标题】:String is overlapping another string字符串与另一个字符串重叠
【发布时间】:2012-12-08 21:19:18
【问题描述】:

我知道我的代码有点乱,但我会尽可能详细。该代码正在创建一个井字游戏。我正在使用一个数组来创建游戏板,即 gameBoard()。用户始终为 X,而计算机始终为 O。我为用户输入和计算机输入创建了 if 语句,不同之处在于,计算机从 java.util.Random 获取其编号。 if 语句获取用户的输入并在指定的板上打印一个 X,与计算机相同。这里的问题是当随机生成器选择一个已经存在 X 的空间时,它会重叠,反之亦然。我需要程序偷偷告诉计算机生成另一个随机数。如果你能帮上忙就太好了。抱歉,描述得太大了。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Random;

public class TicTacToeGame {

static String arrayPicture[][]; //Array is universal so we can include it into any method
static int userInput;
static boolean validInput = false;
static String name;

public static void main (String[] args) throws IOException {

    System.out.println ("Please enter your name:");
    name = gameStart("");

    arrayPicture = new String [13][13];

    for (int i = 0; i < 13; i ++) {

        for (int j = 0; j < 13; j  ++) {
            arrayPicture [i][j] = " "; //Print spaces into the array
        }   
    }       

    while (validInput == false) {

        validX();

        cpuPlacement();

        System.out.println ("Computer, please enter your number");
        validInput = false;
    }       
}//main

public static void verticalLine (int x1, int y1, int x2) {

    for (int k = x1; k < x2; k ++) {
        arrayPicture [y1][k] = "|"; //if y1 and k are present, print a vertical line in the array
    }       
}//verticalLine

public static void horizontalLine (int x1, int y1, int x2) {
    for (int k = x1; k < x2; k ++) {
        arrayPicture [y1][k] = "-"; //if y1 and k are present, print a dash in the array
    }       
}//horizontalLine

public static void printArray () {
    for (int i = 0; i < 13; i ++) {

        for (int j = 0; j < 13; j ++) {
            System.out.print (arrayPicture[i][j]);
        }   
        System.out.println();
    }       
}//printArray

public static String gameStart (String input) throws IOException { 

        boolean validInput = false;

        BufferedReader userInput = new BufferedReader (new InputStreamReader(System.in));

        while (validInput == false) {
            input = userInput.readLine();
            validInput = true;

                System.out.println ("The name of the game is TicTacToe, you will always be the letter X.");
                System.out.println ("Please choose the coordinates you wish. The coordinates are where your X will be placed on the game board.");

        }
        return input;
}

public static void validX () throws IOException {

    gameBoard();

    String input = null;

    System.out.println (name + ", please enter your number");

        try {
            BufferedReader columnNumber = new BufferedReader (new InputStreamReader(System.in));//BufferedReader variable where the user will input their answer
            input = columnNumber.readLine();
            userInput = Integer.parseInt (input);
            validInput = true;
            userPlacement();
            //If an exception is present, the try sends it to catch.
            //Ex. If the user in\puts "bob has a cat" the try will find an exception and immediately send it to the catch statement
        }
            catch (NumberFormatException ex) {
            System.out.println ("Invalid input, please enter a number.");
            validInput = false;
        }

        if (userInput == 1) {
            userInputX (2, 2, 3);
        }
        else if (userInput == 2) {
            userInputX (6, 2, 7);
        }
        else if (userInput == 3) {
            userInputX (10, 2, 11);
        }
        else if (userInput == 4) {
            userInputX (2, 6, 3);
        }
        else if (userInput == 5) {
            userInputX (6, 6, 7);
        }
        else if (userInput == 6) {
            userInputX (10, 6, 11);
        }
        else if (userInput == 7) {
            userInputX (2, 10, 3);
        }
        else if (userInput == 8) {
            userInputX (6, 10, 7);
        }                               
        else if (userInput == 9) {
            userInputX (10, 10, 11);
        }
}

public static void cpuinputO (int x1, int y1, int x2) throws IOException {

    gameBoard();

    for (int k = x1; k < x2; k ++) {
        arrayPicture [y1][k] = "O"; //if y1 and k are present, print a dash in the array
    }
}

public static void userInputX (int x1, int y1, int x2) {

    for (int k = x1; k < x2; k ++) {
        arrayPicture [y1][k] = "X"; //if y1 and k are present, print a dash in the array
    }
}

public static void userPlacement () throws IOException {

    if (userInput == 1) {
        userInputX (2, 2, 3);
    }
    else if (userInput == 2) {
        userInputX (6, 2, 7);
    }
    else if (userInput == 3) {
        userInputX (10, 2, 11);
    }
    else if (userInput == 4) {
        userInputX (2, 6, 3);
    }
    else if (userInput == 5) {
        userInputX (6, 6, 7);
    }
    else if (userInput == 6) {
        userInputX (10, 6, 11);
    }
    else if (userInput == 7) {
        userInputX (2, 10, 3);
    }
    else if (userInput == 8) {
        userInputX (6, 10, 7);
    }                               
    else if (userInput == 9) {
        userInputX (10, 10, 11);
    }
}

public static void cpuPlacement () throws IOException {

    Random random = new Random();
    int cpuCoordinates = random.nextInt(10);
    System.out.println (cpuCoordinates);
    boolean validInput0 = false;

    if (validInput0 == true) {

        if (cpuCoordinates < 1) {
            validInput0 = false;
        }
    }
    else if (cpuCoordinates == 1) {
        cpuinputO (2, 2, 3);
    }
    else if (cpuCoordinates == 2) {
        cpuinputO (6, 2, 7);
    }
    else if (cpuCoordinates == 3) {
        cpuinputO (10, 2, 11);
    }
    else if (cpuCoordinates == 4) {
        cpuinputO (2, 6, 3);
    }
    else if (cpuCoordinates == 5) {
        cpuinputO (6, 6, 7);
    }
    else if (cpuCoordinates == 6) {
        cpuinputO (10, 6, 11);
    }
    else if (cpuCoordinates == 7) {
        cpuinputO (2, 10, 3);
    }
    else if (cpuCoordinates == 8) {
        cpuinputO (6, 10, 7);
    }                               
    else if (cpuCoordinates == 9) {
        cpuinputO (10, 10, 11);
    }
}

public static void gameBoard () throws IOException {
    System.out.println (" ");
    horizontalLine (1, 0, 4);  horizontalLine (5, 0, 8);  horizontalLine (9, 0, 12);
    verticalLine (0, 1, 1);  verticalLine (4, 1, 5);  verticalLine (8, 1, 9);  verticalLine (12, 1, 13);
    verticalLine (0, 2, 1);  verticalLine (4, 2, 5);  verticalLine (8, 2, 9);  verticalLine (12, 2, 13);
    verticalLine (0, 3, 1);  verticalLine (4, 3, 5);  verticalLine (8, 3, 9);  verticalLine (12, 3, 13);
    horizontalLine (1, 4, 4);  horizontalLine (5, 4, 8);  horizontalLine (9, 4, 12);
    verticalLine (0, 5, 1);  verticalLine (4, 5, 5);  verticalLine (8, 5, 9);  verticalLine (12, 5, 13);
    verticalLine (0, 6, 1);  verticalLine (4, 6, 5);  verticalLine (8, 6, 9);  verticalLine (12, 6, 13);
    verticalLine (0, 7, 1);  verticalLine (4, 7, 5);  verticalLine (8, 7, 9);  verticalLine (12, 7, 13);
    horizontalLine (1, 8, 4);  horizontalLine (5, 8, 8);  horizontalLine (9, 8, 12);
    verticalLine (0, 9, 1);  verticalLine (4, 9, 5);  verticalLine (8, 9, 9);  verticalLine (12, 9, 13);
    verticalLine (0, 10, 1); verticalLine (4, 10, 5);  verticalLine (8, 10, 9);  verticalLine (12, 10, 13);
    verticalLine (0, 11, 1); verticalLine (4, 11, 5);  verticalLine (8, 11, 9);  verticalLine (12, 11, 13);
    horizontalLine (1, 12, 4);  horizontalLine (5, 12, 8);  horizontalLine (9, 12, 12);
    printArray ();

 }//gameBoard
}//public class

【问题讨论】:

    标签: java arrays string tic-tac-toe


    【解决方案1】:

    我不太确定您的代码中发生了什么(您为什么要在井字游戏的 13×13 数组中循环?)但这应该是一个简单的解决方法。最简单的解决方法是在 CPU 放置代码周围添加一个 while 循环,而不是当前的 if/else-if 语句。 (if/else-ifs 应该在 while 循环内。)当找到一个有效的位置时,

    while(validInput0==false){
        if(cpuCoordinates == 1){
            if(squareOneOwner == null){
                squareOneOwner = "CPU"
                validInput0 = true;
            }
        }else if(...){
            ...
        }
        if(validInput0 == false){
            cpuCoordinates = random.nextInt(10);
        }
    }
    

    等等。这使您可以检查计算机是否瞄准的方格,并且仅在当前为空时才认领它。它需要在其他地方进行一些更改,但它们很简单。如果上一次尝试无效,最后一个 if 语句将重新滚动到下一个循环。

    【讨论】:

    • 我的老师给我看了一个井字棋示例。我试着做,但参数必须是 13 x 13。这很有帮助,非常感谢。
    • 很高兴我能提供帮助,但您绝对应该考虑 Bryan Glazer 的回答。他提议的重组很有意义。
    【解决方案2】:

    我认为您的代码需要进行一些重组。

    在我看来,您应该将 cpu 和播放器创建的条目存储到 2d int 数组中。计算机可以用1s 表示,玩家可以用2s 表示。空方格由0s 表示。

    然后您可以使用嵌套的 for 循环遍历此数组以绘制游戏板。

    int[][] game_board = new int[3][3]
    
    for(int i = 0; i < 3; i++)
    {
      for(int j = 0; j < 3; j++)
      {
         if(game_board[i][j] == 1)
            ...code to print an X...
         if(game_board[i][j] == 2)
            ...code to print an O...
         if(game_board[i][j] == 0)
            ...code to print some spaces...
    
         ...code to print a vertical line...
      }
    
      ...code to print a horizontal line...
    }
    

    当电脑或玩家做出选择时,您只需检查game_board 在那个位置是否为0,如果不是,则必须做出另一个选择。

    choice_x = ...user or computer chooses an x location...
    choice_y = ...user or computer chooses a  y location...
    
    if(game_board[choice_x][choice_y] != 0)
    {
        ...choose again...
    }
    else
    {
        if( player is choosing ) 
            game_board[choice_x][choice_y] = 1 
        if( computer is choosing )
            game_board[choice_x][choice_y] = 0
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 2011-08-31
      • 2012-12-16
      • 2020-09-03
      • 2021-12-06
      • 1970-01-01
      • 2013-01-20
      • 2015-07-10
      • 2013-03-04
      相关资源
      最近更新 更多