java 有人能帮助我在五子棋程序中的获胜场景吗?

j2cgzkjk  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(69)

我写了一个程序的任务,我们必须写一个简单的五子棋程序。我以为我已经拥有了一切,但当我编译并运行时,它会引发胜利的场景,即使我只有4个同类,即使它们并不相邻。(只有在一种情况下,如果有五个连续的X或O,它才应该引发胜利)。我觉得我应该在每回合之前把计数器重置为0,但我不确定我应该在哪里做。任何提示将不胜感激!

import java.util.Scanner;

public class Gomoku1
{
    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);

        char[][] map = new char [19][19];

        int row = 0;
        int column = 0;

        //fill game with dots
        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map[i].length; j++)
            {
                map[i][j] = '.';
            }
        }

        printMap(map);

        char player1Choice = 'X';
        char player2Choice = 'O';

        int [] place;
        while (true)
        {

            System.out.println("Player 1's turn!");
            place = userTurn(map, player1Choice);

            if (isValidMove(map, place[0], place[1]) == false)
            {
                System.out.println("Invalid move! Try again!");
                place = userTurn(map, player1Choice);
            }
            if (isValidMove(map, place[0], place[1])) {
                map[place[0]][place[1]] = player1Choice;
                printMap(map);
            }
            if (isBoardFull(map) == true)
            {
                System.out.println("Board is full. Tied game.");
                break;
            }

            if (hasPlayerWon(map, player1Choice) == true)
            {
                System.out.println("Player 1 Wins!");
                break;
            }

            else
            {

                System.out.println("Player 2's turn!: ");
                place = userTurn(map, player2Choice);

                //System.out.println(isValidMove(map, row, column));

                if (isValidMove(map, place[0], place[1]) == false)
                {
                    System.out.println("Invalid move! Try again!");
                    place = userTurn(map, player2Choice);
                }
                if (isValidMove(map, place[0], place[1])) {
                    map[place[0]][place[1]] = player2Choice;
                    printMap(map);
                }
                if (isBoardFull(map) == true)
                {
                    System.out.println("Board is full. Tied game.");
                    break;
                }
                if (hasPlayerWon(map, player2Choice) == true)
                {
                    System.out.println("Player 2 Wins!");
                    break;
                }
            }

        }
    }

    public static void printMap (char[][] map)
    {
        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map[i].length; j++)
            {
                System.out.printf("%2c", map[i][j]);
            }
            System.out.println();
        }
    }

    public static int [] userTurn (char[][] map, char playerChoice)
    {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter row: ");
        int row = input.nextInt();

        System.out.print("Enter column: ");
        int column = input.nextInt();

        int place [] = {row, column};
        return place;
    }

    public static boolean isValidMove (char[][] map, int row, int column)
    {
        //System.out.println ("n is valid move");
        if (row < 0 || row > 18 || column < 0 || column > 18 || map[row][column]=='O' || map[row][column]=='X')
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    public static boolean isBoardFull (char[][] map)
    {
        int openSpots = 0;
        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map.length; j++)
            {
                if (!(map[i][j]=='.'))
                    openSpots++;
            }
        }
        if (openSpots == 361)
        {
            return true;
        }
        return false;
    }

    public static boolean hasPlayerWon(char[][] map, int player)
    {
        if (isHorizontalWin(map, player) == true || isVerticalWin(map, player) == true || isDiagonalWin(map, player) == true)
        {
            return true;
        }
        return false;
    }

    public static boolean isHorizontalWin(char[][] map, int player)
    {
        int count = 0;

        int r;
        int c;


        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map.length; j++)
            {
                if (map[i][j]==(player))
                {
                    r = i;
                    c = j;
                    while (r >= 0 && r <= 18 && c >= 0 && c <= 18 && map[r][c] == player)
                    {
                        count ++;
                        r += 0;
                        c += 1;
                    }
                }
            }
        }
        if (count == 5)
        {
            return true;

        }
        return false;

    }

    public static boolean isVerticalWin(char[][] map, int player)
    {
        int count = 0;

        int r;
        int c;

        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map.length; j++)
            {
                if (map[i][j]==(player))
                {
                    r = i;
                    c = j;
                    while (r >= 0 && r <= 18 && c >= 0 && c <= 18 && map[r][c] == player)
                    {
                        count ++;
                        r += 1;
                        c += 0;
                    }
                }
            }
        }
        if (count == 5)
        {
            return true;

        }
        return false;

    }
    public static boolean isDiagonalWin(char[][] map, int player)
    {
        int count = 0;
        int r;
        int c;

        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map.length; j++)
            {
                if (map[i][j]==(player))
                {
                    r = i;
                    c = j;
                    while (r >= 0 && r <= 18 && c >= 0 && c <= 18 && map[r][c] == player)
                    {
                        count++;
                        r += 1;
                        c += 1;
                    }
                }
            }
        }
        if (count == 5)
        {
            return true;

        }
        return false;

    }

}
rryofs0p

rryofs0p1#

您在检查获胜条件的所有三个函数中都有问题:isHorizontalWinisVerticalWinisDiagonalWin。这三个变量都递增变量count,但这个变量永远不会被设置回零。此外,检查count == 5是否应该在循环内进行。下面是如何修复isHorizontalWin的示例:

public static boolean isHorizontalWin(char[][] map, int player)
    {
        int count = 0;

        int r;
        int c;

        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map.length; j++)
            {
                if (map[i][j]==(player))
                {
                    r = i;
                    c = j;
                    while (r >= 0 && r <= 18 && c >= 0 && c <= 18 && map[r][c] == player)
                    {
                        count ++;
                        r += 0;
                        c += 1;
                    }
                    if (count == 5)
                    {
                        return true;
                    } else {
                        count = 0;
                    }
                }
            }
        }
        return false;
    }
ztyzrc3y

ztyzrc3y2#

我知道已经有一段时间了...下面是我在任何方向上连续检测五个的尝试,但不是六个或更多的一部分。它是JavaScript,但你可以很容易地转换成Java。它更紧凑一些,在一个函数中完成所有工作,并带有两个辅助函数。它同时计算从x,y方向离开的两个方向上的连接石头。board[][]是一个简单的2D数组,Y值作为第一个索引。

const isWinningTurn = (x, y) => {
  let tests = [ [1, 0], [0, 1], [-1, 1], [1, 1] ];
  for (let i = 0; i < tests.length; i++) {
    let dx = tests[i][0];
    let dy = tests[i][1];
    const first = numMatches(x, y, dx, dy);
    const second = numMatches(x, y, -dx, -dy);
    let runLength = first.n + second.n + 1;
    if (runLength == 5) {
      return {'from' : {x:first.x , y:first.y} , 'to' : {x:second.x, y:second.y}};
      }
    }
  return false;
  };

const numMatches = (x, y, dx, dy) => {
  let i = 1;
  while (inBounds(x + i*dx, y + i*dy) && board[y + i*dy][x + i*dx] === board[y][x]) {
    i++;
  }
  return {'n' : i - 1, 'x' : x + i*dx - dx, 'y' : y + i*dy - dy};
};

const inBounds = (x, y) => {
  return (y >= 0 && y < board.length) && (x >= 0 && x < board[y].length));
};

相关问题