当前位置: 首页 > 知识库问答 >
问题:

Check4在java中的游戏错误是谁赢了,因为结果只是随机地替换,而不是当有人赢了时

冉高寒
2023-03-14

我做了一个check4的游戏,用户放置一个坐标,检查被下降到设置x坐标的底部。球员轮流,直到一个球员达到4个检查在一个连续,无论是水平,垂直或对角醇。这个游戏工作得很好,但出于某种原因,我不能让胜利者的方法正常工作。这并不是说它不起作用,我只是不能让比赛以正确的理由获胜,这似乎很随机。Ex-It不会打印__won,当X或O在一个行中得到4时,而是在游戏的随机会话中打印。

package lab_A;

import java.util.Arrays;
import java.util.Scanner;

public class Connect4_ex
{

    public static void main(String[] args)
    {
        Board();
    }

    public static void Board()
    {
        
        char turn = 'O';
        boolean win = false;

        char[][] board = new char[6][7];
        int k = 0;
        int z = 0;

        for(int i=0;i<6;i++)
        {
            for(int j=0;j<7;j++)
            {
                board[i][j] = ' ';
            }
        }

        do {
            if(k%2 == 1)
            {
                Scanner scan = new Scanner(System.in);
                System.out.println("enter x check");
                int x = scan.nextInt();
                System.out.println("enter y check");
                int y = scan.nextInt();

                if( x > 0 && x < 8 && board[0][x-1]==' ' && y > 0 && y < 7)
                {
                    int free;
                    for(free=0;free<6;free++){
                        if(board[free][x-1]!=' ') break;
                    }
                    board[free-1][x-1]='X';
                    System.out.println("Board : \n" + Arrays.deepToString(board).replace("], ", "]\n "));
                    k++;
                }else{
                    System.out.println("your check is out of bounds");
                }
            }

            if(k%2 == 0)
            {
                Scanner scan = new Scanner(System.in);
                System.out.println("enter x check");
                int x = scan.nextInt();
                System.out.println("enter y check");
                int y = scan.nextInt();

                if( x > 0 && x < 8 && board[0][x-1]==' ' && y > 0 && y < 7)
                {
                    int free;
                    for(free=0;free<6;free++){
                        if(board[free][x-1]!=' ') break;
                    }
                    board[free-1][x-1]='O';
                    System.out.println("Board : \n" + Arrays.deepToString(board).replace("], ", "]\n "));
                    k++;
                }else{
                    System.out.println("your check is out of bounds");
                }
                
                
            }
            
            win = Winner(turn,board);
            
            if(turn == 'O') {
                turn = 'X';
            }else {
                turn = 'O';
            }
            
        }while(win == false);
        

        if(win) {
            if(turn =='O') {
                System.out.println("O won");
            }else {
                System.out.println("X won");
            }   
        }else {
            System.out.println("game is a Tie");
        }
                
    }
        
        public static boolean Winner(char turn, char[][] board){
            

            for(int i = 0; i<board.length; i++){
                for (int j = 0;j < board[0].length - 3;j++){
                    if (board[i][j] == turn   && 
                        board[i][j+1] == turn &&
                        board[i][j+2] == turn &&
                        board[i][j+3] == turn){
                        return true;
                    }
                }           
            }

            for(int i = 0; i < board.length - 3; i++){
                for(int j = 0; j < board[0].length; j++){
                    if (board[i][j] == turn   && 
                        board[i+1][j] == turn &&
                        board[i+2][j] == turn &&
                        board[i+3][j] == turn){
                        return true;
                    }
                }
            }

            for(int i = 3; i < board.length; i++){
                for(int j = 0; j < board[0].length - 3; j++){
                    if (board[i][j] == turn   && 
                        board[i-1][j+1] == turn &&
                        board[i-2][j+2] == turn &&
                        board[i-3][j+3] == turn){
                        return true;
                    }
                }
            }
            
            for(int i = 0; i < board.length - 3; i++){
                for(int j = 0; j < board[0].length - 3; j++){
                    if (board[i][j] == turn   && 
                        board[i+1][j+1] == turn &&
                        board[i+2][j+2] == turn &&
                        board[i+3][j+3] == turn){
                        return true;
                    }
                }
            }
            return false;
        }
    
        
  }


共有1个答案

宗乐池
2023-03-14

您有两个问题和一个奇怪(关于游戏):

问题

  1. k变量在k%2==1大小写中递增,这意味着k%2==0大小写在当前循环中执行,这意味着它永远不会在轮到x时检查获胜者。
  2. 当声明获胜者(win为true)时,代码立即更改turn,然后跳出循环并声明另一个玩家为获胜者。
    null
// if the "is odd" check fails then it must be even so just use else.
else // was if(k%2 == 0)
{
   //... continue
}
if (!win) {
    if(turn == 'O') {
        turn = 'X';
    }else {
        turn = 'O';
    }
}

建议的改进:

  1. 扫描输入的两个代码块之间唯一的区别是设置移动到当前玩家的一行。使其成为一个单独的方法,并传入播放器(char)并返回k:

拉出方法:

 // Validate move and update board and return true if valid.
 public static boolean applyMove(int x, char turn, char board[][]);

并像这样使用它:

if (applyMove(x,turn,board)) {
   k++;
}
 类似资料:
  • 我正在学习Javascript,并开始了第一个游戏项目:井字游戏。 我的项目及其代码:<b>井字游戏项目 如果用户在井字游戏中获胜,我希望能够显示通知。 现在,我只想测试我的“获胜”代码,说如果你在第一行写3个X,你就赢了: HTML: 我插入了一个带有id的空段落,它将专门用于显示通知 JS: 没用而且我觉得肯定是关于剧本里的执行顺序?或者需要一个环? 当我加载页面时,将3“X”放在第一行,然后

  • 玩家A和B以最佳方式玩游戏,交替移动。他们从1开始。每个玩家在他的回合中用[2,9]中的任何整数乘以当前数字。如果在轮到一名球员后,该数字大于或等于n,则他获胜。 A开始。给定n,谁赢了? 举个例子, 数字2,3…,9是中奖数字(玩家A会赢) 数字10,11,..,18是丢失的数字(玩家A将输) 19号,20号,..,162是中奖号码 获胜的策略是什么?如何应用斯普拉格-格伦迪定理来解决这个问题?

  • 1.自我介绍 2.最好的项目 3.用过tomcat吗,tomcat的目录 4.数组的分类set list map 5.linux的常用命令 6.数据库除了增删改查还用过那些,sql优化 7.会什么语言 8.接受加班吗

  • 问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由

  • 问题内容: 我正在尝试在Java中生成盐,以与用于安全密码存储的哈希算法配合使用。我正在使用以下代码创建随机盐: 这应该生成一个完全安全的,随机生成的盐,以用于我的哈希算法。但是,当我运行代码时,每次都会输出相同的盐…表示生成的盐根本不是随机的。 出于明显的安全性目的,每个用户都需要一个唯一的符号,但是如果我每次创建一个新帐户时都使用此代码,则每个用户都将具有相同的符号,这一开始就破坏了它的用途。

  • 我有一个JFrame,我使用它作为主要的JFrame,并在同一个JFrame中更改JPanels。第一个JPanel已经在JFrame中,所以我可以用“this.removeAll()then,this.setContentPane(new JPanel2)”来替换它,因为这里的“this”调用JFrame本身。 在另一个JPanel中,我希望创建一个JButton,用另一个JPanel替换当前的