栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

五子棋(2)实现悔棋功能//连连看

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

五子棋(2)实现悔棋功能//连连看

1.建新的界面,界面中有两个面板(属性:背景颜色等)一个是按钮面板btnPanel,一个是棋盘(chessPanel)其中类ChessPanel 继承JPanel;

代码—

public class LayoutUI {
    public static void main(String[] args) {
        LayoutUI ly=new LayoutUI();
        ly.showUI();
    }
    ChessListener cl=new ChessListener();//监听器


    public void showUI(){
        JFrame jf=new JFrame();
        jf.setTitle("五子棋总结");
        jf.setDefaultCloseOperation(3);
        jf.setSize(700,600);

        //添加两个画板
        JPanel btnPanel=new JPanel();
        ChessPanel chessPanel=new ChessPanel();//继承了Jpanel
        btnPanel.setBackground(Color.white);
        chessPanel.setBackground(Color.lightGray);
        jf.add(btnPanel, BorderLayout.EAST);
        jf.add(chessPanel,BorderLayout.CENTER);
        initButtonPanel(btnPanel,cl);//添加按钮面板
        jf.setVisible(true);

2.按钮面板btnPanel创立两个面板(njp,sjp)有按钮(颜色、背景、大小),按钮需要添加按钮的ActionListenner动作监听器)——采用封装的方法

代码二:

public void initButtonPanel(JPanel btnPanel,ActionListener al){//动作监听器

        Dimension dim=new Dimension(120,0);
        Dimension dim1=new Dimension(0,250);//南北只能设置高度,东西只设置宽度
        btnPanel.setPreferredSize(dim);//南北只能设置高度,东西只设置宽度
        btnPanel.setLayout(new BorderLayout());//获得一个布局,新的边框布局//要不然显示不出来
        JPanel njp=new JPanel();
        JPanel sjp=new JPanel();

        njp.setPreferredSize(dim1);
        sjp.setPreferredSize(dim1);
        //背景颜色
        njp.setBackground(Color.ORANGE);
        sjp.setBackground(Color.pink);

        btnPanel.add(njp,BorderLayout.NORTH);
        btnPanel.add(sjp,BorderLayout.SOUTH);
        String[] str=new String[]{"开始游戏","悔棋","退出","认输","你真好看"};
        for(int i=0;i< str.length;i++){
            initButton(njp,Color.white,str[i],cl);//这里必须用cl,要不然还是监听不到
        }
    }

(1)其中按钮的名字可以用一维数组来添加名字(string[] strs=new string[]{" "," "}; )封装起来在initBttoonPanel里用,封装如下

public void initButton(JPanel jp,Color color,String name,ActionListener al){
        JButton jbu=new JButton(name);//按钮
        Dimension dim2=new Dimension(110,30);
        jbu.setPreferredSize(dim2);
        jbu.addActionListener(al);//这里只是一个那个添加监听器对象
        jp.add(jbu);
        }

(2)btnPanel面板也需要获取边框布局(setLayout(new BorderLayout)),要不然JPanel默认为流式布局;

3.在棋盘面板下棋,需要在棋盘面板在获取画笔(Graphics g=chessPanel.getGraphics),把画笔的g传到监听器中,用来绘画圆,直线都可以。

//UI界面

Graphics g=chessPanel.getGraphics();
        cl.g=g;//监听器cl获取到了画笔g
        chessPanel.addMouseListener(cl);//棋盘chessPanel添加鼠标监听器

(1)用setGraphics(Graphics g){this.g=g}函数来获取

//ChessListener界面

Graphics g;//传画笔
    public void setGraphics(Graphics g) {
        this.g = g;
        System.out.println("g="+g);
    }

(2)在UI界面中监听器cl.g=g;//赋值

4.实现轮流下棋以及重绘

(1)用二维数组的方法视线重绘;

((1))在chessPanel继承JPanel,在这里重写paint方法,建立一个数组int arr1[][]用for循环重绘

//chessPanel界面

import javax.swing.*;
import java.awt.*;

public class ChessPanel extends JPanel implements GoBangconfig{
    int[][] arr1;
    Image image1 = new ImageIcon("D:\图片\black.png").getImage();
    Image image2 = new ImageIcon("D:\图片\white.png").getImage();
    
    public void paint(Graphics g){
        super.paint(g);
        for(int i=0;i<=C;i++){
            g.drawLine(X,Y+i*SIZE,X+C*SIZE,Y+i*SIZE);
            g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+R*SIZE);
        }
        for(int i=0;i< arr1.length;i++){
            for(int j=0;j< arr1.length;j++){
                if(arr1[i][j]==1){
                    g.drawImage(image1, i*SIZE+X - SIZE / 2, j*SIZE+Y - SIZE / 2, 60, 60, null);
                }
                if(arr1[i][j]==2){
                    g.drawImage(image2, i*SIZE+X - SIZE / 2, j*SIZE+Y - SIZE / 2, 60, 60, null);
                }
            }

        }
    }
}

((2));在监听器接面用数组arr1[][]实现不能在同一个地方下棋功能,需要从UI界面获取对象chessPanel,然后才能传数组到ChessPanel的arr1[][]里面,在UI界面用cl.setChessPanel(chessPanel)才能获得那个chessPanel 对象;才能调用监听器中的arr1[];

UI界面
//      cl.chessPanel=chessPanel;//这个方法重绘的时候数组传不过去
        //把chessPanel这个对象传到监听器里这样才能获取数组
        cl.setChessPanel(chessPanel);//监听器通过set方法才能在cl里获得chessPannel
ChesssListener界面
//用二维数组重绘棋子
    ChessPanel chessPanel;//传对象
    int[][] arr1=new int[10][10];
    public void setChessPanel(ChessPanel chessPanel){
        this.chessPanel=chessPanel;
        ch

5.实现悔棋(悔黑下黑)

(3)创建一个悔棋的类UnDo(行列 数)

public class UnDo {
    int ChessLine;//行
    int Chesscolumn;//列
    int Chessnum;//个数
     boolean isBlack;
    public UnDo(int ChessLine, int Chesscolumn, int Chessnum,boolean isBlack){
       this.ChessLine=ChessLine;
       this.Chesscolumn=Chesscolumn;
       this.Chessnum=Chessnum;
       this.isBlack=isBlack;
    }
}

(2)队列 ArrayList unDolist=new ArrayList<>();来悔棋

ArrayList unDoArrayList=new ArrayList<>();

(3)在画圆面后把创建一个新的对象 UnDo un_black=new UnDo来获取下完的那颗棋子的行列值以及数!在把这个对象添加到队列里面(先进后出);

UnDo un_black=new UnDo(ChessX,ChessY,chessFlag,isBlack);
                unDoArrayList.add(un_black);

(4)在actionPerformed的函数中

if(strs.equals("悔棋")){
int size=unDoArrayList.size();
UnDo unDo=unDoArrayList.get(size-1);
arr1[unDo.chessLine][unDo.chesscolumn]=0;
unDoArrayList.remove(size-1);
isBlack=unDO.isBlack
chessPanel.repaint();
}
暂时先写到这!后面更新功能;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984592.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号