Java 在我的跳棋游戏中同时显示2帧

Java 在我的跳棋游戏中同时显示2帧,java,swing,Java,Swing,我一直在用java编写一个跳棋游戏。我已经有了GUI,用户可以点击来移动部件,并且已经开始创建必要的代码,以便用户通过互联网进行连接并相互进行游戏。然而,当我试着玩一个与我自己的游戏时,只有一个(服务器)显示它的棋盘,另一个是空白的。为什么会这样?我有一种感觉,这可能与我屏幕上的板重叠有关 大部分代码都围绕着运动规则(任何涉及跳跃的部分)和所有服务器客户端代码都没有经过测试,因为我甚至还不能玩游戏。您可能还注意到一些跳棋规则尚未实施(特别是国王和每回合1个移动)。我计划在网络代码启动并运行后添加

我一直在用java编写一个跳棋游戏。我已经有了GUI,用户可以点击来移动部件,并且已经开始创建必要的代码,以便用户通过互联网进行连接并相互进行游戏。然而,当我试着玩一个与我自己的游戏时,只有一个(服务器)显示它的棋盘,另一个是空白的。为什么会这样?我有一种感觉,这可能与我屏幕上的板重叠有关

大部分代码都围绕着运动规则(任何涉及跳跃的部分)和所有服务器客户端代码都没有经过测试,因为我甚至还不能玩游戏。您可能还注意到一些跳棋规则尚未实施(特别是国王和每回合1个移动)。我计划在网络代码启动并运行后添加这些代码。因此,如果有错误,你能指出它们是很好的,但我现在的主要问题是让两个窗口同时运行。我将包括绘图代码和完整的CheckersServer代码。CheckersClient代码基本上是相同的,除了围绕移动不同颜色块的微小更改,它必须连接到服务器,而不是等待连接。如果有人问我,我也可以发布客户端代码。非常感谢

绘图代码

public static class Board
{
    private JFrame boardFrame = new JFrame();//outside frame
    private JPanel gameBoard = new JPanel(new GridLayout(9,9)); //actual game board
    private JPanel backPanel = new JPanel(new BorderLayout()); //panel to hold game board and done button
    private boardSquare selected; //piece currently selected to move
    private boolean pieceSelected = false; //is a piece currently selected?
    private Map<Position,boardSquare> grid = new HashMap<Position,boardSquare>(); //Map keying positions to squares on the board
    private boolean serverTurn = true; //is it the Servers turn to move?
    private BufferedWriter bw; //data to client

