1、JAVA课程设计 设计题目:五子棋游戏 一 . 简要的介绍五子棋 1. 五子棋的起源 五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。 2.现在五子棋标准棋盘(如图所示) 3.五子棋的棋子 五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同, 4.五子棋规则 五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手
2、,又规定了“三手交换”, 就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。和 “五手两打法”,就是 黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。不过一般 爱好者不需要遵循这么多规则。 二 .程序流程 三 .代码设计与分析 main 方法创建了 ChessFrame类的一个实例对象( cf), 并启动屏幕显示显示该实例对象。 public class FiveChessAppletDemo public static void main(String args) Che
3、ssFrame cf = new ChessFrame(); cf.show(); 用类 ChessFrame创建五子棋游戏主窗体和菜单 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; class ChessFrame extends JFrame implements ActionListener
4、 private String strsize=“标准棋盘 “,“改进棋盘 “,“扩大棋盘 “; 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=
5、new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,“Center“); this.setResizable(false); this.addWindowListener(new ChessWindowEvent(); MapSize(14,14); JMenuBar mbar = new JMenuBar(); this.setJMenuBar(mbar); JMenu gameMenu = new JMenu(“游戏 “); mbar.add(makeMenu(gameMenu, new Object “开局
6、 “, null,“棋盘 “,null,“模式 “, null, “退出 “ , this); JMenu lookMenu =new JMenu(“外观 “); mbar.add(makeMenu(lookMenu,new Object “类型一 “,“类型二 “,“类型三 “ ,this); JMenu helpMenu = new JMenu(“版本 “); mbar.add(makeMenu(helpMenu, new Object “关于 “ , this); 构造五子棋游戏的主菜 单 public JMenu makeMenu(Object parent, Object items
7、, 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 = 0) cm = new ChessModel(modeChess); MapSize(cm.getWidth(),cm.getHeight(); public void actionPerformed(ActionEvent e) Str
8、ing arg=e.getActionCommand(); try if (arg.equals(“类型三 “) UIManager.setLookAndFeel( “com.sun.java.swing.plaf.windows.WindowsLookAndFeel“); else if(arg.equals(“类型二 “) UIManager.setLookAndFeel( “com.sun.java.swing.plaf.motif.MotifLookAndFeel“); else UIManager.setLookAndFeel( “javax.swing.plaf.metal.Met
9、alLookAndFeel“ ); SwingUtilities.updateComponentTreeUI(this); catch(Exception ee) if(arg.equals(“标准棋盘 “) this.width=14; this.height=14; cm=new ChessModel(1); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(“改进棋盘 “) this.width=18; this.height=18; cm=new Ches
10、sModel(2); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(“扩大棋盘 “) this.width=22; this.height=22; cm=new ChessModel(3); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(“人机对战 “) this.checkcomputer=true; this.iscomp
11、uter=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.updateCo
12、mponentTreeUI(this); if(arg.equals(“开局 “) restart(); if(arg.equals(“关于 “) JOptionPane.showMessageDialog(null, “第一版 “, “版本“,JOptionPane.PLAIN_MESSAGE ); if(arg.equals(“退出 “) System.exit(0); 用类 ChessModel实现了整个五子棋程序算法的核心 import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swi
13、ng.*; import java.io.PrintStream; import javax.swing.JComponent; import javax.swing.JPanel; class ChessModel 规定棋盘的宽度、高度、棋盘的模式 private int width,height,modeChess; 规定棋盘方格的横向、纵向坐标 private int x=0,y=0; 棋盘方格的横向、纵向坐标所对应的棋子颜色, 数组 arrMapShow只有 3个值: 1, 2, 3, -1, 其中 1代表该棋盘方格上下的棋子为黑子, 2代表该棋盘方格上下的棋子为白子, 3代表为该棋盘
14、方格上没有棋子, -1代表该棋盘方格不能够下棋子 private int arrMapShow; 交换棋手的标识,棋盘方格上是否有棋子的标识符 private boolean isOdd,isExist; public ChessModel() 该构造方法根据不同的棋盘模式( modeChess)来构建对应大小的棋盘 public ChessModel(int modeChess) this.isOdd=true; if(modeChess = 1) PanelInit(14, 14, modeChess); if(modeChess = 2) PanelInit(18, 18, modeCh
15、ess); if(modeChess = 3) PanelInit(22, 22, modeChess); 按照棋盘模式构建棋盘大小 private void PanelInit(int width, int height, int modeChess) this.width = width; this.height = height; this.modeChess = modeChess; arrMapShow = new intwidth+1height+1; for(int i = 0; i = width+20 | x = height+20 | y 0; 计算棋盘上某一方格上八个方向
16、棋 子的最大值, 这八个方向分别是:左、右、上、下、左上、左下、右上、右下 public boolean chessExist(int i,int j) if(this.arrMapShowij=1 | this.arrMapShowij=2) return true; return false; 判断该坐标位置是否可下棋子 public void readyplay(int x,int y) if(badxy(x,y) return; if (chessExist(x,y) return; this.arrMapShowxy=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() setisOdd(false); this.arrMapShowxy=1; else setisOdd(true);