2016-09-30 8 views
-3

基本的に私はゲームボードを持っていて、エッジにない広場に最初の移動をすることは違法にしたいと考えています。フレームは5x5のゲームボードで、その順番に応じてクリック時に色が交互に変わります。WhileループはSwingアプリケーションで使用できませんか?

私の問題:私がプログラムを始めると、私が途中で押しているボタンが違法な動きであるとは言いません。コードが機能しない理由を誰でも説明できますか?ここで

は、いくつかのサンプルコードです:

package fgame; 

import java.awt.Color; 
import javax.swing.JOptionPane; 

public class FooFrame extends javax.swing.JFrame { 

private Color whoseTurn = Color.BLACK; 
private Color playerOneTurn = Color.BLACK; 
private Color playerTwoTurn = Color.ORANGE; 
private String playerOne = "You"; 
private String playerTwo; 
private int PlayerOneCount = 21; 
private int PlayerTwoCount = 21; 


public FooFrame() { 
    initComponents(); 
    setSize(800,800); 
    setLocationRelativeTo(null); 
    humanOrAI(); 
    movesLeft(); 
    endGame(); 


} 

private void humanOrAI() 
{ 
    Object[] options = {"Other Human","Computer (EASY)","Computer (HARD)"}; 

    Object input = (Object) JOptionPane.showInputDialog(null, 
      "Who is your opponent?", 
      "CHOOSE YOUR FATE!",JOptionPane.QUESTION_MESSAGE, 
      null,options, 
      options[0]); 
    if (input == options[0]){ 
     playerTwo = (String.valueOf(options[0])); 
    } 
    else if (input == options[1]){ 
     playerTwo = (String.valueOf(options[1])); 
    } 
    else { 
     playerTwo = (String.valueOf(options[2])); 
    }   
} 

private void determineWhoseTurn() 
{ 
    if (whoseTurn.equals(playerOneTurn)) 
    { 
     whoseTurn = Color.orange; 
    } 
    else 
    { 
     whoseTurn = Color.BLACK; 
    } 
} 

public void movesLeft() 
{ 

    if (whoseTurn.equals(playerOneTurn)) 
    { 
     jLabel1.setText(" " + playerOne + " have " + PlayerOneCount+ " pieces left " 
       + "   "+ playerTwo+ " has " + PlayerTwoCount+ " pieces left"); 
     PlayerOneCount--; 
    } 

    else 
    { 
     jLabel1.setText(" " + playerOne + " have " + PlayerOneCount+ " pieces left " 
       + "   "+ playerTwo+ " has " + PlayerTwoCount+ " pieces left"); 
     PlayerTwoCount--; 
    } 
} 

//How do I count the amount of black and orange squares? 
public void endGame() 
{ 
    int black = 0; 
    int orange = 0; 

    if (whoseTurn.equals(playerOneTurn)) 
    { 
     black++; 
    } 
    else 
    { 
     orange++; 
    } 

    if (PlayerTwoCount <= 0 || PlayerOneCount <= 0) 
    { 
     JOptionPane.showMessageDialog(rootPane, "Game Over!" + " black: "+ black 
     + "orange: "+ orange); 
    } 
} 

public void validStartingPoint() 
{ 
    Object illStartPoint[] = {B2,B3,B4,C2,C3,C4,D2,D3,D4}; 

    while (PlayerOneCount == 21 || PlayerTwoCount == 21) 
     if (whoseTurn.equals(illStartPoint[0-8])) 
     { 
      JOptionPane.showMessageDialog(rootPane, "Not a valid move! Start " 
        + "from an edge square!"); 
     } else 
     { 
      break; 
     } 
} 

私の質問は、方法validStartingPoint()に関係します。しかし、私はendGame()についての質問もありましたが、それはその上のコメントに置かれています。すべてのメソッドはすべて私のJBUTTONSで呼び出されます

また、これはwhileループとは関係がないことに気付いています。私は世界で最高のコーダーではない。

+0

投票閉じるにはあなたが何を求めているのかは不明です。明らかにあなたのコードでループを使用するのは上手く、私はここに他の質問はありません。私は、あなたが期待していないことが起こっていることの説明を見ていません。 – nhouser9

+1

あなたの主な質問は簡単です:もちろんwhileループはSwingアプリケーションにも当てはまりますが、基本的な質問は実際にはなく、実際は不完全です。あなたのコードの問題については何も教えてくれず、実行できるものを投稿していない。この質問を改善し、[mcve]を提供することを検討してください(リンクの心ではありません)、私たちはより良い回答を見つける能力を持っていきます。 –

+0

@HovercraftFullOfEelsもっとコードを追加しました – lenti

答えて

3

書かれたとして不完全である、あなたの質問など、特定の助けを与えることは不可能ですが、あなたの直接的な質問に答えるために:ループがSwingアプリケーション、

しかしで、もちろん適用可能である、あなたは使用しないでくださいそれらはリニアコンソールアプリケーションの場合と同じです。ほとんどのGUIはリニアプログラムではなく、1ビットのコードが別のコードを必要とするのと同じように、イベントで駆動されるプログラムで、ボタンを押すか、マウスが押されます。

したがって、whileループを使用してユーザーの入力を待機またはポーリングするのではなく、「状態」マシンタイプの設計を使用して、状態を元の状態あなたのプログラムのためのモデル、ここであなたのゲームロジック。

さらに詳しいヘルプが必要な場合は、minimal example programを作成して投稿するなどのご質問をしてください。


これらの人はJButtonがある場合は、[はい、whileループが代わりに、ボタンのActionListenerのがボタンを押した場合、ボタンを押すにチェックし、その中のif文を、持っている必要があり

Object illStartPoint[] = { B2, B3, B4, C2, C3, C4, D2, D3, D4 }; 

間違っています合法です。これはあなたが入っているプログラムの部分に依存するので、正当かどうかを判断するifテスト内のブーリアン文の一部でなければなりません。たとえば、最初のボタンを押したときに誰かがボタンを押さないようにしているのであれば、ブール数はいくつかあります。

しかし、それを言って、私は実際に別のことをやります。私は押されるべきではないボタンを無効にして、/ボタンを押すべきときにそれらを起動するだろう。これはsetEnabled(boolean enabled)を呼び出し、プログラムがであるものの状態に応じて、そのボタンのtrueまたはfalseを渡すことによって行うことができる。例えば

、私が何を意味するかを確認するには、このコードを実行します。

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ItemEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

public class TestButtons1 extends JPanel { 
    private static final int BUTTON_COUNT = 10; 
    // private boolean onlyEvenButtonsActve = true; 
    private List<JButton> allButtons = new ArrayList<>(); 

    public TestButtons1() { 
     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     for (int i = 0; i < BUTTON_COUNT; i++) { 
      JButton button = new JButton("Button " + i); 
      // add ActionListener 
      button.addActionListener(e -> { 
       System.out.println("Button pressed: " + e.getActionCommand()); 
      }); 

      buttonPanel.add(button); // add to jpanel 
      allButtons.add(button); // add to array list for all buttons 
     } 

     JToggleButton activateOnlyEvensTglBtn = new JToggleButton("Activate Only Even Buttons"); 
     activateOnlyEvensTglBtn.addItemListener(e -> { 
      for (int i = 0; i < allButtons.size(); i++) { 
       boolean b = i % 2 == 0 || e.getStateChange() == ItemEvent.DESELECTED; 
       allButtons.get(i).setEnabled(b); 
      } 
     }); 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.add(activateOnlyEvensTglBtn); 

     setLayout(new BorderLayout()); 
     add(buttonPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    private static void createAndShowGui() { 
     TestButtons1 mainPanel = new TestButtons1(); 

     JFrame frame = new JFrame("TestButtons1"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
関連する問題