java - 游戏循环中断

标签 java loops logic

我是 GUI 新手。 我不太确定如何更新我的游戏循环,以便在 userPlayString 更新时调用 defineWinner() 方法。我尝试制作一个如下所示的 if 语句:

if (game.userPlayString != null) {
    game.determineWinner();
}

我认为它应该执行,但没有任何反应。这是我到目前为止的代码。感谢您的帮助。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class RPSSL implements ActionListener{
    public String userPlayString;
    public String computerPlayString;

    public int c;
    public int p;

    public JButton rockButton = new JButton("Rock");
    public JButton paperButton = new JButton("Paper");
    public JButton scissorsButton = new JButton("Scissors");
    public JButton spockButton = new JButton("Spock");
    public JButton lizardButton = new JButton("Lizard");

    public JPanel panel = new JPanel();

public RPSSL() {
    userPlayString = null;
    computerPlayString = null;
    c = 0;
    p = 0;
}

public void actionPerformed(ActionEvent e) {
    Object src = e.getSource();

    if (src == rockButton) {
        userPlayString = "Rock";
        p = 1;
    }
    else if (src == paperButton) {
        userPlayString = "Paper";
        p = 1;
    }
    else if (src == scissorsButton) {
        userPlayString = "Scissors";
        p = 1;
    }
    else if (src == spockButton) {
        userPlayString = "Spock";
        p = 1;
    }
    else if (src == lizardButton) {
        userPlayString = "Lizard";
        p = 1;
    }

}

public void createJFrame() {
    JFrame frame = new JFrame("Rock Paper Scissors Spock Lizard");
    panel.setLayout(null);

    panel.add(rockButton);
    rockButton.setBounds(0, 0, 100, 30);
    rockButton.addActionListener(this);

    panel.add(paperButton);
    paperButton.setBounds(0,30,100,30);
    paperButton.addActionListener(this);

    panel.add(scissorsButton);
    scissorsButton.setBounds(0,60,100,30);
    scissorsButton.addActionListener(this);

    panel.add(spockButton);
    spockButton.setBounds(0,90,100,30);
    spockButton.addActionListener(this);

    panel.add(lizardButton);
    lizardButton.setBounds(0,120,100,30);
    lizardButton.addActionListener(this);



    frame.add(panel);
    frame.setVisible(true);
    frame.setSize(30,200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void computerPlay() {

    Random randomGenerator = new Random();
    int computerPlay = randomGenerator.nextInt(5);
    if (computerPlay == 0){
        computerPlayString = "Rock";
    }
    else if (computerPlay == 1) {
        computerPlayString = "Paper";
    }
    else if (computerPlay == 2) {
        computerPlayString = "Scissors";
    }
    else if (computerPlay == 3) {
        computerPlayString = "Spock";
    }
    else if (computerPlay == 4) {
        computerPlayString = "Lizard";
    }

    System.out.println("Computer played: " +computerPlayString);

}

public void humanWins() {
    System.out.print("You win!");
}

public void computerWins() {
    System.out.print("You lose!");
}

public void tie() {
    System.out.print("It's a tie!");
}

public void determineWinner() {
    //Determines who wins
    if (userPlayString.equalsIgnoreCase("rock")) {
        if (computerPlayString.equalsIgnoreCase("rock")) tie();
        else if (computerPlayString.equalsIgnoreCase("scissors")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("paper")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) computerWins();
    }

    else if (userPlayString.equalsIgnoreCase("paper")) {
        if (computerPlayString.equalsIgnoreCase("rock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("paper"))tie();
        else if (computerPlayString.equalsIgnoreCase("spock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) computerWins();
    }

    else if (userPlayString.equalsIgnoreCase("scissors")) {
        if (computerPlayString.equalsIgnoreCase("rock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) tie();
        else if (computerPlayString.equalsIgnoreCase("paper")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) humanWins();
    }

    else if (userPlayString.equalsIgnoreCase("spock")) {
        if (computerPlayString.equalsIgnoreCase("rock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("paper")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) tie();
        else if (computerPlayString.equalsIgnoreCase("lizard")) humanWins();
    }

    else if (userPlayString.equalsIgnoreCase("lizard")) {
        if (computerPlayString.equalsIgnoreCase("rock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("paper")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) tie();
    }
}
public static void main(String[] args) {
    RPSSL game = new RPSSL();
    game.createJFrame();
    while(game.c < 1){
        if (game.userPlayString != null) {
            game.determineWinner();
        }
    }
}

}

错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at main.RPSSL.determineWinner(RPSSL.java:126)
at main.RPSSL.actionPerformed(RPSSL.java:34)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

最佳答案

我对您的代码做了一些更改。在确定Winner() 函数中,我添加了对computerPlay() 函数的调用。以前,computerPlay() 函数从未被调用。我还在 if 语句中添加了 game.c 变量的增量,以防止无限循环。此外,为了防止 CPU 过度工作,我同步了您的 main 方法,抛出 InterruptedException,并在 while 循环的每次迭代中实现了一个小暂停。如果不这样做,我就无法完成这项工作。该程序确实正确调用了defineWinner()函数,允许用户玩游戏。

将您的代码与此工作示例进行比较。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class RPSSL implements ActionListener
{
  public String userPlayString;
  public String computerPlayString;

  public int c;
  public int p;

  public JButton rockButton = new JButton("Rock");
  public JButton paperButton = new JButton("Paper");
  public JButton scissorsButton = new JButton("Scissors");
  public JButton spockButton = new JButton("Spock");
  public JButton lizardButton = new JButton("Lizard");

  public JPanel panel = new JPanel();

  public static synchronized void main(String[] args) throws InterruptedException
  {
    RPSSL game = new RPSSL();
    game.createJFrame();
    while(game.c < 1)
    { 
      Thread.sleep(10);
      if (game.userPlayString != null) 
      {
        game.determineWinner();
        game.c++;
      }
    }
  }

  public RPSSL() 
  {
    userPlayString = null;
    computerPlayString = null;
    c = 0;
    p = 0;
  }

  public void actionPerformed(ActionEvent e) 
  {
    Object src = e.getSource();

    if (src == rockButton) 
    {
      userPlayString = "Rock";
      p = 1;
    }
    else if (src == paperButton) 
    {
      userPlayString = "Paper";
      p = 1;
    }
    else if (src == scissorsButton) 
    {
      userPlayString = "Scissors";
      p = 1;
    }
    else if (src == spockButton) 
    {
      userPlayString = "Spock";
      p = 1;
    }
    else if (src == lizardButton) 
    {
      userPlayString = "Lizard";
      p = 1;
    }
  }

  public void createJFrame() 
  {
    JFrame frame = new JFrame("Rock Paper Scissors Spock Lizard");
    panel.setLayout(null);

    panel.add(rockButton);
    rockButton.setBounds(0, 0, 100, 30);
    rockButton.addActionListener(this);

    panel.add(paperButton);
    paperButton.setBounds(0,30,100,30);
    paperButton.addActionListener(this);

    panel.add(scissorsButton);
    scissorsButton.setBounds(0,60,100,30);
    scissorsButton.addActionListener(this);

    panel.add(spockButton);
    spockButton.setBounds(0,90,100,30);
    spockButton.addActionListener(this);

    panel.add(lizardButton);
    lizardButton.setBounds(0,120,100,30);
    lizardButton.addActionListener(this);



    frame.add(panel);
    frame.setVisible(true);
    frame.setSize(30,200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  public void computerPlay() 
  {
    Random randomGenerator = new Random();
    int computerPlay = randomGenerator.nextInt(5);
    if (computerPlay == 0)
    {
      computerPlayString = "Rock";
    }
    else if (computerPlay == 1) 
    {
        computerPlayString = "Paper";
    }
    else if (computerPlay == 2) 
    {
        computerPlayString = "Scissors";
    }
    else if (computerPlay == 3) 
    {
        computerPlayString = "Spock";
    }
    else if (computerPlay == 4) 
    {
        computerPlayString = "Lizard";
    }

    System.out.println("Computer played: " + computerPlayString);

  }

  public void humanWins() 
  {
    System.out.print("You win!");
  }

  public void computerWins() 
  {
    System.out.print("You lose!");
  }

  public void tie() 
  {
    System.out.print("It's a tie!");
  }

  public void determineWinner() 
  {
    computerPlay();
    //Determines who wins
    if (userPlayString.equalsIgnoreCase("rock")) 
    {
        if (computerPlayString.equalsIgnoreCase("rock")) tie();
        else if (computerPlayString.equalsIgnoreCase("scissors")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("paper")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) computerWins();
    }

    else if (userPlayString.equalsIgnoreCase("paper")) 
    {
        if (computerPlayString.equalsIgnoreCase("rock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("paper"))tie();
        else if (computerPlayString.equalsIgnoreCase("spock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) computerWins();
    }

    else if (userPlayString.equalsIgnoreCase("scissors")) 
    {
        if (computerPlayString.equalsIgnoreCase("rock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) tie();
        else if (computerPlayString.equalsIgnoreCase("paper")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) humanWins();
    }

    else if (userPlayString.equalsIgnoreCase("spock")) 
    {
        if (computerPlayString.equalsIgnoreCase("rock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("paper")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) tie();
        else if (computerPlayString.equalsIgnoreCase("lizard")) humanWins();
    }

    else if (userPlayString.equalsIgnoreCase("lizard")) 
    {
        if (computerPlayString.equalsIgnoreCase("rock")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("scissors")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("paper")) humanWins();
        else if (computerPlayString.equalsIgnoreCase("spock")) computerWins();
        else if (computerPlayString.equalsIgnoreCase("lizard")) tie();
    }
  }
}

关于java - 游戏循环中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762188/

相关文章:

java - 如何在嵌入式 Grizzly Jersey 应用程序的主方法中使用 HK2 注入(inject)对象

loops - 在 v-for 循环 vuejs 中插入命名槽

c++ - Cin 直到输入结束

c - 当内循环索引不等于外循环索引时的嵌套循环

java - 如何创建可重用的 dockerfile 模板?

java - 如何扩展单例类以处理特定数量的对象

C:Do-While 循环重复太多!

clojure - 迷你看人、core.logic、clojure : Reasoned Scheme Exercise 60

php - 更新多维数组 (PHP) 中的特定键

java - 使用 Apache POI 在 PowerPoint 幻灯片中的两点之间绘制一条线