package chess;
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;
import javax.swing.JRadioButtonMenuItem;
public class FiveChesAppletDemo
{
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"};
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);
Container con=this.getContentPane();
con.add(mp,"Center");
this.setResizable(false);
this.addWindowListener(new ChessWindowEvent());
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)
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();
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++)
{
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)
r=(JMenuItem) item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
//构造五子棋游戏的单选按钮式菜单项
public JRadioButtonMenuItem makeRadioButtonMenuItem
(Object item,Object target)
{
JRadioButtonMenuItem r=null;
if(item instanceof String)
r=new JRadioButtonMenuItem
((String )item);
else if(item instanceof JRadioButtonMenuItem)
r=(JRadioButtonMenuItem)item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
public void MapSize(int w,int h)
{
setSize (w*20+50,h*20+100);
if(this.checkcomputer)
this.checkcomputer=true;
else
this.iscomputer=false;
mp.setModel(cm);
mp.repaint();
}
public boolean getiscomputer()
{
return this.iscomputer;
}
public void restart()
{
int modeChess=cm.getModelChess();
if(modeChess<=3&&modeChess>=1)
{
cm=new ChessModel(modeChess);
MapSize(cm.getWidth(),cm.getHeight());
}
else
{
System.out.println("\u81EA\u5B9A\u4E49");
}
}
public void actionPerformed (ActionEvent e)
{
String arg=e.getActionCommand();
try
{
if(arg.equals("Windows"))
UIManager.setLookAndFeel
("com.sum.java.swing.plaf.windows.WindowsLookAndFeel");
else if(arg.equals("Motif"))
UIManager.setLookAndFeel
("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
else
UIManager.setLookAndFeel
("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人机对弈"))
{
this.checkcomputer=true;
this.iscomputer=true;
cm=new ChessModel(cm.getModelChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人人对弈"))
{
this.checkcomputer=false;
this.iscomputer=false;
cm=new ChessModel(cm.getModelChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("开局"))
{
restart();
}
if(arg.equals("关于"))
JOptionPane.showMessageDialog(this,"五子棋游戏","关于",0);
if(arg.equals("退出"))
System.exit(0);
}
}
/*
* 类ChessModel实现整个五子棋程序算法的核心
*/
class ChessModel
{
//棋盘的宽度、高度、棋盘的模式
private int width,height,modeChess;
// 棋盘方向的横向、纵向坐标
private int x=0,y=0;
//棋盘方格的横向、纵向坐标所对应的棋子颜色
//数组arrMapShow只有3个值:1,2,3,-5,
//其中1代表该棋盘方格上下的棋子为黑子
//2代表该棋盘方格上下为白子
//3代表为该棋盘
//-5代表该棋盘方格不能够下棋子
private int [] [] arrMapShow;
//交换棋手的标识,棋盘方格上是否有棋子的标志符
private boolean isOdd,isExist;
public ChessModel(){}
//该构造方法根据不同的棋盘模式来构造对应大小的棋盘
public ChessModel(int modelChess)
{
this.isOdd=true;
if(modeChess==1)
{
PanelInit(20,15,modeChess);
}
if(modeChess==2)
{
PanelInit(30,20,modeChess);
}
if(modeChess==3)
{
PanelInit(40,30,modeChess);
}
}
//按照棋盘模式构造棋盘大小
private void PanelInit(int width,int height,int modeChess)
{
this.width=width;
this.height=height;
this.modeChess=modeChess;
arrMapShow=new int[width+1][height+1];
for(int i=0;i<width;i++){
for(int j=0;j<=height;j++){
arrMapShow[i][j]=-5;
}
}
}
//获取是否交换棋手的标识符
public boolean getisOdd()
{
return this.isOdd;
}
//设置交换棋手的标识符
public void getisOdd(boolean isOdd)
{
if(isOdd)
{
this.isOdd=true;
else
this.isOdd=false;
}
//获取某棋盘方格是否有棋子的标识符
public boolean getisExit()
{
return this.isExist;
}
//获取棋盘宽度
public int getWidth ()
{
return this.width;
}
//获取棋盘高度
public int getHeight ()
{
return this.height;
}
//获取棋盘模式
public int getModeChess()
{
return this.modeChess;
}
//获取棋盘方格上棋子的信息
public int[][]getarrMapShow()
{
return arrMapShow;
}
//判断下子的横向、纵向坐标是否越界
private boolean badxy (int x,int y)
{
if(x>=width+20||x<0)
return true;
return y>=height+20||y<0;
}
//计算棋盘上某一方格上八个方向棋子的最大值。
//这八个方向分别是:左、右、上、下、左上、左下、右上、右下。
public boolean chessExist(int i,int j)
{
if(this.arrMapShow[i][j]==1||this.arrMapShow[i][j]==2)
return true;
return false;
}
//判断该坐标位置是否可下棋子
public void readplay(int x,int y)
{
if(badxy(x,y))
return;
if(chessExist(x,y))
return;
this.arrMapShow[x][y]=3;
}
//在该坐标位置下棋子
public void play (int x,int y)
{
if(badxy(x,y))
return;
if(chessExist(x,y))
{
this.isExist=true;
return;
}
else
this.isExist=false;
if(getisOdd())
{
setOdd(false);
this.arrMapShow[x][y]=1;
}
else
wuziqi.rar_五子棋 人机 java
版权申诉
95 浏览量
2022-09-14
17:56:50
上传
评论
收藏 7KB RAR 举报
alvarocfc
- 粉丝: 109
- 资源: 1万+
最新资源
- VIVADO中UART IP核使用
- 【深度学习实际案例解析】深度学习实际案例解析
- 封装swagger组件,提供全新UI以及无状态登录接口调用解决方案
- 小龙坎支局2024年4月渠道积分核对数据.xlam
- onlyoffice搭建及与alist使用的view.html
- Quadcopter-UAV-attitude-estimation-linux常用命令大全demo
- Quadcopter-UAV-attitude-estimation-based-on-数据库课程设计
- pbdlib-python-master.zip
- 43904245495352013_base.apk
- 基于springboot+vue + redis的工作流审批系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