简易人机对弈算法的五子棋程序

简易⼈机对弈算法的五⼦棋程序
要求的五⼦棋游戏应达到以下⼏⽅⾯的要求:
(1)运⾏程序后即刻出现棋盘并可以开始下棋;
(2)⼈机对弈时,先⼿为⿊棋,后⼿为⽩棋;⼈为先⼿,计算机为后⼿;
(3)程序能响应⿏标点击并在相应位置画出棋⼦;
(4)计算机具有⼀定的智能,能够与⼈进⾏五⼦棋对弈;usb话筒
(5)程序可以正确判断出局⾯的胜负情况并及时报出结果,终⽌棋局;
(6)尽可能实现⼈⼈对战功能;
(7)重新开始:在游戏途中,可以选择重新开始,中断游戏并重新开始。
设计⼈机对弈五⼦棋程序,实现⼈与计算机进⾏五⼦棋对弈,具体任务如下:
(1)棋盘布局设计
(2)能进⾏基本的五⼦棋操作,有图形界⾯,能够⽤⿏标进⾏操作;
(3)编程实现棋⼦的绘制;
(4)增加具体的功能如重开⼀局等功能;
(5)胜负判断的功能,程序能对下棋的结果进⾏判断,分出胜负,并显⽰获胜⽅;
(6)运⾏测试程序,调试纠正运⾏错误。
(7)游戏内容:采⽤⽆“禁⼿”的规则,相同颜⾊的棋⼦,五⼦⼀线为胜。
2.3 ⼯作原理
(1)⼯作过程
运⾏程序后,⾸先出现五⼦棋游戏窗体,⽤户点击游戏菜单项,出现相关⼦菜单,选择模式⼦菜单中的⼈机对弈便可进⼊⼈机对弈模式。然后移动⿏标,在窗体的棋盘上点击⿏标下⼦,即可在棋盘中相应位置显⽰下的对应棋⼦。接下来计算机会根据⽤户下的棋,采取穷举法选择⼋个⽅向上赢⾯最⼤的位置下⼦,⽤户与计算机谁先达到五⼦连成⼀线,谁便是获胜⽅。若选择模式⼦菜单中的⼈⼈对战便
可进⼊⼈⼈对战模式。两个⽤户可同时玩游戏,同样谁先达到五⼦连成⼀线,谁便是获胜⽅。若双⽅势均⼒敌,可选择游戏菜单项中的棋盘⼦菜单,点击⼤号棋盘或超⼤号棋盘,以便避免棋盘空间不⾜造成⽆法分出胜负的情况。若觉得窗体外观不太美观,可选择外观菜单中的三个选项进⾏选择。为了显⽰程序的相关制作信息,程序提供了版本菜单进⾏显⽰。具体功能实现见第四章节运⾏调试及分析讨论。
(2)⼯作原理
利⽤图形界⾯编程实现,利⽤到的知识点包括:
窗体的创建和应⽤界⾯布局;
事件处理,包括按钮的动作事件处理,⿏标事件,窗体事件;
接⼝知识:事件处理中通过接⼝约束事件监听者必须实现相应接⼝中定义的⽅法;
流程控制语句:通过条件判断区分不同事件源,作不同操作处理。
棋⼦状态控制:通过arrMapShow数组来判断是下什么颜⾊的棋⼦,如果是计算机下棋,则计算棋盘上某⼀放个⼋个⽅向上棋⼦的最⼤值,通过调⽤readyplay( )⽅法判断某位置是否可下棋。
3、具体实现
总共涉及五类,分别为:ChessFrame、ChessModel、ChessWindowEvent、FiveChessAppletDemo、MainPanel。
引⼊的java包为:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.io.PrintStream;
import javax.swing.JComponent;
import javax.swing.JPanel;
3.1 类设计
(1) 类名:FiveChessAppletDemo
作⽤:显⽰五⼦棋游戏窗体。
类中含有的⽅法介绍:
main()⽅法:程序运⾏的⼊⼝,创建了ChessFrame类的⼀个实例对象(cf),并启动屏幕显⽰显⽰该实例对象。
(2) 类名:ChessFrame
作⽤:创建五⼦棋游戏主窗体和菜单。
该类继承JFrame类,实现ActionListener接⼝。
类中含有的⽅法介绍:
ChessFrame()构造⽅法:构造五⼦棋游戏的主窗体;博物馆展柜制作
makeMenu()⽅法:构造五⼦棋游戏的主菜单;
makeMenuItem()⽅法:构造五⼦棋游戏的菜单项;
makeRadioButtonMenuItem()⽅法:构造五⼦棋游戏的单选按钮式菜单项;
mapsize()⽅法:获取棋盘⼤⼩;
restart()⽅法:重新开局;
actionperformed()⽅法:异常的捕获及不同模式、不同棋盘⼤⼩以及下拉菜单功能的实现。
(3) 类名:ChessModel
作⽤:实现了整个五⼦棋程序算法的核⼼。采⽤穷举法判断⼋个⽅向上存在棋⼦的最⼤值进⾏对弈。
类中含有的主要⽅法介绍:
类中含有的主要⽅法介绍:
ChessModel()构造⽅法:根据不同的棋盘模式(modeChess)来构建对应⼤⼩的棋盘;
PanelInit()⽅法:按照棋盘模式构建棋盘⼤⼩;
badxy()⽅法:判断下⼦的横向、纵向坐标是否越界;
chessExist()⽅法:计算棋盘上某⼀⽅格上⼋个⽅向棋⼦的最⼤值,(这⼋个⽅向分别是:左、右、上、下、左上、左下、右上、右下);
readyplay()⽅法:判断该坐标位置是否可下棋⼦;
play()⽅法:在该坐标位置下棋⼦;
computerDo()⽅法:⽤穷举法判断每⼀个坐标点的⼋个⽅向的的最⼤棋⼦数,最后得出棋⼦数最⼤值的坐标,下⼦;
checkMax()⽅法:计算棋盘上某⼀⽅格上⼋个⽅向棋⼦的最⼤值;
judgeSuccess()⽅法:判断胜负;
showSuccess()⽅法:赢棋后的提⽰;
showDefeat()⽅法:输棋后的提⽰。
(4) 类名:MainPanel
作⽤:构建⼀个⾯板,在该⾯板上画上棋盘;处理在该棋盘上的⿏标事件(如⿏标左键点击、⿏标右
键点击、⿏标拖动等);
该类继承JPanel类,实现MouseListener、MouseMotionListener接⼝。
类中含有的主要⽅法介绍:
ChessModel()⽅法:根据棋盘模式设定⾯板的⼤⼩;
setModel()⽅法:根据棋盘模式设定棋盘的宽度和⾼度;
paintComponent()⽅法:根据坐标计算出棋盘⽅格棋⼦的信息(如⽩⼦还是⿊⼦),然后调⽤draw⽅法在棋盘上画出相应的棋⼦;
draw()⽅法:根据提供的棋⼦信息(颜⾊、坐标)画棋⼦;
mousePressed ()⽅法:响应⿏标的点击事件,根据⿏标的点击来下棋,根据下棋判断胜负、判断是否⼈机对弈等;
mouseMoved()⽅法:响应⿏标的拖动事件。
(5) 类名: ChessWindowEvent
作⽤:响应退出窗⼝。该类继承WindowAdapter。
类中含有的⽅法介绍:
windowClosing()⽅法:处理窗⼝关闭;
ChessWindowEvent ()构造⽅法:提供⽆参构造⽅法。
3.2 对弈策略
采⽤readyplay()⽅法判断该位置是否可以下棋,然后⽤穷举法判断每⼀个坐标点的⼋个⽅向,即左、右、上、下、左上、左下、右上、右下,棋⼦的最⼤值,最后得出最⼤值的坐标,下⼦。最后采⽤judgeCuccess()⽅法,判断⼋个⽅向上是否满五个同⾊棋⼦,若有,则成功,反之则失败。
4、运⾏调试与分析讨论
图4-1 程序运⾏初始界⾯
图4-2 ⼈机/⼈⼈对弈模式选择界⾯
图4-3 ⼈机对弈界⾯
图4-4棋盘选择界⾯
#源码和注释
package 五⼦棋;
import javafx.stage.WindowEvent;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.io.PrintStream;
import java.sql.SQLOutput;
import javax.swing.JComponent;
import javax.swing.JPanel;
/
* *main ⽅法创建了 ChessFrame 类的⼀个实例对象(cf)
, *并启动屏幕显⽰显⽰该实例对象。 **/
public class FiveChessAppletDemo {
public static void main(String args[]){电位器旋钮
ChessFrame cf= new ChessFrame();
cf.show();
}
}
/* *类 ChessFrame 主要功能是创建五⼦棋游戏主窗体和菜单 **/
class ChessFrame extends JFrame implements ActionListener{
private String[] strsize={"20x15","30x20","40x30","50x50"};
private String[] strmode={"⼈机对弈","⼈⼈对弈"};
public static boolean iscomputer=true,checkcomputer=true;
private int width,height;
private ChessModel cm;
private MainPanel mp;
//构造五⼦棋游戏的主窗体
public ChessFrame() {
this.setTitle("五⼦棋游戏");  //菜单标题
cm=new ChessModel(1);        //创建棋盘,默认第⼀种模式
mp=new MainPanel(cm);        //落⼦⽤的画笔,处理⿏标点击事件
mp=new MainPanel(cm);        //落⼦⽤的画笔,处理⿏标点击事件
Container ContentPane();  //获得当前JFramede的内容⾯板
con.add(mp,"Center");                //添加⾯板对象到当前的jframe自动皂液器
this.setResizable(false);            //设置当前窗⼝不能⾃由改变⼤⼩
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //关闭窗⼝就结束程序
this.addWindowListener(new WindowAdapter(){            //匿名内部类
public void windowClosing(WindowEvent e){
}
});                          //表⽰在窗⼝添加⼀个Windows事件消息,⽤于退出
MapSize(20,15);                                  //棋盘⼤⼩
JMenuBar mbar=new JMenuBar();                    //创建菜单栏对象
this.setJMenuBar(mbar);
JMenu gameMenu=new JMenu("游戏");                //创建菜单栏游戏
mbar.add(makeMenu(gameMenu,new Object[] { "开局", "棋盘","模式",null,"退出" },this));
JMenu lookMenu=new JMenu("视图");
mbar.add(makeMenu(lookMenu,new Object[] { "Metal","Motif","Windows" },this));
JMenu helpMenu=new JMenu("帮助");
mbar.add(makeMenu(helpMenu,new Object[] { "关于" },this));
}
//构造五⼦棋游戏的主菜单
public JMenu makeMenu(Object parent,Object items[],Object target){
JMenu m=null;
if(parent instanceof JMenu)
ck666
m=(JMenu)parent;
else if(parent instanceof String)
m=new JMenu((String)parent);
else
return null;
for(int i= 0;i<items.length;i++)
if(items[i]== null)
m.addSeparator();                              //如果为空,在菜单项添加分割线
else if(items[i] == "棋盘"){
JMenu jm=new JMenu("棋盘");
ButtonGroup group=new ButtonGroup();  //每个JRadioButton都是独⽴的,需要加⼊到ButtonGroup对象,
JRadioButtonMenuItem rmenu;            //类表⽰可以包含在菜单中的复选框。选中菜单中的复选框可将控件的状态从打开更改为关闭或从关闭更改为打开。
挤压爆破
for(int j=0;j<strsize.length;j++){
rmenu=makeRadioButtonMenuItem(strsize[j],target);
if(j==0) rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}else if(items[i]== "模式"){
JMenu jm=new JMenu("模式");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for(int h=0;h<strmode.length;h++){        //strmode ⼈机对弈和⼈⼈对弈
rmenu=makeRadioButtonMenuItem(strmode[h],target);
if(h==0)
rmenu.setSelected(true);          //默认⼈机对弈
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}else
m.add(makeMenuItem(items[i],target));
return m;
}
//构造五⼦棋游戏的菜单项
public JMenuItem makeMenuItem(Object item,Object target){
JMenuItem r= null;
if(item instanceof String)
r=new JMenuItem((String)item);
else if(item instanceof JMenuItem)

本文发布于:2024-09-21 02:40:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/221129.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:棋盘   游戏   判断   菜单   程序   事件   模式   点击
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议