1

私はcsコース用のボードゲームを構築しています。エンジン(そのバックボーン)から始めましたが、完成しましたが、まだGUI部分にこだわっています。エンジンには、部品でボードを初期化する double 配列があり、getWinner メソッドと move メソッドがあります。GUI 部分では、JFrame を作成し、そのレイアウトを gridlayout に設定しました。そこには、エンジンの配列をチェックし、それに応じてボードとボードのピースを印刷する別の二重配列があります..ただし、移動するたびに、エンジンの配列が登録されます移動しますが、JFrame に表示されません。方法がわかりません。GUI パッケージの Main クラスは次のとおりです。

package eg.edu.guc.loa.gui;

import java.awt.*;
import java.util.ArrayList;

import javax.swing.*;

import eg.edu.guc.loa.engine.*;
import eg.edu.guc.loa.engine.Point;

@SuppressWarnings("serial")
public class LOA extends JFrame{

    static Tiles[][] Jboard;
    static Board b = new Board();
    static Color temp;
    static Color col1 = Color.DARK_GRAY;
    static Color col2 = Color.LIGHT_GRAY;
    static JFrame LOA = new JFrame();
    JButton b1, b2;

    public LOA(){
        Jboard = new Tiles[8][8];
        LOA.setLayout(new GridLayout(8, 8));
        initBoard();
        LOA.setSize(600, 600);
        LOA.setVisible(true);
        LOA.setLocationRelativeTo(null);
        LOA.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b.printBoard();
    }

    public static void initBoard(){
        remove();
        b.printBoard();

        for(int i = 0; i<8; i++){
            if (i%2 == 0){
                temp = col1;
            }
            else{
                temp = col2;
            }
            for(int j = 0; j<8; j++){
                Jboard[i][j] = new Tiles(temp, i, j);
                LOA.getContentPane().add(Jboard[i][j]);
                if (temp.equals(col1)){
                    temp = col2;
                }
                else{
                    temp = col1;
                }

                if(b.getPiece(new Point(j, i)).getPlayer() == BoardCell.PLAYER_1_PIECE){
                    Jboard[i][j].hasChecker(true);
                    Jboard[i][j].setWhite(true);
                    Jboard[i][j] = new Tiles(temp, i, j);

                }
                if(b.getPiece(new Point(j, i)).getPlayer() == BoardCell.PLAYER_2_PIECE){
                    Jboard[i][j].hasChecker(true);
                    Jboard[i][j].setWhite(false);
                    Jboard[i][j] = new Tiles(temp, i, j);
                }

            }
        }
    }

    public static void remove(){
        for(int i = 0; i<8;i++){
            for(int j = 0; j<8; j++){
                if(Jboard[i][j] != null)
                    LOA.remove(Jboard[i][j]);
            }
        }
    }



    public static void main (String [] args){
        new LOA();

        }

}

どんな助けでも大歓迎です..事前に感謝します。

編集: b.print() は、エンジンの配列をコンソールに出力します。remove() は、古いフレームを削除し、新しい更新された配列 (移動された部分を含む) に基づいて新しいフレームを構築しようとする私の試みであり、明らかに失敗しました。

4

1 に答える 1

1

この非常に単純な例に示されているように、オブザーバー パターンMVCGameを使用して、ビューをモデルにリスナーとして登録するように調整できます。ユーザーのジェスチャーでモデルを更新する必要があります。モデルから通知されると、ビューはモデルの現在の状態を単純にレンダリングする必要があります。モデルには描画がなく、ビューにはゲーム ロジックがあってはなりません。

于 2013-05-09T01:02:02.127 に答える