Javaでトランプゲームを作っています。すべてのルールなどを含むゲーム ロジック全体を既にプログラムしており、そのモデルの上に GUI の実装を開始しました。
私は 5 つのクラスを持っていますが、これから話すのは「メイン」またはゲーム クラスと「GUI」クラスだけです。まず、ハンドを作成するために、作成した Object Type < Card > の ArrayLists を使用します。このゲームは、「Play()」メソッドを使用してプレイし、(現時点では) コンソールを介して人間のプレーヤーの手を表示し、ArrayList で整数を選択して配置するように求めることによって機能します。クラス Main に main(String[] args) があり、クラス GUI を呼び出して、使用するゲーム ボードをセットアップします。
public static void main(String[] args)
{
Deck deck = new Deck();
ai = new AI;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUI gui = new GUI();
gui.setVisible(true);
}
})
理想的には、Play() メソッドを使用してゲームをプレイし、GUI クラスからメソッドを呼び出して、ボードを更新し、人間のプレイヤーが選択したカードを返すようにしたいと考えています。現時点で私ができる最善のことは、ボードをセットアップするときにボタンを実装することです
Button go = new Button("Update Hand");
ButtonDisplay.add(go);
go.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Thread queryThread = new Thread() {
public void run() {
UpdateHand();
}
};
queryThread.start();
}
});
その後実行されます
public void UpdateHand()
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
inPlay = main.inPlay;
UpdateInPlay(inPlay, InPlayDisplay);
HumanHand = main.humanplayer;
HumanHandDisplay.removeAll();
クリックすると、パネルがクリアされ、カード JLabels が再描画されます。
私の質問は、Play() メソッドで GUI クラスのメソッドを呼び出すにはどうすればよいですか? Play() メソッドから UpdateHand() を実行しようとすると、
gui.UpdateHand();
その gui.UpdateHand() 行で NullPointerException を返しますが、ArrayList など、指示すると UpdateHand() メソッド内の変数をコンソールに出力します。先ほど言ったように、GUI にボードを更新するボタンを配置する代わりに、ターン シーケンスをループし、プレイヤーがカードを選択する必要があるときに、Play() メソッドが UpdateMethod を呼び出すようにしたいと考えています。現在使用しているコンソール スキャナーを使用して、ユーザーが選択内容を入力できるようにテキスト フィールドとボタンをボードに追加するメソッドを実行します。これは Play() メソッドに返され、ゲームの計算を続行します。 .
私が間違っていることと、ここで指定したことを達成する方法について誰かが光を当てることができますか?
編集:
要求された 2 つのクラスのコードの詳細
GUI
public class GUI extends JFrame
{
public Main main;
private ArrayList<Card> AIHand;
public GUI() {
pane = this.getContentPane();
pane.setLayout(new GridLayout(6,1,2,2));
AIBackDisplay = new JPanel();
//just more of the same for other panels here
pane.setBackground(Color.GREEN);
setTitle("Last Man Standing");
pane.add(AIBackDisplay);
pane.add(AIHandDisplay);
pane.add(InPlayDisplay);
pane.add(HumanHandDisplay);
pane.add(HumanBackDisplay);
pane.add(HumanFacedownDisplay);
pane.add(ButtonDisplay);
setSize(800, 700);
setLocationRelativeTo(pane);
setDefaultCloseOperation(EXIT_ON_CLOSE);
UpdateFacedown(AIFacedown, AIBackDisplay); //these are methods called for original display
UpdateFacedown(HumanFacedown, HumanBackDisplay);
次に、ボタンを介して呼び出され、これを行う updateHand() メソッドがあります
for (int i = 0; i < (HumanHand.size()); i++)
{
Card card = HumanHand.get(i);
BufferedImage cardImage = null;
try {
cardImage = ImageIO.read(new File("card/" + card + ".jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JLabel picLabel = new JLabel(new ImageIcon( cardImage ));
HumanHandDisplay.add(picLabel);
}
HumanHandDisplay.updateUI();
私のメインクラスは
public class Main {
static AI ai;
public static GUI gui;
GUIは静的でなければならないことがわかりました。そうしないと、GUIを使用して呼び出すことができませんでした
Scanner sc = new Scanner (System.in);
choice = sc.nextInt(); //what i'm using now
//choice = gui.GUIReturn(); //what i'd like to use
GUI が静的であっても、何らかの理由で gui.GUIReturn() を実行できません。静的でなければならないと言っています