    Board(Socket sock) throws IOException  
    {
        boardFrame.setSize(1000,1000);
        backPanel.setPreferredSize(new Dimension(1000, 1000));
        boardFrame.add(backPanel);
        backPanel.add(gameBoard, BorderLayout.WEST);
        boardFrame.setTitle("Checkers");
        boardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        boardFrame.setVisible(true);
        gameBoard.setVisible(true);
        gameBoard.setPreferredSize(new Dimension(900, 650));
        backPanel.setVisible(true);


        JButton doneButton = new JButton("Done");
        doneListener s = new doneListener();
        doneButton.addActionListener(s);
        doneButton.setBackground(Color.GREEN);
    doneButton.setOpaque(true); 
        backPanel.add(doneButton,BorderLayout.EAST);

      /*Then some loops for populating the gameBoard with objects of this type, see full code    below for details if interested*/

      private class boardSquare extends JComponent
      {
        private boolean isBlack = false; //is there a black chip on this square?
        private boolean isRed = false; //is there a red chip on this square?
        private boolean colored = false; //is the square itself colored?
        private Position pos = null; //location of the square in the board

        public boardSquare(String type, boolean c, Position p)
        {
            if (type.equals("Black"))
            {
                isBlack = true;
                isRed = false;
            }
            else if (type.equals("Red"))
            {
                isRed = true;
                isBlack = false;
            }
            else if (type.equals("Blank"))
            {
                isBlack = false;
                isRed = false;
            }

            colored = c;
            pos = p;
        }
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
    setPreferredSize(new Dimension(100, 100));
    Rectangle box = new Rectangle(0,0,100,100);
            g2.draw(box);
            if(colored)
    {   
       g2.setPaint(Color.BLUE);
               g2.fill(box);
    }

            if(isBlack)
            {
                g2.setColor(Color.black);
                g2.fillOval(13, 1,70 ,70 );
            }

            else if(isRed)
            {
                g2.setColor(Color.red);
                g2.fillOval(13, 1,70 ,70);
             }

          }
公共静态类板
{
私有JFrame boardFrame=新JFrame();//外部框架
private JPanel gameBoard=new JPanel(new GridLayout(9,9));//实际的游戏板
private JPanel backPanel=new JPanel(new BorderLayout());//用于放置游戏板和完成按钮的面板
已选择private boardSquare;//当前选择要移动的工件
private boolean pieceSelected=false;//当前是否选择了一个工件?
private Map grid=new HashMap();//将键控位置映射到板上的正方形
private boolean serverTurn=true;//是否轮到服务器移动?
private BufferedWriter bw;//将数据发送到客户端
线路板(插座插座)引发IOException
{
boardFrame.setSize(10001000);
后面板。设置首选尺寸(新尺寸(10001000));
板框。添加(背板);
添加(gameBoard,BorderLayout.WEST);
boardFrame.setTitle(“棋盘格”);
boardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
boardFrame.setVisible(真);
gameBoard.setVisible(true);
gameBoard.setPreferredSize(新尺寸(900650));
后面板。设置可见(真);
JButton doneButton=新JButton(“完成”);
doneListener s=新的doneListener();
doneButton.addActionListener;
doneButton.setBackground(颜色:绿色);
设置不透明(true);
添加(doneButton,BorderLayout.EAST);
/*然后是用这种类型的对象填充游戏板的一些循环,如果有兴趣,请参阅下面的完整代码以了解详细信息*/
私有类boardSquare扩展JComponent
{
私有布尔值isBlack=false;//这个正方形上有黑色的芯片吗?
private boolean isRed=false;//这个方块上有红筹码吗?
private boolean colored=false;//正方形本身是彩色的吗?
private Position pos=null;//方块在板中的位置
公共boardSquare(字符串类型,布尔c,位置p)
{
if(类型等于(“黑色”))
{
isBlack=true;
isRed=假;
}
else if(类型等于(“红色”))
{
isRed=真;
isBlack=false;
}
else if(类型等于(“空白”))
{
isBlack=false;
isRed=假;
}
有色=c;
pos=p;
}
公共组件(图形g)
{
图形2d g2=(图形2d)g;
setPreferredSize(新尺寸(100100));
矩形框=新矩形(0,0100);
g2.绘制(方框);
如果(彩色)
{   
g2.setPaint(颜色为蓝色);
g2.填充(框);
}
如果(黑色)
{
g2.设置颜色(颜色为黑色);
g2.椭圆形(13,1,70,70);
}
否则,如果(isRed)
{
g2.设置颜色(颜色为红色);
g2.椭圆形(13,1,70,70);
}
}
完整代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*; 
import java.net.*;
import java.io.*;


public class CheckersServer 
{
    public static class Board
    {
        private JFrame boardFrame = new JFrame();//outside frame
        private JPanel gameBoard = new JPanel(new GridLayout(9,9)); //actual game board
        private JPanel backPanel = new JPanel(new BorderLayout()); //panel to hold game board and done button
        private boardSquare selected; //piece currently selected to move
        private boolean pieceSelected = false; //is a piece currently selected?
        private Map<Position,boardSquare> grid = new HashMap<Position,boardSquare>(); //Map keying positions to squares on the board
        private boolean serverTurn = true; //is it the Servers turn to move?
        private BufferedWriter bw; //data to client

    Board(Socket sock) throws IOException  
    {
        try
        {
            bw = new BufferedWriter(new OutputStreamWriter( sock.getOutputStream() ));
        }
        catch(IOException e )
        {
            System.out.println("error: " + e );
        }

        boardFrame.setSize(1000,1000);
        backPanel.setPreferredSize(new Dimension(1000, 1000));
        boardFrame.add(backPanel);
        backPanel.add(gameBoard, BorderLayout.WEST);
        boardFrame.setTitle("Checkers");
        boardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        boardFrame.setVisible(true);
        gameBoard.setVisible(true);
        gameBoard.setPreferredSize(new Dimension(900, 650));
        backPanel.setVisible(true);


        JButton doneButton = new JButton("Done");
        doneListener s = new doneListener();
        doneButton.addActionListener(s);
        doneButton.setBackground(Color.GREEN);
    doneButton.setOpaque(true); 
        backPanel.add(doneButton,BorderLayout.EAST);

        boardSquare bs;
        String type = null;
    boolean colored = true;
        Position pos = null;
        //Filling in Red Side
        for (int i = 0; i < 2; i++)
        {
            for(int j = 0; j < 9; j++)
            {

               if(i == 0)
                {
                    if(j % 2 == 0)
                    {
                        type = "Red";
                        colored = false;
                    }
                    else 
                    {
                        type = "Blank";
                        colored = true;
                    }
                }
                else
                {
                     if(j % 2 == 0)
                    {
                        type = "Blank";
                        colored = true;
                    }
                    else 
                    {
                        type = "Red";
                        colored = false;
                    }
                }
                pos = new Position(i,j);
                bs = new boardSquare(type, colored, pos);
                squareListener listener = new squareListener();
                bs.addMouseListener(listener);
                grid.put(pos,bs);
                gameBoard.add(bs); 

            }

        }
        //Filling in empty middle
        type = "Blank";
        for (int i = 2; i < 7; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(i % 2 == 0) 
                {  
        if(j % 2 == 0)
                    {
                      colored = false;
                    }
                    else 
                    {
                      colored = true;
                    }
         }
        else
        {
        if(j % 2 == 0)
                    {
                      colored = true;
                    }
                    else 
                    {
                      colored = false;
                    }
        } 

        pos = new Position(i,j);
                bs = new boardSquare(type, colored, pos);
                squareListener listener = new squareListener();
                bs.addMouseListener(listener);
                grid.put(pos,bs);
                gameBoard.add(bs);

            }

        }

        //Filling in Black side
        for (int i = 7; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(i == 7)
                {
                    if(j % 2 == 0)
                    {
                        type = "Blank";
                        colored = true;
                    }
                    else 
                    {
                        type = "Black";
                        colored = false;
                    }
                }
                else
                {
                     if(j % 2 == 0)
                    {
                        type = "Black";
                        colored = false;
                    }
                    else 
                    {
                        type = "Blank";
                        colored = true;
                    }
                }

                pos = new Position(i,j);
                bs = new boardSquare(type, colored, pos);
                squareListener listener = new squareListener();
                bs.addMouseListener(listener);
                grid.put(pos,bs);
                gameBoard.add(bs);

              }

        }

     boardFrame.repaint();

   }

    private class Position
    {
        private int x;
        private int y;

        Position(int a, int b)
        {
            x = a;
            y = b;
        }

        public int xCord()
        {
            return x;
        }

        public int yCord()
        {
            return y;
        }
    }

    //this class represents the squares on the game board
    private class boardSquare extends JComponent
    {
        private boolean isBlack = false; //is there a black chip on this square?
        private boolean isRed = false; //is there a red chip on this square?
        private boolean colored = false; //is the square itself colored?
        private Position pos = null; //location of the square in the board

        public boardSquare(String type, boolean c, Position p)
        {
            if (type.equals("Black"))
            {
                isBlack = true;
                isRed = false;
            }
            else if (type.equals("Red"))
            {
                isRed = true;
                isBlack = false;
            }
            else if (type.equals("Blank"))
            {
                isBlack = false;
                isRed = false;
            }

            colored = c;
            pos = p;
        }
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
    setPreferredSize(new Dimension(100, 100));
    Rectangle box = new Rectangle(0,0,100,100);
            g2.draw(box);
            if(colored)
    {   
       g2.setPaint(Color.BLUE);
               g2.fill(box);
    }

            if(isBlack)
            {
                g2.setColor(Color.black);
                g2.fillOval(13, 1,70 ,70 );
            }

            else if(isRed)
            {
                g2.setColor(Color.red);
                g2.fillOval(13, 1,70 ,70);
             }

          }

        public boolean isBlack()
        {
            return isBlack;
        }
        public boolean isRed()
        {
            return isRed;
        }

        public boolean isBlank()
        {
            if(isBlack || isRed)
    {
        return false;
    }

    return true;
        }

        public Position getPosition()
        {
            return pos;
        }

        public void setColor(String color)
        {
            if(color.equals("Black"))
            {
                isBlack = true;
                isRed = false;
            }
            if(color.equals("Red"))
            {
                isBlack = false;
                isRed = true;
            }
            if(color.equals("Blank"))
            {
                isBlack = false;
                isRed = false;
            }
        }

    }
    //used to detect the mouse clicks used to move checker pieces
    private class squareListener implements MouseListener 
    {
        public void mousePressed(MouseEvent event) {}
        // Called when a mouse button has been pressed on a component
        public void mouseReleased(MouseEvent event) {}
        // Called when a mouse button has been released on a component
        public void mouseClicked(MouseEvent event) 
        // Called when the mouse has been clicked on a component
        {

            try{
            if(serverTurn){
            boardSquare square = (boardSquare)event.getComponent();

            if(!pieceSelected) //picking a piece to move, server is black
            {
                if(square.isRed())
                {
                    System.out.println();
                    System.out.println("Invalid Square");
                }
                else if(square.isBlank())
                     {
                        System.out.println();
                        System.out.println("Invalid Square");
                     }
                else //chose a black piece to move
                {
                    selected = square;
                    pieceSelected = true;
            }
            }
            else //piece already picked, picking square to move to
            {
                if(!square.isBlank())//can't move to occupied square
                {
                    System.out.println();
                    System.out.println("Invalid Square");
                    pieceSelected = false; //deselect piece in case of accidental selection of a surronded piece

                }
                else
                {

        Position piecePos =  selected.getPosition();
                    Position destPos = square.getPosition();

                    int pieceXCord = piecePos.xCord();
                    int pieceYCord = piecePos.yCord();
                    int destXCord = destPos.xCord();
                    int destYCord = destPos.yCord();

                    int deltaX = pieceXCord - destXCord;
                    int deltaY = pieceYCord - destYCord;

                    //Moving up and to the right one diagional square
                    if(deltaX == 1 && deltaY == -1)
                    {
                        selected.setColor("Blank"); //leave old square
                        square.setColor("Black");  //move to new square
                        pieceSelected = false;

                        //Sending Client information so it can update it's board
                        bw.write(pieceXCord + "\n");
                        bw.write(pieceYCord + "\n");
                        bw.write(destXCord + "\n");
                        bw.write(destYCord + "\n");
                        bw.write(-1 + "\n"); //no piece was jumped use -1 to indicate this
                        bw.write(-1 + "\n");


                    }
                    else 
                    {   //jumping a piece up and to the right 
                        if(deltaX == 2 && deltaY == -2)
                        {
                            selected.setColor("Blank"); //leave old square
                            square.setColor("Black"); //move to new square
                            boardSquare captured = grid.get(new Position(pieceXCord-1,pieceYCord+1));
                            captured.setColor("Blank"); //remove captured piece
                            Position capturedPos = captured.getPosition();
                            pieceSelected = false;

                            bw.write(pieceXCord + "\n");
                            bw.write(pieceYCord + "\n");
                            bw.write(destXCord + "\n");
                            bw.write(destYCord + "\n");
                            bw.write(capturedPos.xCord() + "\n"); 
                            bw.write(capturedPos.yCord() + "\n");

                        }

                        else
                        {
                            //Moving up and to the left one diagional square
                            if(deltaX == 1 && deltaY == 1)
                            {

                                selected.setColor("Blank"); //leave old square
                                square.setColor("Black");  //move to new square
                                pieceSelected = false;

                                bw.write(pieceXCord + "\n");
                                bw.write(pieceYCord + "\n");
                                bw.write(destXCord + "\n");
                                bw.write(destYCord + "\n");
                                bw.write(-1 + "\n"); //no piece was jumped use -1 to indicate this
                                bw.write(-1 + "\n");
                            }
                            else 
                            {       
                                //jumping a piece up and to the left 
                                if(deltaX == 2 && deltaY == 2)
                                {

                                    selected.setColor("Blank"); //leave old square
                                    square.setColor("Black"); //move to new square
                                    boardSquare captured = grid.get(new Position(pieceXCord-1,pieceYCord-1));
                                    captured.setColor("Blank"); //remove captured piece
                                    Position capturedPos = captured.getPosition();
                                    pieceSelected = false;

                                    bw.write(pieceXCord + "\n");
                                    bw.write(pieceYCord + "\n");
                                    bw.write(destXCord + "\n");
                                    bw.write(destYCord + "\n");
                                    bw.write(capturedPos.xCord() + "\n"); 
                                    bw.write(capturedPos.yCord() + "\n");

                                }

                                else //tried to move in an incorrect way
                                {
                                    System.out.println();
                                    System.out.println("Invalid Square");
                                    pieceSelected = false;
                                }

                            }
                      }

                   }

                }
              }
            boardFrame.repaint();
          }
        }
            catch(IOException e)
            {
                System.out.println("error: " + e );
            }
      }

        public void mouseEntered(MouseEvent event) {}
        // Called when the mouse enters a component
        public void mouseExited(MouseEvent event) {}
        // Called when the mouse exits a component
    }

    //This class is attached to the DONE button and is used to detect the end of a turn
    private class doneListener implements ActionListener
    {

        public void actionPerformed(ActionEvent event)
        {
            if(serverTurn)
            {
                serverTurn = false;
                JButton done = (JButton)event.getSource();
                done.setBackground(Color.YELLOW); //background is yellow means it's not server's turn
                try
                {
                    bw.write("DONE" + "\n"); //alert client that server is done.
                }
                catch (IOException e)
                {
                    System.out.println("error: " + e );
                }
     }
        }
    }

   //updates boardSquares given by indices to reflect the clients moves
   public void update(int pieceXCord, int pieceYCord,int destXCord, int destYCord, int capturedXCord, int capturedYCord)
   {
       boardSquare pieceSquare = grid.get(new Position(pieceXCord,pieceYCord));
       boardSquare destSquare = grid.get(new Position(destXCord,destYCord));
       pieceSquare.setColor("Blank");
       destSquare.setColor("Red");

       if(capturedXCord > -1 && capturedYCord > -1)
       {
            boardSquare capturedSquare = grid.get(new Position(capturedXCord,capturedYCord));
            capturedSquare.setColor("Blank");
       }

       boardFrame.repaint();
   }

   public void setTurn()
   {
       serverTurn = true;
   }
}


public static void main(String[] args)
{
    try
    {
        ServerSocket listen = new ServerSocket( 0 );
        System.out.println("Server port is " + listen.getLocalPort() );
        Socket client = listen.accept();
        Board game = new Board(client);

        /* data from client */
        BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream() ));
        String enemyMove = null;

        int pieceXCord;
        int pieceYCord;
        int destXCord;
        int destYCord;
        int capturedXCord;
        int capturedYCord;

        while(true)
        {
            pieceXCord = -2; //using -2 to indcate failure
            pieceYCord = -2;
            destXCord = -2;
            destYCord = -2;
            capturedXCord = -2;
            capturedYCord = -2;


            enemyMove = br.readLine();
            if(!enemyMove.equals("DONE"))
            {
                pieceXCord = Integer.parseInt(enemyMove);
            }
            enemyMove = br.readLine();
            if(!enemyMove.equals("DONE"))
            {
                pieceYCord = Integer.parseInt(enemyMove);
            }
            enemyMove = br.readLine();
            if(!enemyMove.equals("DONE"))
            {
                destXCord = Integer.parseInt(enemyMove);
            }
            enemyMove = br.readLine();
            if(!enemyMove.equals("DONE"))
            {
                destYCord = Integer.parseInt(enemyMove);
            }
            enemyMove = br.readLine();
            if(!enemyMove.equals("DONE"))
            {
                capturedXCord = Integer.parseInt(enemyMove);
            }
            enemyMove = br.readLine();
            if(!enemyMove.equals("DONE"))
            {
                capturedYCord = Integer.parseInt(enemyMove);
            }

            if(pieceXCord != -2 && pieceYCord !=-2 && destXCord != -2 && destYCord != -2 && capturedXCord != -2 && capturedYCord != -2)
            {
                game.update(pieceXCord,pieceYCord,destXCord,destYCord,capturedXCord,capturedYCord);
            }

            if(enemyMove.equals("DONE"));
            {
                game.setTurn();
            }
        }

    }
    catch( IOException e ) 
    {
    System.out.println("error: " + e );

    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入java.net。*;
导入java.io.*;
公共类checkerserver
{
公共静态类委员会
{
私有JFrame boardFrame=新JFrame();//外部框架
private JPanel gameBoard=new JPanel(new GridLayout(9,9));//实际的游戏板
private JPanel backPanel=new JPanel(new BorderLayout());//用于放置游戏板和完成按钮的面板
已选择private boardSquare;//当前选择要移动的工件
private boolean pieceSelected=false;//当前是否选择了一个工件?
private Map grid=new HashMap();//将键控位置映射到板上的正方形
private boolean serverTurn=true;//是否轮到服务器移动?
private BufferedWriter bw;//将数据发送到客户端
线路板(插座插座)引发IOException
{
尝试
{
bw=新的BufferedWriter(新的OutputStreamWriter(sock.getOutputStream());
}
捕获(IOE异常)
{
System.out.println(“错误:+e”);
}
boardFrame.setSize(10001000);
后面板。设置首选尺寸(新尺寸(10001000));
板框。添加(背板);
添加(gameBoard,BorderLayout.WEST);
boardFrame.setTitle(“棋盘格”);
boardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
boardFrame.setVisible(真);
gameBoard.setVisible(true);
gameB