0

ゲームクラス:

import java.util.Random;

public class Game {
public static void main(String args[]){

    //----------Sets up GUI----------

    GUI gameGUI = new GUI();
    gameGUI.setVisible(true);
    Player.setGUI(gameGUI);


    //----------Sets initial number of marbles, computer player and human player----------

    Random random = new Random();
    int initialNum;
    //loop makes sure initialNum of marbles is between 10 and 100
    do{                                 
        initialNum = random.nextInt(100);
    }while(initialNum < 10);
    //*****gameGUI.manageMarbles(initialNum, true);
    //end loop

    Pile pile = new Pile(initialNum);
    gameGUI.setPile(pile);

    int compChoice = random.nextInt(2) + 1; //number index (1 or 2) representing SIMPLE_COMPUTER or SMART_COMPUTER
    Player computer = new Player(Player.Type.values()[compChoice]);
    Player humanPlayer = new Player(Player.Type.HUMAN);


    //----------Game loop----------

    //Randomly determine first player
    Player currentPlayer;
    int playerIndex = random.nextInt(2); //will be used to determine next player in the loop
    if(playerIndex == 0){ currentPlayer = computer; }
    else { currentPlayer = humanPlayer; }

    //Loop
    while(pile.getNumMarbles() != 0){
        System.out.printf("%d marbles left.\n", pile.getNumMarbles());
        int removed = currentPlayer.playTurn(pile.getNumMarbles());
        pile.removeMarbles(removed);

        //Determine next player
        playerIndex = Math.abs(playerIndex - 1); //if playerIndex = 0, it becomes 1, and vice-versa
        if(playerIndex == 0){ currentPlayer = computer; }
        else { currentPlayer = humanPlayer; }

    }

    System.out.println(currentPlayer + " won");



}
}

プレイヤークラス:

import java.util.Scanner;
import java.util.Random;
public class Player {

    public enum Type{HUMAN, SIMPLE_COMPUTER, SMART_COMPUTER}
    private Type type;
    static private GUI gui;

    public Player(Player.Type type){
         this.type = type;
    }

    public Player.Type getType(){
         return type;
    }

    public int playTurn(int pileSize){
          Random random = new Random();
          if(type == Type.HUMAN){

              int marbles;
          do{
             marbles = gui.getMarblesToRemove();
          }while(marbles < 0);
              return marbles;

          }

          else if(type == Type.SIMPLE_COMPUTER){
           if(pileSize == 1){
               return 1;
               }
           else{
           int remove = random.nextInt(pileSize/2) + 1;
               if(remove == (pileSize/2) + 1){ remove -= 1; }
               return remove;
               }
          }

          else if(type == Type.SMART_COMPUTER){ 
               if(pileSize == 1){
               return 1;
            }
               else if(pileSize == 3 || pileSize == 7 || pileSize == 15 || pileSize== 31 || pileSize== 63 || pileSize <= 3){
              int remove = random.nextInt(pileSize/2) + 1;
              if(remove == (pileSize/2) + 1){ remove -= 1; }
              return remove;
            }
           else{
               for(int i=1; i<=pileSize/2; i++){
                   int size = pileSize - i;
               if(size == 3 || size == 7 || size == 15 || size == 31 || size == 63){
                    return i;
                }
            }
        }
    }
    return 0;

   }


public String toString(){
    return ""+type;
}

public static void setGUI(GUI guii){
    gui = guii;
}


}

GUI クラス:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class GUI extends JFrame {

  private JPanel panel;
  private JButton removeButton; //button to remove marbles
  private JTextField marblesAmount; //amount of marbles to remove
  private static final int FIELD_WIDTH = 2;
  private JLabel marblesLabel;
  private JLabel errorLabel;
  private Pile pile;
  private int marblesToRemove;
  private ClickListener listener;
  static final private int WIDTH = 700, HEIGHT = 600;

  public GUI(){
    super.setTitle("test");
    super.setSize(WIDTH, HEIGHT);
    super.setDefaultCloseOperation(EXIT_ON_CLOSE);
    panel = new JPanel();
    marblesLabel = new JLabel("How many marbles to remove?");
    errorLabel = new JLabel("");
    removeButton = new JButton("Remove");
    listener = new ClickListener();
    removeButton.addActionListener(listener);
    marblesAmount = new JTextField(FIELD_WIDTH);
    panel.add(removeButton);
    panel.add(marblesLabel);
    panel.add(marblesAmount);
    panel.add(errorLabel);
    super.add(panel);
    marblesToRemove = 0;
  }

  public void setPile(Pile pile){
    this.pile = pile;
  }



  private class ClickListener implements ActionListener{

    public void actionPerformed(ActionEvent event){
        marblesToRemove = Integer.parseInt(marblesAmount.getText());

    }
  }

  public int getMarblesToRemove(){
    return marblesToRemove;
  }


}

パイルクラス:

パブリック クラス パイル {

private int initialNum;
private int currentNum;

public Pile(int initialNum){
    setNumMarbles(initialNum);
    currentNum = initialNum;
}

public int getNumMarbles(){
    return currentNum;
}

public void removeMarbles(int numToRemove){
    currentNum = currentNum - numToRemove;
}

public void setNumMarbles(int amount){
    initialNum = amount;
}

public String toString(){
    return "Number of marbles: " + currentNum;
}

}

私がやろうとしているのは、PlayTurn(int pieSize) 関数を Player クラスで取得して、変数大理石 (if(type == Type.HUMAN) ブロック内) がゼロでない場合にのみ返すことです。関数 を呼び出すことにより、gui クラスの変数marblesToRemoveが大理石に割り当てられますgetMarblesToRemove()

marblesToRemoveは gui クラスのデフォルト コンストラクターで最初に設定されて0おり、これにより functionplayTurn(int pieSize) が無限ループに入ります。ただし、ボタン( )を押すと、 ( )marblesToRemove内に入力された別の値に変更されます。しかし、do while ループは依然として無限ループであり、関数は何も返さないのはなぜでしょうか? 誰か助けてくれませんか?ありがとう。JTextFieldmarblesAmountremoveButton

4

2 に答える 2

0

私はついにそれを働かせました。「System.out.print("");」というコード行を追加しました。Player クラスの do-while ループで。

だから今は次のように見えます

 do{
         marbles = gui.getMarblesToRemove();
         System.out.print("");
      }while(marbles < 0); 

なぜそれが機能するのかわかりませんが、機能します笑。これで、JTextField に設定した値がゼロでない場合、関数は実際にその値を返します。

于 2013-04-27T21:21:52.353 に答える