【问题标题】:Turns issue in java game [closed]在java游戏中出现问题[关闭]
【发布时间】:2016-03-05 15:56:22
【问题描述】:

我创建了一个简单的游戏,玩家可以与电脑对战。 我的回合时间有问题,计算机应该是第一个移动的,而不是真正的玩家应该通过点击LeftChoiceRightChoice 按钮来移动。

这是我的代码问题:

public class GameForm extends javax.swing.JFrame {

/**
 * Creates new form GameForm
 */
final int SIZE = 10;
int CurrentSize = 10;
int PC_SUM=0;
int HUMAN_SUM=0;
boolean PC_TURN = true;
int[] RandArr = new int[SIZE];
public GameForm() {
    initComponents();
}
public void init(){
    for(int i = 0 ; i<SIZE;i++){
        RandArr[i] = (int)(Math.random()*100)+1;
    }
    jTextField3.setText("");
    jTextField4.setText(Integer.toString(PC_SUM));
    jTextField5.setText(Integer.toString(HUMAN_SUM));
}
public void HUMAN_updateLeft(){
    HUMAN_SUM+=RandArr[0];
    jTextField5.setText(Integer.toString(HUMAN_SUM));
    jTextField1.setText(Arrays.toString(RandArr));
    CurrentSize--;
    int [] NewRand = new int[CurrentSize];
     for(int i = 1 ; i<=CurrentSize;i++){
        NewRand[i-1] = RandArr[i];
    }
     RandArr = NewRand;
     jTextField2.setText(Arrays.toString(RandArr));
     PC_TURN = true;
}
public void HUMAN_updateRight(){
    HUMAN_SUM+=RandArr[CurrentSize-1];
    jTextField5.setText(Integer.toString(HUMAN_SUM));
    jTextField1.setText(Arrays.toString(RandArr));
    CurrentSize--;
    int [] NewRand = new int[CurrentSize];
     for(int i = CurrentSize-1 ; i>=0;i--){
        NewRand[i] = RandArr[i];
    }
     RandArr = NewRand;
     jTextField2.setText(Arrays.toString(RandArr));
     PC_TURN = true;
}
public static boolean WhoIsBigger(int[] arr){
int even=0,odd=0;

for(int i=0;i<arr.length;i+=2){
    if(i%2==0){
    even+=arr[i];
    odd+=arr[i+1];
    }
    else{
        odd+=arr[i];
        even+=arr[i+1];
    }
  }
return even>odd;
}
public void PC_updateLeft(){
    PC_SUM+=RandArr[0];
    jTextField4.setText(Integer.toString(PC_SUM));
    jTextField1.setText(Arrays.toString(RandArr));
    CurrentSize--;
    int [] NewRand = new int[CurrentSize];
     for(int i = 1 ; i<=CurrentSize;i++){
        NewRand[i-1] = RandArr[i];
    }
     RandArr = NewRand;
     jTextField2.setText(Arrays.toString(RandArr));
}
public void PC_updateRight(){
    PC_SUM+=RandArr[CurrentSize-1];
    jTextField4.setText(Integer.toString(PC_SUM));
    jTextField1.setText(Arrays.toString(RandArr));
    CurrentSize--;
    int [] NewRand = new int[CurrentSize];
     for(int i = CurrentSize-1 ; i>=0;i--){
        NewRand[i] = RandArr[i];
    }
     RandArr = NewRand;
     jTextField2.setText(Arrays.toString(RandArr));
}
public void PC_TURN(){
    if(WhoIsBigger(RandArr))
        PC_updateLeft();
    PC_updateRight();
}
public void FullGame(){
    while(RandArr.length>0){
        if(PC_TURN){
            PC_TURN();
            PC_TURN = false;
        }
    }
}
  //start button listener
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    init();
    jTextField2.setText(Arrays.toString(RandArr));
    jTextField1.setText("-");
    jButton1.setEnabled(false);
    FullGame();
}                                        
   //left button listener
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
HUMAN_updateLeft();
}                                        
//right button listener
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
HUMAN_updateRight();
}                

我怎么知道真正的玩家已经做出了动作,所以它会将PC_TURN 更改为True 并且游戏会继续进行?

