计算机 142
人工智能
期末大作业
人工智能在小游戏中的实
现与应用
姓名: 郑尊源 班级: 计算机
142 学号: 1430332218
姓名: 洪煜鹏 班级: 计算机
142 学号: 1430332219
姓名: 蒋方跃 班级: 计算机
142 学号: 1430332229
姓名: 刑亚森 班级: 计算机
142 学号: 1430332226
1.小游戏内容简介
这是一个简易单机版智能五子棋小游戏,能够实现正常的人机对弈,且能下赢一般对
手,棋盘大小 16x16,横竖斜五子相连代表某一方赢,点击重新开始菜单则重新初始
化。
2. 人工智能方法介绍
采用了估值权重算法
估值算法。要求给定棋盘上一个点,求出该点在当前棋局下的权值。若在该点落子后更
容易接近胜利,则该点权值就高,越接近 5 子相连,权值越高。
首先考虑每个点有 4 个方向可以连子,每个方向上又有多种连子棋型,如活四、活三、
死三等,而这些子又可能属于己方或者对方。活四与活三的权值自然不同。而同样是活
三,己方的活三与对方的活三权值也不同,这样才能实现攻守的策略。假如现在棋局上
同时有己方的活三和对方的活三,此时轮到我方落子,则正常情况下应当在己方活三上
落子,使之成为活四,从而获胜。则计算机在判断棋局时,遇到己方活三,权值应当较
高,遇到对方活三,权值应当较低。
以上即是对于估值函数所应达到的要求的分析
3. 程序内容分段分析
public class BackGround extends JFrame {
public BackGround() {
Container contentPane = getContentPane();
final Game panel = new Game();
panel.setBackground(Color.orange);
contentPane.setBackground(Color.orange);
contentPane.add(panel);
setBounds(550, 240, 560, 560);
setTitle("智能五子棋游戏");
setResizable(false);
panel.setCursor(new Cursor(Cursor.HAND_CURSOR));
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("菜单");
JMenuItem menuStart = new JMenuItem("重新开始");
menuStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
panel.ResetGame();
panel.repaint();
}
});
JMenuItem menuExit = new JMenuItem("退出");
menuExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menuBar.add(menu);
menu.add(menuStart);
menu.add(menuExit);
this.setJMenuBar(menuBar);
}
}
这个 BackGround 类继承 JFrame 画出游戏整个框架,给菜单添加 addAconListener 消息事
件,执行游戏初始化和重画,还有一个退出消息执行 System.exit(0)。这里就使用到了 Java
Swing 图形化界面技术。
以下所有方法都是 Game 类方法
1.paintComponent 方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < 16; i++)
for (int j = 0; j < 16; j++) {
g.drawLine(50, 50 + j * 30, 500, 50 + j * 30);
}
for (int i = 0; i < 16; i++)
for (int j = 0; j < 16; j++) {
g.drawLine(50 + j * 30, 50, 50 + j * 30, 500);
}
for (int i = 0; i < 16; i++) {
String number = Integer.toString(i);
g.drawString(number, 46 + 30 * i, 45);
}
for (int i = 1; i < 16; i++) {
String number = Integer.toString(i);
g.drawString(number, 33, 53 + 30 * i);
}
updatePaint(g);
}
Game 类继承 JPanel,重写其父类的 paintComponent 方法,画出棋盘横线,竖线,标记值。
整个棋盘 16*16。最后要调用 updatePaint 函数,用来刷新棋盘界面。
2. ResetGame 方法
public void ResetGame() {
for (i = 0; i < 16; i++)
for (j = 0; j < 16; j++) {
this.pgrades[i][j] = 0;
this.cgrades[i][j] = 0;
this.board[i][j] = 2;
}
for (i = 0; i < 16; i++)
for (j = 0; j < 12; j++) {
for (k = 0; k < 5; k++) {
this.ptable[j + k][i][icount] = true;
this.ctable[j + k][i][icount] = true;
}
icount++;
}
for (i = 0; i < 16; i++)
for (j = 0; j < 12; j++) {
for (k = 0; k < 5; k++) {
this.ptable[i][j + k][icount] = true;
this.ctable[i][j + k][icount] = true;
}