JAVA期末课题实践考察--五子棋游戏设计
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/*
*main方法创建了ChessFrame类的一个实例对象(cf),
*并启动屏幕显示显示该实例对象。
**/
public class FiveChessAppletDemo {
public static void main(String args[]){
ChessFrame cf = new ChessFrame();
cf.setVisible(true);
}
}
/*
*类ChessFrame主要功能是创建五子棋游戏主窗体和菜单
**/
class ChessFrame extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 2183726320279905885L;
private String[] strsize={"20x15","30x20","40x30"};
private String[] strmode={"人机对弈","人人对弈"};
public static boolean iscomputer=true; public static boolean checkcomputer=true;
private int width,height;
private ChessModel cm;
private MainPanel mp;
//构造五子棋游戏的主窗体
public ChessFrame() {
this.setTitle("五子棋游戏");
cm=new ChessModel(1);
mp=new MainPanel(cm);
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(!ChessFrame.checkcomputer) {
ChessFrame.iscomputer=false;
} else {
ChessFrame.iscomputer=true;
}
mp.setModel(cm);
mp.repaint();
}
public boolean getiscomputer(){
return ChessFrame.iscomputer;
}
public void restart(){
int modeChess = cm.getModeChess();
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.sun.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);
}catch(Exception ee){}
if(arg.equals("20x15")){
this.width=20;
this.height=15;
cm=new ChessModel(1);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("30x20")){
this.width=30;
this.height=20;
cm=new ChessModel(2);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("40x30")){
this.width=40;
this.height=30;
cm=new ChessModel(3);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人机对弈")){
this.checkcomputer=true;
this.iscomputer=true;
cm=new ChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人人对弈")){
this.checkcomputer=false;
this.iscomputer=false;
cm=new ChessModel(cm.getModeChess());
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 {
//棋盘的宽度、高度、棋盘的模式(如20×15)
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() {}
//该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘
public ChessModel(int modeChess){
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 setisOdd(boolean isodd){
if(isodd)
this.isOdd=true;
else
this.isOdd=false;
}
//获取某棋盘方格是否有棋子的标识值
public boolean getisExist(){
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.arrMapS