简体   繁体   English

试图从“主菜单”类调用方法但它被卡住了,但是当从方法类调用时它工作完美

[英]Trying to call a method from a "main-menu" class but it is stuck, however when called from the methods class it works perfect

For a coding challenge, I decided to make the game battleship.为了应对编码挑战,我决定制作游戏战舰。 However, when calling the runGameAgainstAi() method, it refuses to work and simply draws the grid instead of allowing functionality, It may be stuck in the while loop but I have been unable to pinpoint the exact issue.然而,当调用 runGameAgainstAi() 方法时,它拒绝工作并简单地绘制网格而不是允许功能,它可能卡在 while 循环中但我无法查明确切的问题。 Any idea is appreciated.任何想法表示赞赏。

runGameAgainstAI code:运行GameAgainstAI代码:

public void runGameAgainstAI() throws IOException, InterruptedException {

    // create the CPU object and initialize variables for the game
    cpu = new CPU();
    title.setText("Player 1");
    cpuGameTurn = "Picking";
    btnFire.setEnabled(true);

    boolean hasWon = false;
    // game loop
    while (true) {

        sleep(100);

        // this is reserved for when the human player is selecting a cell
        // by firing a valid shot, cpuGameTurn is set to "Picked"
        if (cpuGameTurn.equals("Picking")) {
            servermsg.setText("Select a cell and fire!");
        } 

        // upon shooting, the cpu checks if the shot hit
        // this condition is met when the btnFire is clicked
        // while selecting a valid cell
        else if (cpuGameTurn.equals("Picked")) {
            // check if the shot hit the cpu ships
            boolean hit = cpu.checkHit(eb.getRclick(), eb.getCclick());
            // place a corresponding marker
            if (hit) {
                eb.placeHitMarker(eb.getRclick(), eb.getCclick());
            } else {
                eb.placeMissMarker(eb.getRclick(), eb.getCclick());
            }
            // create the shot record
            sl.insert(new ShotRecord(eb.getRclick(), eb.getCclick(), hit, "You"));
            txaSList.setText(sl.toString());

            // if the cpu lost break, hasWon will be true
            hasWon = cpu.checkLost();
            if (hasWon) {
                break;
            }
            // set the turn to cpu
            cpuGameTurn = "cpu";
        }

        // when it is the cpu turn
        else if (cpuGameTurn.equals("cpu")) {
            // get the cpu shot, and check if it hit
            int shot[] = cpu.shoot();
            boolean hit = pb.checkEnemyShot(shot[0], shot[1]);
            // create the shot record
            sl.insert(new ShotRecord(shot[0], shot[1], hit, "CPU"));
            txaSList.setText(sl.toString());

            // if the cpu won break, hasWon will be false
            if (pb.hasLost()) {
                break;
            }
            // set the turn back to waiting for human to shoot
            cpuGameTurn = "Picking";
        }


    }

    if (hasWon) {
        servermsg.setText("You won!");
    } else {
        servermsg.setText("You lost!");
    }



}

Self Testing main method for run game against ai:对ai运行游戏的自测主要方法:

 else {
        try {
            cui = new ClientUI();
            cui.runGameAgainstAI();
        }

Main-menu code in separate class trying to call the runGameAgainstAI Method尝试调用 runGameAgainstAI 方法的单独类中的主菜单代码

        else if (evt.getSource() == btnSinglePlayer) {
        try {
            ClientUI c = new ClientUI();
            c.runGameAgainstAI();


        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

    }

At first glance, the code will be endlessly in this loop.乍一看,代码会在这个循环中无穷无尽。 Need to update cpuGameTurn inside the if...需要在 if... 中更新 cpuGameTurn

cpuGameTurn = "Picking";
while (true) {

    sleep(100);

    if (cpuGameTurn.equals("Picking")) {
        servermsg.setText("Select a cell and fire!");
    } 
.
.
.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM