java实现AI五子棋

本文介绍了使用Java设计的一款五子棋小游戏,涵盖了双人对战和人机对战模式,以及悔棋和认输功能。设计遵循面向对象原则,采用简单的权值算法实现AI。虽然存在一些缺陷,但作为初学者的实践作品,已经实现了基本的游戏流程。后续作者计划改进算法,提升AI水平。
摘要由CSDN通过智能技术生成

       这是学习Java以来自己设计的第一款小游戏,虽然整体设计有点粗糙,电脑智能也比较低,不过也能满足基本需求,心里还是有点小激动。至于更高深的算法及其他功能的实现只能等以后再实现了。好了,闲话少述,咱们直奔主题吧!

先上一张效果图:

一、五子棋设计要求:

     1、设计一个能够实现双人对战及人机对战的五子棋游戏;

     2、游戏可实现悔棋及认输等基本操作;

     3、设计时尽量满足面向对象基本原则;

二、五子棋设计思路:

类:
1、五子棋主界面  数据处理中心  
                                调用绘制棋盘、绘制棋子方法,
                                键盘控制指令
            
2、棋子监听器类  提供棋子的坐标及二维数组(颜色)      put:   xlist,ylist,chessArray[i][j]
                               提供通过按钮事件获取的操作指令           put:   name
                               需要控制指令gameOver锁定监听器        get:   Boolean  gameOver
                              需要主界面对象调用控制方法                   get:    MainUI ui
                             
3、棋盘类       重绘方法中调用,绘制棋盘,需要画笔g      get:g

4、棋子类        绘制棋子方法(坐标及颜色)                       get:g, chessArray[][],xlist,ylist;

5、判断输赢        需要当前点坐标 ,棋子二维数组              get: chessArray[][],xlist,ylist;
                                                                                                     put:gameOver
                                                                                                     弹出消息提示框   
6、Robot        计算各点位置权值 ,需要棋子二维数组          get:   chessArray[][],xlist,ylist
                                                                                                     put:   xlist,ylist  
7、常数接口类   


三、五子棋设计说明:

1、执黑先行;

2、本次设计的权值算法较为简单,存在较为明显的缺陷;

四、代码实现

主界面

package com.Liao.FiveChess0705.v1;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class MainUI extends JFrame {

	private static final long serialVersionUID = 1L;
	private int[][] chessArray = new int[15][15];
	private LinkedList<Integer> xlist = new LinkedList<>();
	private LinkedList<Integer> ylist = new LinkedList<>();
	private Chess ch;
	private CheckChess cc;
	private ChessListener cl;
	private JOptionPane pane;
	private ChessTable ct;
	private Robot rt;
	private Graphics g;
	private Boolean isRobot = false;

	public void initUI() {
		this.setTitle("五子棋.Liao");
		this.setSize(760, 670);
		// 设置居中
		this.setLocationRelativeTo(null);
		// 设置大小不可调
		this.setResizable(false);
		// 设置窗体退出
		this.setDefaultCloseOperation(3);
		// 设置边界布局
		this.setLayout(new BorderLayout());

		// 在窗体右方添加JPanel容器
		JPanel jp = new JPanel();
		jp.setPreferredSize(new Dimension(100, 750));
		jp.setBackground(new Color(180, 100, 100));
		this.add(jp, BorderLayout.EAST);
		//创建监听器对象
		cl = new ChessListener(this, xlist, ylist, chessArray);
		String[] buttonArray = { "重新开始", "我方先手", "电脑先手", "悔棋", "认输" };
		for (int i = 0; i < buttonArray.length; i++) {
			JButton jbu = new JButton(buttonArray[i]);
			jbu.setBackground(Color.orange);
			jbu.setPreferredSize(new Dimension(90, 30));
			jbu.addActionListener(cl);
			jp.add(jbu);
		}
		this.addMouseListener(cl);
		this.setVisible(true);
		//获取画笔
		g = this.getGraphics();
		//创建棋子对象
		ch = new Chess(g, chessArray, xlist, ylist);
		//创建判断方法对象
		cc = new CheckChess(chessArray, xlist, ylist);
	}

	// 绘制棋子
	public void drawChess() {
		//调用绘棋方法
		ch.drawChess();
		//判断输赢
		cc.judge();
		//设置gameOver变量
		if (cc.getGameOver()) {
			cl.setGameOver(cc.getGameOver());
		}
		//判断是否人机对战
		if (!cc.getGameOver()) {
			if (isRobot) {
				rt = new Robot(chessArray, xlist, ylist);
				//计算各空位权值
				rt.AI();
				//获取权值最高的坐标
				rt.getMax();
				//下棋
				ch.drawChess();
				//清除权值
				rt.clearValue();
				//判断输赢
				cc.judge();
			}
		}
	}

	// 重绘方法
	public void paint(Graphics g) {
		super.paint(g);
		ct = new ChessTable(g);
		// 重绘棋盘
		ct.drawChessTable();
		// 重绘棋子
		ch.drawChess(g);
	}

	// 控制指令
	public void control(String name) {
		if ("重新开始".equals(name)) {
			isRobot = false;
			cl.setGameOver(false);
			cc.setGameOver();
			//清除存储数据
			xlist.clear();
			yl
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值