算法课程设计五子棋Word文件下载.docx
- 文档编号:8344542
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:55
- 大小:163.86KB
算法课程设计五子棋Word文件下载.docx
《算法课程设计五子棋Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法课程设计五子棋Word文件下载.docx(55页珍藏版)》请在冰点文库上搜索。
只有当鼠标单击在棋盘网格交叉点附近时才可下子,点击其他地方及已有子的位置不能下子,且应给出相应提示;
(4)在适当位置可显示比赛结果,比赛中能随时存储当前棋局。
二、五子棋介绍
五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,
五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,
就是黑棋下第2手棋,盘面第3着棋之后,白方在应白2之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第5手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
三.程序流程
四.代码设计与分析
main方法创建了ChessFrame类的一个实例对象(cf),
并启动屏幕显示显示该实例对象。
publicclassFiveChessAppletDemo{
publicstaticvoidmain(Stringargs[]){
ChessFramecf=newChessFrame();
cf.show();
}
用类ChessFrame创建五子棋游戏主窗体和菜单
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
importjavax.swing.*;
importjava.io.PrintStream;
importjavax.swing.JComponent;
importjavax.swing.JPanel;
classChessFrameextendsJFrameimplementsActionListener{
privateString[]strsize={"
标准棋盘"
"
改进棋盘"
扩大棋盘"
};
privateString[]strmode={"
人机对战"
人人对战"
publicstaticbooleaniscomputer=true,checkcomputer=true;
privateintwidth,height;
privateChessModelcm;
privateMainPanelmp;
构造五子棋游戏的主窗体
publicChessFrame(){
this.setTitle("
五子棋游戏"
);
cm=newChessModel
(1);
mp=newMainPanel(cm);
Containercon=this.getContentPane();
con.add(mp,"
Center"
this.setResizable(false);
this.addWindowListener(newChessWindowEvent());
MapSize(14,14);
JMenuBarmbar=newJMenuBar();
this.setJMenuBar(mbar);
JMenugameMenu=newJMenu("
游戏"
mbar.add(makeMenu(gameMenu,newObject[]{
"
开局"
null,"
棋盘"
null,"
模式"
null,"
退出"
},this));
JMenulookMenu=newJMenu("
外观"
mbar.add(makeMenu(lookMenu,newObject[]{
类型一"
类型二"
类型三"
},this));
JMenuhelpMenu=newJMenu("
版本"
mbar.add(makeMenu(helpMenu,newObject[]{
关于"
构造五子棋游戏的主菜单
publicJMenumakeMenu(Objectparent,Objectitems[],Objecttarget){
JMenum=null;
if(parentinstanceofJMenu)
m=(JMenu)parent;
elseif(parentinstanceofString)
m=newJMenu((String)parent);
else
returnnull;
for(inti=0;
i<
items.length;
i++)
if(items[i]==null)
m.addSeparator();
elseif(items[i]=="
){
JMenujm=newJMenu("
ButtonGroupgroup=newButtonGroup();
JRadioButtonMenuItemrmenu;
for(intj=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);
}elseif(items[i]=="
for(inth=0;
h<
strmode.length;
h++){
rmenu=makeRadioButtonMenuItem(strmode[h],target);
if(h==0)
}else
m.add(makeMenuItem(items[i],target));
returnm;
构造五子棋游戏的菜单项
publicJMenuItemmakeMenuItem(Objectitem,Objecttarget){
JMenuItemr=null;
if(iteminstanceofString)
r=newJMenuItem((String)item);
elseif(iteminstanceofJMenuItem)
r=(JMenuItem)item;
if(targetinstanceofActionListener)
r.addActionListener((ActionListener)target);
returnr;
构造五子棋游戏的单选按钮式菜单项
publicJRadioButtonMenuItemmakeRadioButtonMenuItem(
Objectitem,Objecttarget){
JRadioButtonMenuItemr=null;
r=newJRadioButtonMenuItem((String)item);
elseif(iteminstanceofJRadioButtonMenuItem)
r=(JRadioButtonMenuItem)item;
publicvoidMapSize(intw,inth){
setSize(w*24,h*27);
if(this.checkcomputer)
this.iscomputer=true;
this.iscomputer=false;
mp.setModel(cm);
mp.repaint();
publicbooleangetiscomputer(){
returnthis.iscomputer;
publicvoidrestart(){
intmodeChess=cm.getModeChess();
if(modeChess<
=3&
&
modeChess>
=0){
cm=newChessModel(modeChess);
MapSize(cm.getWidth(),cm.getHeight());
publicvoidactionPerformed(ActionEvente){
Stringarg=e.getActionCommand();
try{
if(arg.equals("
))
UIManager.setLookAndFeel(
com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
elseif(arg.equals("
com.sun.java.swing.plaf.motif.MotifLookAndFeel"
javax.swing.plaf.metal.MetalLookAndFeel"
);
SwingUtilities.updateComponentTreeUI(this);
}catch(Exceptionee){}
if(arg.equals("
)){
this.width=14;
this.height=14;
MapSize(this.width,this.height);
this.width=18;
this.height=18;
cm=newChessModel
(2);
this.width=22;
this.height=22;
cm=newChessModel(3);
this.checkcomputer=true;
cm=newChessModel(cm.getModeChess());
this.checkcomputer=false;
restart();
JOptionPane.showMessageDialog(null,"
第一版"
"
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
用类ChessModel实现了整个五子棋程序算法的核心
classChessModel{
规定棋盘的宽度、高度、棋盘的模式
privateintwidth,height,modeChess;
规定棋盘方格的横向、纵向坐标
privateintx=0,y=0;
棋盘方格的横向、纵向坐标所对应的棋子颜色,
数组arrMapShow只有3个值:
1,2,3,-1,
其中1代表该棋盘方格上下的棋子为黑子,
2代表该棋盘方格上下的棋子为白子,
3代表为该棋盘方格上没有棋子,
-1代表该棋盘方格不能够下棋子
privateint[][]arrMapShow;
交换棋手的标识,棋盘方格上是否有棋子的标识符
privatebooleanisOdd,isExist;
publicChessModel(){}
该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘
publicChessModel(intmodeChess){
this.isOdd=true;
if(modeChess==1){
PanelInit(14,14,modeChess);
if(modeChess==2){
PanelInit(18,18,modeChess);
if(modeChess==3){
PanelInit(22,22,modeChess);
按照棋盘模式构建棋盘大小
privatevoidPanelInit(intwidth,intheight,intmodeChess){
this.width=width;
this.height=height;
this.modeChess=modeChess;
arrMapShow=newint[width+1][height+1];
=width;
i++){
for(intj=0;
j<
=height;
j++){
arrMapShow[i][j]=-1;
获取是否交换棋手的标识符
publicbooleangetisOdd(){
returnthis.isOdd;
设置交换棋手的标识符
publicvoidsetisOdd(booleanisodd){
if(isodd)
this.isOdd=false;
获取某棋盘方格是否有棋子的标识值
publicbooleangetisExist(){
returnthis.isExist;
获取棋盘宽度
publicintgetWidth(){
returnthis.width;
获取棋盘高度
publicintgetHeight(){
returnthis.height;
获取棋盘模式
publicintgetModeChess(){
returnthis.modeChess;
获取棋盘方格上棋子的信息
publicint[][]getarrMapShow(){
returnarrMapShow;
判断下子的横向、纵向坐标是否越界
privatebooleanbadxy(intx,inty){
if(x>
=width+20||x<
0)
returntrue;
returny>
=height+20||y<
0;
计算棋盘上某一方格上八个方向棋子的最大值,
这八个方向分别是:
左、右、上、下、左上、左下、右上、右下
publicbooleanchessExist(inti,intj){
if(this.arrMapShow[i][j]==1||this.arrMapShow[i][j]==2)
returnfalse;
判断该坐标位置是否可下棋子
publicvoidreadyplay(intx,inty){
if(badxy(x,y))
return;
if(chessExist(x,y))
this.arrMapShow[x][y]=3;
在该坐标位置下棋子
publicvoidplay(intx,inty){
if(chessExist(x,y)){
this.isExist=true;
this.isExist=false;
if(getisOdd()){
setisOdd(false);
this.arrMapShow[x][y]=1;
}else{
setisOdd(true);
this.arrMapShow[x][y]=2;
计算机走棋
说明:
用穷举法判断每一个坐标点的四个方向的的最大棋子数,
最后得出棋子数最大值的坐标,下子
publicvoidcomputerDo(intwidth,intheight){
intmax_black,max_white,max_temp,max=0;
System.out.println("
计算机走棋..."
for(intj=0;
算法判断是否下子
if(!
chessExist(i,j)){
判断白子的最大值
max_white=checkMax(i,j,2);
判断黑子的最大值
max_black=checkMax(i,j,1);
max_temp=Math.max(max_white,max_black);
if(max_temp>
max){
max=max_temp;
this.x=i;
this.y=j;
setX(this.x);
setY(this.y);
this.arrMapShow[this.x][this.y]=2;
记录电脑下子后的横向坐标
publicvoidsetX(intx){
this.x=x;
记录电脑下子后的纵向坐标
publicvoidsetY(inty){
this.y=y;
获取电脑下子的横向坐标
publicintgetX(){
returnthis.x;
获取电脑下子的纵向坐标
publicintgetY(){
returnthis.y;
publicintcheckMax(intx,inty,intblack_or_white){
intnum=0,max_num,max_temp=0;
intx_temp=x,y_temp=y;
intx_temp1=x_temp,y_temp1=y_temp;
判断右边
for(inti=1;
i<
5;
i++){
x_temp1+=1;
if(x_temp1>
this.width)
break;
if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)
num++;
判断左边
x_temp1=x_temp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 课程设计 五子棋