Java初学者练习之五子棋游戏教程(附源码)

1.图形化界面的创建

1.1创建JFrame窗体容器

         1)JFrame窗体需要设置基本的大小、布局、默认的关闭方式,以及最重要的设置可见。

1.2在JFrame上添加组件,用来绘制棋盘棋子和游戏操作。

        1)棋盘棋子的绘制:自定义一个类去继承JPanel,把绘制棋盘和棋子的方法重写进入paint()方法里,这样当窗体发生变化(放大、缩小、移动等操作时,棋盘棋子不会消失,棋局得以保存)。

        2)悔棋、认输等操作通过JButton按钮添加鼠标监听来实现。

2.关键点的实现(使用六个类实现背后逻辑,UI类,DrawChessBoard类,GameMouse类,QiZi类,Location类以及AI类)。

2.1在棋盘点击的位置绘制棋子

        1)给棋盘添加鼠标监听,获取点击位置的坐标

        UI类负责初始化1中的图形化界面,并给DrawChessBoard类添加GameMouse类的监听。这样在鼠标点击棋盘时通过重写GameMouse类的mouseClicked(),就可以获取鼠标在棋盘上点击的像素坐标。

        2)坐标转化成二位数组中的坐标

       保存棋盘上所有棋子位置用到QiZi类中的int[][] memory二维数组,这样把像素坐标转化为二维数组中的坐标,并附上棋子颜色对应的值,就可以保存棋盘上所有棋子的位置。

        3)在棋盘上画出棋子

        在DrawChessBoard类paint()方法中遍历QiZi类中的int[][] memory二维数组非零值,就可以在相应位置调用画笔方法画出黑白棋子。

2.2判断输赢

        1)下完棋子后,将下棋位置保存到QiZi类的int[][] memory二维数组中后,就可以以该点为中心计算其四个方向上连续棋子的数目,达到五个则通过JOptionPane类生成弹窗确定赢家。

2.2悔棋功能和提示最后落子位置功能的实现

        1)每次成功下一颗棋子,就可以创建一个保存了棋子坐标的Location对象,并将该对象添加到 QiZi类的ArrayList或者Stack容器当中,当鼠标点击悔棋Button后,清除QiZi类的int[][] memory二维数组相应位置的数值(将之改为0即可),然后棋盘重绘棋子,就可以完成悔棋的效果。

        2)同时可以找到容器中最后落子的位置,并在棋盘相应的坐标出画出最后落子提示。

2.3开始、认输的实现

        1)开始游戏,即重置游戏,将棋子类的相应属性清零即可,比如int[][] memory二维数组(即棋谱),owener=1(重置为白色),以及清楚棋盘上面的棋子。

        2)认输就可以判断当前QiZi.owner的值,来判断输的一方并给出提示即可。

2.4AI的实现

        1)默认AI为黑方的情况下,需要在白色方落子之后调用AI下黑色棋子,所以在需要在GameMouse中下白棋的if分支中调用AI方法

        2)AI的厉害与否取决于其设计,在这里提供一个思路:设置一个棋型对照表,给不同棋型赋值(如1111,代表白子四连,权重较高),轮到AI时,可以根据该表计算棋盘上每一个空位在八个方向总的权重大小,在权重最大处落子即可。棋型对照表中不同棋的权重设置,可以通过python等分析大量棋局来获取,以此来训练AI,当权重设置越合理,AI就越强。

3其他功能

        下子的动画效果音效等可以通过开辟不同的线程来实现,而网络对战则可增加网络通信相关模块即可。

4源码

package wuziqi925;

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

public class GameUI {
    public static void main(String[] args) {
        GameUI gameUI=new GameUI();
        gameUI.showUI();
    }

    public void showUI(){
        //创建棋子对象
        QiZi qizi=new QiZi();
        //获取窗体
        JFrame jFrame=new JFrame();
        jFrame.setSize(1000,795);
        jFrame.setDefaultCloseOperation(3);
        jFrame.setLocationRelativeTo(null);
        jFrame.setLayout(null);
        jFrame.setTitle("五子棋");
        jFrame.setResizable(false);

        //窗体添加棋盘面板
        DrawChessBoard chessBoard=new DrawChessBoard(qizi);
        jFrame.add(chessBoard);
        chessBoard.setSize(760,760);
        chessBoard.setBackground(Color.ORANGE);


        //测试JFrame框架像素大小,Insets[top=32,left=3,bottom=3,right=3]
        //System.out.println(jFrame.getInsets());

        //窗体添加选项面板,用来画棋盘
        JPanel bp=new JPanel();
        bp.setSize(236,760);
        bp.setBackground(Color.lightGray);
        bp.setLocation(760,0);
        bp.setLayout(null);
        jFrame.add(bp);


        //选项面板添加按钮
        JButton start=new JButton("开始");
        start.setBackground(Color.white);
        start.setFont(new Font("华文行楷",Font.BOLD,20));
        start.setBounds(40,350,150,50);

        JButton quit=new JButton("认输");
        quit.setBackground(Color.white);
        quit.setFont(new Font("华文行楷",Font.BOLD,20));
        quit.setBounds(40,440,150,50);

        JButton undo=new JButton("悔棋");
        undo.setBackground(Color.white);
        undo.setFont(new Font("华文行楷",Font.BOLD,20));
        undo.setBounds(40,530,150,50);

        bp.add(start);
        bp.add(quit);
        bp.add(undo);

        //选择模式选项
        ButtonGroup bg=new ButtonGroup();
        JRadioButton rrdz=new JRadioButton("玩家对战");
        JRadioButton rjdz=new JRadioButton("人机对战");
        rrdz.setSize(120,30);
        rrdz.setLocation(55,60);
        rrdz.setFont(new Font("华文行楷",Font.BOLD,20));
        rrdz.setVisible(true);
        rjdz.setSize(120,30);
        rjdz.setLocation(55,90);
        rjdz.setFont(new Font("华文行楷",Font.BOLD,20));
        rjdz.setVisible(true);
        bg.add(rjdz);
        bg.add(rrdz);
        bp.add(rjdz);
        bp.add(rrdz);
        bp.setVisible(true);

        //设置窗体可见
        jFrame.setVisible(true);


        AI ai=new AI(qizi,chessBoard);
        //获取棋盘的鼠标监听和画笔并将该画笔添加给鼠标
        Graphics g1=chessBoard.
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值