【问题讨论】:

  • 也许可以通过在 LeftChoice/RightChoice 按钮上添加PC_TURN = true; onClick?
  • if(PC_TURN) { //PC 转向并设置 PC_TURN = false;} else { //用户转向并将 PC_TURN 设置为 true 以便下一台 PC 播放} 就这么简单。
  • 我试过了,但程序因任何原因崩溃了..
  • 您需要发布更多代码。这里的信息太少了。

标签: java swing event-driven-design


【解决方案1】:

首先,在命名变量时,您应该遵循 Java 命名约定。就目前而言,PC_TURN 看起来好像是一个常数,尽管它不是一个常数,因为您正在更改它的值。所以更合适的名字是pcTurn

您似乎还有一个名为PC_TURN() 的方法,我假设它是导致计算机轮流执行某些操作的方法。因此,如果将其命名为 takePCTurn() 之类的描述性名称会更好。请注意始终使用 camelCase。名称开头的大写字母应保留给类和接口,而不是变量或方法。

方法名称也是如此

public void FullGame()

应该写成

public void fullGame()

遵守这样的编码约定可以让其他人更容易阅读和理解您的代码,并使所有内容保持整洁。养成一个好习惯。 :)

我不知道你的左右按钮是在哪里声明的或者你给它们起什么名字,但是你需要为每个按钮添加一个事件监听器,当它们被点击时会发生一些事情。我也不确定RandArr.length &gt; 0 的用途。你真的不需要在这里循环,因为这是一个带有 GUI 的应用程序,除非你明确告诉它(例如通过单击关闭按钮),否则它永远不会关闭。所以我只会给你一个通用的解决方案。

您基本上希望玩家轮流触发计算机轮流,直到满足某些游戏结束条件。

例子:

//Assuming this is called when the Start button is clicked
public void fullGame() {
    takePCTurn();
}

public void takePCTurn() {
    //Do PC's turn logic
    //You might want to check if the Computer Won the game here        
}


class PlayerTurnListener implements ActionListener() {
    public void actionPerformed(ActionEvent e) {
        //Do Player's turn logic            
        //You might want to check if the Player Won the game here
        takePCTurn();
    }
}

//We can create an instance of our listener and add it to both buttons
PlayerTurnListener playerTurnListener = new PlayerTurnListener();

leftButton.addActionListener(playerTurnListener);
rightButton.addActionListener(playerTurnListener);

所以发生的第一件事是fullGame() 被您的开始按钮调用,然后调用takePCTurn(); 导致计算机轮到它。现在在玩家点击左或右按钮之前什么都不会发生。当他们这样做时,PlayerTurnListeneractionPerformed() 方法被调用,你可以在那里做一些逻辑,然后takePCTurn(); 将被再次调用。

冲洗并重复直到游戏结束。

希望有帮助:)

【讨论】:

  • 非常感谢,您的回答非常详细,帮助我解决了问题。 :)
  • @gilleibovitz 没问题 :) 很高兴我能帮上忙!
【解决方案2】:

您应该在左右按钮上附加clickListener。然后,当用户单击一个该事件将被触发。您应该在此处将 PC_TURN 更改为 true 并在需要时重新运行循环。

例子:

JButton yourButton = new JButton("Your Button");
yourButton.addActionListener(new ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
    PC_TURN = true;
    // extra code
  }
});

【讨论】:

  • 这正是我最初所做的,但程序被卡住了。 @vguzzi
  • 你能把代码卡在哪里吗?
  • 当我第一次通过点击“开始”按钮初始化它时
  • 如果您需要足够的帮助,您必须粘贴更多代码。
  • 看起来他添加了监听器,但从未跳出原始循环。他初始化循环,PC 转一圈,然后循环耐心等待 RandArr.length>0 解析为假...
【解决方案3】:

如果这是 Swing 或其他 GUI,那么您将需要摆脱 while 循环。

请记住,GUI 程序是非线性的,并且是事件驱动的,因此,您可以根据轮到谁来更改程序的状态,而不是一个限制性的 while 循环(可能会完全影响您的 GUI)——有一个变量指示轮到谁了——然后根据状态改变程序的行为。

如果您需要更具体的帮助,那么您将需要提出一个更完整的问题,包括一个包含足够代码和解释的问题,以便我们更好地理解您的问题(但不要过多的代码)。


关于您发布的代码:

  • 是的,一定要摆脱那个 while 循环。
  • 你的代码很难理解,主要是你的变量命名很差。不要使用像 jTextField1 这样的变量名称,而是使用具有逻辑意义的名称,使您的代码“自调试”,例如 humanScoreFieldcomputerScoreField 等。
  • 还要学习并遵循标准 Java 命名实践,包括让所有变量以小写字母开头、以大写字母开头的类、对所有变量使用 camelCase,但所有常量均大写。
  • 详细说明这段代码应该做什么、按钮和 JTextfield 代表什么、您想要什么行为等等...

【讨论】:

  • 根据你所说的问题,我现在已经编辑了我的代码,所以你可以看到它的全部。我是 GUI 新手,不知道如何解决循环问题
  • @gilleibovitz:再一次,你不需要也不需要循环。请参阅编辑以回答。如果您是自学 Java,请先阅读有关核心原则的介绍性章节——您不会后悔这样做,因为它会在以后帮助您(并帮助我们更好地理解您的代码)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多