#窗体整人小程序_java:简单的五子棋程序(包括与简单的AI对战)

本文介绍了使用Java编程实现的简易五子棋小程序,包括玩家对战和AI对战模式。在AI对战中,通过权值算法让计算机判断最佳下棋位置。程序支持悔棋和重新开始功能,采用监听器处理棋盘交互,使用二维数组记录棋子状态,并通过win类判断胜负。源码包含六个类,提供了游戏的基本逻辑和界面交互。
摘要由CSDN通过智能技术生成

49da70f438f747dfeea42aa9e2939cc3.png
知乎视频​www.zhihu.com

刚学习做了个简易的五子棋小程序,给大家说说我的思路吧。

先说说主要要实现的功能:

1.首先程序有两个模式,玩家对战与人机对战(默认为玩家对战的模式),每次在下拉框选择后棋盘就会重绘,也就是清空重新开始。

2.玩家对战:黑白交替下子,且当某一方五子相连时,判出胜负;人机对战:固定地玩家执黑棋,ai执白棋,通过权值算法来让ai判断下棋的位置。

3.重新开始就是清空棋盘上所有棋子,即清空棋的数组再进行重绘。

4.悔棋按钮的功能:如果是玩家对战,就悔一个棋子;如果是人机对战,就悔两个棋子。

接下来为具体实现:

首先得有一个界面(窗口界面类),并继承JFrame类来进行重绘,同时进行一些设置。

public class FiveChess extends JFrame implements conf{
    
	private chesses[] chessArray = new chesses[144];//存放棋子的位置,颜色属性,用于重绘
	public void initui(){
    
		this.setTitle("五子棋");
		this.setSize(900, 800);
		this.setDefaultCloseOperation(3);
		this.getContentPane().setBackground(Color.ORANGE);
		this.setResizable(false);//设定不可改变大小
		this.setLocationRelativeTo(null);//居中出现
		
		JPanel jp = new JPanel();
		jp.setBackground(Color.GRAY);
		jp.setPreferredSize(new Dimension(100,0));
		this.add(jp,BorderLayout.EAST);
		DMouse dm = new DMouse();
		String[] shape = {
     "重新开始", "悔棋" };
		for (int i = 0; i < shape.length; i++) {
    
			JButton jbu = new JButton(shape[i]);
			jp.add(jbu);
			jbu.addActionListener(dm);
		}
		String[] a={
    "玩家对战 " ,"人机对战"};
		JComboBox<String> A=new JComboBox<String>(a);
		jp.add(A);
                this.setVisible(true);

再就是画棋盘,这里为了能后期更方便的修改棋盘结构,就定义了一个conf接口来存放几个常量。

public interface conf {
	public static final int  X0=60;
	public static final int  Y0=60;
	public static final int  SIZE=40;
	public static final int  LINE=18;
	public static final int  CHESS_SIZE=30;
}

然后在窗口界面类(FiveChess)中进行重绘

public void paint(Graphics g) {
		super.paint(g);
		drawChess(g);//画棋盘
		drawChesses(g);//画棋子
		
	}
public void drawChess(Graphics g) {//遍历画棋盘
		for(int i=0;i<LINE;i++) {
			g.drawLine(X0, Y0+i*SIZE, X0+(LINE-1)*SIZE, Y0+i*SIZE);
		}
		for(int j=0;j<LINE;j++) {
			g.drawLine(X0+j*SIZE, Y0,X0+j*SIZE, Y0+(LINE-1)*SIZE);
		}

	}

还有棋子的重绘,就要先解决怎么下棋的问题,我们先为窗体加上鼠标监听器,按钮加上动作监听器,并将画笔,自己这个窗体对象(直接在监听类中调用重绘),存放棋子的对象数组(保存下的棋,用来进行棋子的重绘)传递过去

                A.addItemListener(dm);
                this.addMouseListener(dm);
		Graphics g = this.getGraphics();
		dm.setFrame(this);//向监听处理传窗体对象
		dm.setG(g);//向监听处理传画笔
		dm.setChess(chessArray);//向监听处理传数组

这样新建一个监听类DMouse类,重新对应的方法,来实现下棋。这里继承了MouseAdapter类,它是个抽象类,不像MouseListener是个接口,所以只需重写部分方法。同时新建一个棋子类,将每个棋子的位置,颜色,画棋子的方法都放在其中,最后存入该类的对象数组用于重绘。

public class chesses implements conf{//棋子对象
	private int x,y;
	private Color color;
	
	public chesses(int x, int y, Color color) {
		// TODO Auto-generated constructor stub
		this.x=x;
		this.y=y;
		this.color=color;
	}
	
	
	public void drawC(Graphics g) {
		g.setColor(color);
		g.fillOval(x-CHESS_SIZE/2, y-CHESS_SIZE/2, CHESS_SIZE, CHESS_SIZE);
		
	}
}

DMouse监听类中重写鼠标点击的方法

先是玩家对战,包括了1.黑白棋交替,2.棋子要下在网格上,每个点只能下一个棋子,3棋子要重绘。

通过变量count来控制黑白棋的交替,偶数下黑棋(对应的二维数组记1),奇数下白棋(对应的二维数组记1),二维数组对应棋盘上每一个交点的位置,没下过的就为0。下在网格上通过遍历棋盘上每个交点的位置,判断获取的点击的位置是否还在交点位置的SIZE/2的半径范围内,在的话就直接在相应的交点位置画图。

同时每下一次棋就创建对象存入对象数组。

public class DMouse extends MouseAdapter implements conf,ActionListener,ItemListener{
    
	private Graphics g;
	private int count = 0; //黑白棋计数
	private int[][] chess = new int[LINE][LINE];//棋盘位置
	private chesses[] chessArray;//棋子对象
	priv
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值