这是学习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