基于Java五子棋游戏的设计源代码及全套资料
Java五子棋游戏源代码(人机对战)
//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;/**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"};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);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);elsereturn 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);}elsem.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;elsereturn 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;elsereturn 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.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.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");elseUIManager.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;elsethis.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.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}//判断该坐标位置是否可下棋子public void readyplay(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;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}//计算机走棋/**说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,*最后得出棋子数最大值的坐标,下子**/public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){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;}//记录电脑下子后的横向坐标public void setX(int x){this.x=x;}//记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}//获取电脑下子的横向坐标public int getX(){return this.x;}//获取电脑下子的纵向坐标public int getY(){return this.y;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;//judge rightfor(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge leftx_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;//judge upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge downy_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judge left_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge right_downx_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judge right_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge left_downx_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}//判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;//判断右边for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断左边x_temp1=x_temp;for(int i=1;i<6;i++){if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断上方x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断下方y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断左上x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断右下x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width) break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断右上x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断左下x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}//赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了,好厉害!","win",RMATION_MESSAGE);}//输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了,请重新开始!","lost",RMATION_MESSAGE);}}/**类MainPanel主要完成如下功能:*1、构建一个面板,在该面板上画上棋盘;*2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)**/class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{private int width,height;//棋盘的宽度和高度private ChessModel cm;//根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}//根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}//根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),//然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}//根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){int x = 20 * i+20;int y = 20 * j+20;//画棋盘if(i!=width && j!=height){g.setColor(Color.white);g.drawRect(x,y,20,20);}//画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}//画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}//响应鼠标的点击事件,根据鼠标的点击来下棋,//根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]);repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}//判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}//响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}class ChessWindowEvent extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0);}ChessWindowEvent(){}}。
基于JAVA的五子棋游戏系统设计与实现
基于JAVA的五子棋游戏系统设计与实现五子棋是一种双人对弈的棋类游戏,也是一种非常经典的游戏类型。
设计一个基于JAVA的五子棋游戏系统,需要考虑到以下几个方面:游戏规则、游戏界面和游戏功能的实现。
一、游戏规则的设计:五子棋的规则非常简单,双方轮流下棋,先连成五子的一方为胜。
游戏区域是一个15x15的棋盘,棋盘上有黑白两种棋子。
玩家可以通过点击棋盘的不同位置来下棋。
二、游戏界面的设计与实现:1. 创建一个游戏主界面,并在界面上绘制棋盘。
可以使用JAVA Swing来创建界面,并使用Graphics类来实现绘制棋盘的功能。
2.在棋盘上绘制出15x15的格子,并设置鼠标点击事件,以便玩家可以通过点击棋盘的不同位置来下棋。
3. 在玩家下棋后,使用Graphics类来在棋盘上绘制出对应的棋子。
可以使用不同的颜色来区分黑白两种棋子。
三、游戏功能的实现:1.实现轮流下棋的功能。
通过一个变量来记录当前轮到哪个玩家下棋,玩家可以通过鼠标点击事件来确定落子的位置。
2.实现判断胜负的功能。
在每次下棋后,判断是否已经有五子连线的情况出现。
可以使用一个二维数组来保存棋盘上每个位置的棋子情况,并根据棋子位置来判断是否满足胜利条件。
3.实现悔棋功能。
当玩家点击悔棋按钮时,可以将最后一步下的棋子清除,并将轮到下棋的玩家切换至上一步下棋的玩家。
4.实现重新开始的功能。
当游戏结束后,可以通过点击重新开始按钮来重新开始游戏。
以上是一个基于JAVA的五子棋游戏系统的设计与实现的简要思路。
在实际的开发过程中,还需要考虑到异常处理、界面美化、多人对战等更多的细节。
希望以上内容能够帮助您完成五子棋游戏系统的设计与实现。
基于JAVA的五子棋游戏设计
基于JAVA的五子棋游戏设计五子棋是一种非常有趣的棋类游戏,主要目标是在棋盘上先形成五个连续的子的一方取胜。
为了设计一款基于JAVA的五子棋游戏,我们需要考虑以下几个方面:1.游戏界面设计:游戏界面需要包括一个棋盘和一些控制按钮。
可以使用Java GUI库(如Swing或JavaFX)来创建游戏界面,使用布局管理器来放置棋盘和按钮。
2.游戏规则设计:游戏规则非常简单。
两位玩家交替下棋,玩家可以在棋盘上的任意空闲位置下子。
首先形成五个连续的子的一方获胜。
可以使用二维数组来表示棋盘的状态,并在每次下子后更新数组的值。
3.游戏逻辑设计:游戏逻辑包括判断玩家下子的合法性、判断游戏是否结束以及判断获胜方等。
可以使用条件语句和循环结构来实现游戏逻辑。
下面是一种可能的五子棋游戏设计方案:```javaimport javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class GomokuGame extends JFrameprivate final int BOARD_SIZE = 15;private JButton[][] buttons;private int[][] board;private int currentPlayer;public GomokuGamsetTitle("Gomoku Game");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(600, 600);setLayout(new GridLayout(BOARD_SIZE, BOARD_SIZE));buttons = new JButton[BOARD_SIZE][BOARD_SIZE];board = new int[BOARD_SIZE][BOARD_SIZE];currentPlayer = 1;for (int i = 0; i < BOARD_SIZE; i++)for (int j = 0; j < BOARD_SIZE; j++)buttons[i][j] = new JButton(;buttons[i][j].setBackground(Color.WHITE);buttons[i][j].addActionListener(new ButtonListener(i, j));add(buttons[i][j]);}}setVisible(true);}private class ButtonListener implements ActionListener private int row;private int col;public ButtonListener(int row, int col)this.row = row;this.col = col;}public void actionPerformed(ActionEvent e)if (buttons[row][col].getBackground( == Color.WHITE)buttons[row][col].setBackground(currentPlayer == 1 ? Color.BLACK : Color.WHITE);board[row][col] = currentPlayer;if (isWinningMove(row, col))JOptionPane.showMessageDialog(null, "Player " + currentPlayer + " wins!");System.exit(0);}currentPlayer = currentPlayer == 1 ? 2 : 1;} elseJOptionPane.showMessageDialog(null, "Invalid move!");}}}private boolean isWinningMove(int row, int col)// Check horizontalint count = 0;for (int i = row - 4; i <= row + 4; i++)if (i >= 0 && i < BOARD_SIZE && board[i][col] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}// Check verticalcount = 0;for (int j = col - 4; j <= col + 4; j++)if (j >= 0 && j < BOARD_SIZE && board[row][j] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}// Check diagonal1count = 0;for (int i = row - 4, j = col - 4; i <= row + 4 && j <= col + 4; i++, j++)if (i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE && board[i][j] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}// Check diagonal2count = 0;for (int i = row - 4, j = col + 4; i <= row + 4 && j >= col - 4; i++, j--)if (i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE && board[i][j] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}return false;}public static void main(String[] args)new GomokuGame(;}```以上是一种简单的基于JAVA的五子棋游戏设计方案,游戏界面使用了JFrame和JButton来创建,游戏逻辑通过按钮的点击事件来实现。
java五子棋源代码
package chess;import java.awt.Button;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;publicclass Chess extends JFrame implements MouseListener, Runnable {privatestaticfinallong serialVersionUID = 1L;int width = Toolkit.getDefaultToolkit().getScreenSize().width; int hight = Toolkit.getDefaultToolkit().getScreenSize().height; // 背景图片BufferedImage bjImage = null;// 保存棋子坐标int x = 0;int y = 0;// 保存之前下过的棋子坐标// 其中数据:0:表示这个点没有棋子 1:表示黑子 2:表示白子int[][] allChess = newint[19][19];// 标识当前是黑棋还是白旗下下一步boolean isBlack = true;// 标识当前游戏是否可以继续boolean canPlay = true;// 保存显示的提示信息String message = "黑方先行";// 保存最多拥有多少时间(秒)int maxTime = 0;// 做倒计时的线程类Thread t = new Thread(this);// 保存黑方与白方的剩余时间int blackTime = 0;int whiteTime = 0;// 保存双方剩余时间的显示信息String blackMessage = "无限制";String whiteMessage = "无限制";@SuppressWarnings("deprecation")public Chess() {this.setTitle("五子棋");this.setSize(500, 500);this.setLocation((width - 500) / 2, (hight - 500) / 2);this.addMouseListener(this);// this.setResizable(false);this.setVisible(true);this.setLayout(null);t.start();t.suspend();// 线程挂起// 刚打开的时候刷新屏幕,防止开始游戏时无法显示的问题this.repaint();this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);try {bjImage = ImageIO.read(newFile("C:\\Users\\cwb\\Desktop\\timg.jpg"));} catch (IOException e) {e.printStackTrace();}}@Overridepublicvoid paint(Graphics g) {// 双缓存技术防止屏幕闪烁但不知道为什么,使用双缓存技术以后,效果特不好,所以没用,如果使用的话,下面的 g 改为 g2 就可以了//BufferedImagebi=new//BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);//Graphics g=bi.createGraphics();g.drawImage(bjImage, 0, 20, this);g.setFont(new Font("黑体", Font.BOLD, 20));g.drawString("游戏信息:" + message, 120, 60);g.setFont(new Font("宋体", 0, 14));g.drawString("黑方时间:" + blackMessage, 30, 470);g.drawString("白方时间:" + whiteMessage, 260, 470);g.drawString("开始游戏", 400,100);g.drawString("游戏设置", 400,150);g.drawString("游戏说明", 400,200);g.drawString("认输", 400,300);g.drawString("关于", 400,350);g.drawString("退出", 400,400);// 绘制棋盘for (int i = 0; i< 19; i++) {g.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);g.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430); }// 标注小圆点位g.fillOval(68, 128, 4, 4);g.fillOval(308, 128, 4, 4);g.fillOval(308, 368, 4, 4);g.fillOval(68, 368, 4, 4);g.fillOval(188, 128, 4, 4);g.fillOval(68, 248, 4, 4);g.fillOval(188, 368, 4, 4);g.fillOval(188, 248, 4, 4);g.fillOval(308, 248, 4, 4);// //绘制棋子// x=(x-10)/20*20+10; //是为了取得交叉点的坐标// y=(y-70)/20*20+70;// //黑子// g.fillOval(x-7, y-7, 14, 14);// //白子// g.setColor(Color.BLACK);// g.fillOval(x-7, y-7, 14, 14);// g.setColor(Color.BLACK);// g.drawOval(x-7, y-7, 14, 14);// 输出数组中所有数值// 绘制全部棋子for (int i = 0; i< 19; i++) {for (int j = 0; j< 19; j++) {if (allChess[i][j] == 1) {// 黑子int tempX = i * 20 + 10;int tempY = j * 20 + 70;g.fillOval(tempX-7, tempY-7 , 14, 14);}if (allChess[i][j] == 2) {// 白子int tempX = i * 20 + 10;int tempY = j * 20 + 70;g.setColor(Color.WHITE);g.fillOval(tempX - 7, tempY - 7, 14, 14);g.setColor(Color.BLACK);g.drawOval(tempX - 7, tempY - 7, 14, 14); }}}}@Overridepublicvoid mouseClicked(MouseEvent e) {}privateboolean checkWin() {boolean flag = false;// 保存共有多少相同颜色棋子相连int count = 1;// 判断横向特点:allChess[x][y]中y值相同int color = allChess[x][y];// 判断横向count = this.checkCount(1, 0, color);if (count>= 5) {flag = true;} else {// 判断纵向count = this.checkCount(0, 1, color);if (count>= 5) {flag = true;} else {// 判断右上左下count = this.checkCount(1, -1, color);if (count>= 5) {flag = true;} else {// 判断左下右上count = this.checkCount(1, 1, color);if (count>= 5) {flag = true;}}}}return flag;}// 判断棋子连接数量privateint checkCount(int xChange, int yChange, int color) {int count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange>= 0 &&x + xChange<= 18 &&y + yChange>= 0 &&y + yChange<= 18&&color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange> 0) {yChange++;} else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange>= 0 &&x - xChange<= 18 &&y - yChange>= 0 &&y - yChange<= 18&&color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange> 0) {yChange++;} else {yChange--;}}}return count;}@Overridepublicvoid mouseEntered(MouseEvent arg0) {}@Overridepublicvoid mouseExited(MouseEvent arg0) {}@SuppressWarnings("deprecation")@Overridepublicvoid mousePressed(MouseEvent e) {if (canPlay == true) {x = e.getX();y = e.getY();if (x>= 10 &&x<= 370 &&y>= 70 &&y<= 430) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x - 10) / 20; // 是为了取得交叉点的坐标y = (y - 70) / 20;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋子if (isBlack == true) {allChess[x][y] = 1;isBlack = false;message = "轮到白方";} else {allChess[x][y] = 2;isBlack = true;message = "轮到黑方";}// 判断这个棋子是否和其他棋子连成5个boolean winFlag = this.checkWin();if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束,"+ (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");canPlay = false;}} else {JOptionPane.showMessageDialog(this, "当前位子已经有棋子,请重新落子!!!");}this.repaint();}}// 点击开始游戏按钮if (e.getX() >= 400 &&e.getX() <= 470 &&e.getY() >= 70&&e.getY() <= 100) {int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");if (result == 0) {// 现在重新开始游戏// 重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;// 2)游戏相关信息显示初始化// 3)将下一步下棋改为黑方for (int i = 0; i< 19; i++) {for (int j = 0; j< 19; j++) {allChess[i][j] = 0;}}// 另一种方式allChess=new int[19][19]message = "黑方先行";isBlack = true;blackTime = maxTime;whiteTime = maxTime;if (maxTime> 0) {blackMessage = maxTime / 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);whiteMessage = maxTime / 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);t.resume();} else {blackMessage = "无限制";whiteMessage = "无限制";}this.repaint();// 如果不重新调用,则界面不会刷新}}// 点击游戏设置按钮if (e.getX() >= 400 &&e.getX() <= 470 &&e.getY() >= 120&&e.getY() <= 150) {String input = JOptionPane.showInputDialog("请输入游戏的最多时间(单位:分钟),如果输入0 ,表示没有时间限制");try {maxTime = Integer.parseInt(input) * 60;if (maxTime< 0) {JOptionPane.showMessageDialog(this, "请正确提示信息,不允许输入负数");}if (maxTime == 0) {int result = JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if (result == 0) {// 现在重新开始游戏// 重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;// 2)游戏相关信息显示初始化// 3)将下一步下棋改为黑方for (int i = 0; i< 19; i++) {for (int j = 0; j< 19; j++) {allChess[i][j] = 0;}}// 另一种方式allChess=new int[19][19]message = "黑方先行";isBlack = true;blackTime = maxTime;whiteTime = maxTime;blackMessage = "无限制";whiteMessage = "无限制";this.repaint();// 如果不重新调用,则界面不会刷新}}if (maxTime> 0) {int result = JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if (result == 0) {// 现在重新开始游戏// 重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;// 2)游戏相关信息显示初始化// 3)将下一步下棋改为黑方for (int i = 0; i< 19; i++) {for (int j = 0; j< 19; j++) {allChess[i][j] = 0;}}// 另一种方式allChess=new int[19][19]message = "黑方先行";isBlack = true;blackTime = maxTime;whiteTime = maxTime;blackMessage = maxTime / 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);whiteMessage = maxTime / 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);t.resume();this.repaint();// 如果不重新调用,则界面不会刷新}}} catch (NumberFormatException e1) { JOptionPane.showMessageDialog(this, "请正确提示信息");}}// 点击游戏说明按钮if (e.getX() >= 400 &&e.getX() <= 470 &&e.getY() >= 170&&e.getY() <= 200) {JOptionPane.showMessageDialog(this,"这是一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时,游戏结束。
双人五子棋的Java源代码
第一个文件:import javax.swing.*;import java.awt.event.*;import java.awt.*;/*五子棋-主框架类, 程序启动类*/public class StartChessJFrame extends JFrame {private ChessBoard chessBoard;//对战面板private JPanel toolbar;//工具条面板private JButton startButton, backButton, exitButton;//重新开始按钮,悔棋按钮,和退出按钮private JMenuBar menuBar;//菜单栏private JMenu sysMenu;//系统菜单private JMenuItem startMenuItem, exitMenuItem, backMenuItem;//重新开始,退出,和悔棋菜单项public StartChessJFrame() {setTitle("单机版五子棋");//设置标题chessBoard = new ChessBoard();//初始化面板对象// 创建和添加菜单menuBar = new JMenuBar();//初始化菜单栏sysMenu = new JMenu("系统");//初始化菜单startMenuItem = new JMenuItem("重新开始");exitMenuItem = new JMenuItem("退出");backMenuItem = new JMenuItem("悔棋");//初始化菜单项sysMenu.add(startMenuItem);//将三个菜单项添加到菜单上sysMenu.add(backMenuItem);sysMenu.add(exitMenuItem);MyItemListener lis = new MyItemListener();//初始化按钮事件监听器内部类this.startMenuItem.addActionListener(lis);//将三个菜单项注册到事件监听器上backMenuItem.addActionListener(lis);exitMenuItem.addActionListener(lis);menuBar.add(sysMenu);//将系统菜单添加到菜单栏上setJMenuBar(menuBar);// 将menuBar设置为菜单栏toolbar = new JPanel();//工具面板栏实例化startButton = new JButton("重新开始");//三个按钮初始化backButton = new JButton("悔棋");exitButton = new JButton("退出");toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局toolbar.add(startButton);//将三个按钮添加到工具面板上toolbar.add(backButton);toolbar.add(exitButton);startButton.addActionListener(lis);//将三个按钮注册监听事件backButton.addActionListener(lis);exitButton.addActionListener(lis);add(toolbar, BorderLayout.SOUTH);//将工具面板布局到界面"南"方也就是下面add(chessBoard);//将面板对象添加到窗体上setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置界面关闭事件//setSize(800,800);pack(); // 自适应大小}private class MyItemListener implements ActionListener {//事件监听器内部类public void actionPerformed(ActionEvent e) {Object obj = e.getSource(); // 取得事件源if (obj == StartChessJFrame.this.startMenuItem || obj == startButton) {// 重新开始// JFiveFrame.this内部类引用外部类System.out.println("重新开始...");chessBoard.restartGame();} else if (obj == exitMenuItem || obj == exitButton) {System.exit(0); // 结束应用程序} else if (obj == backMenuItem || obj == backButton) { // 悔棋System.out.println("悔棋...");chessBoard.goback();}}}public static void main(String[] args) {StartChessJFrame f = new StartChessJFrame(); // 创建主框架f.setVisible(true); // 显示主框架}}第二个文件:import java.awt.Color;/*五子棋的棋子设计。
五子棋JAVA源代码
五子棋Java实现代码import java.awt.*;import java.awt.event.*;import java.applet.Applet;import java.awt.Color;public class WUZIQI extends Applet implements ActionListener, MouseListener, MouseMotionListener, ItemListener {int color = 0;// 棋子的颜色标识0:白子1:黑子boolean isStart = false;// 游戏开始标志int bodyArray[][] = new int[16][16]; // 设置棋盘棋子状态0 无子1 白子2 黑子Button b1 = new Button("游戏开始");Button b2 = new Button("重新开始");Label lblWin = new Label(" ");Checkbox ckbHB[] = new Checkbox[2];CheckboxGroup ckgHB = new CheckboxGroup();public void init() {setLayout(null);addMouseListener(this);add(b1);b1.setBounds(330, 50, 80, 30);b1.addActionListener(this);add(b2);b2.setBounds(330, 90, 80, 30);b2.addActionListener(this);ckbHB[0] = new Checkbox("白子先", ckgHB, false);ckbHB[0].setBounds(320, 20, 60, 30);ckbHB[1] = new Checkbox("黑子先", ckgHB, false);ckbHB[1].setBounds(380, 20, 60, 30);add(ckbHB[0]);add(ckbHB[1]);ckbHB[0].addItemListener(this);ckbHB[1].addItemListener(this);add(lblWin);lblWin.setBounds(330, 130, 80, 30);gameInit();this.resize(new Dimension(450,350));}public void itemStateChanged(ItemEvent e) {if (ckbHB[0].getState()) // 选择黑子先还是白子先{color = 0;}else {color= 1;}}public void actionPerformed(ActionEvent e) {if (e.getSource() == b1) {gameStart();}else {reStart();}}public void mousePressed(MouseEvent e) {}public void mouseClicked(MouseEvent e) {int x1, y1;x1 = e.getX();y1 = e.getY();if (e.getX() < 20 || e.getX() > 300 || e.getY() < 20 || e.getY() > 300) { return;}if (x1 % 20 > 10) {x1 += 20;}if (y1 % 20 > 10) {y1 += 20;}x1 = x1 / 20 * 20;y1 = y1 / 20 * 20;setDown(x1, y1);}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseDragged(MouseEvent e) {}public void mouseMoved(MouseEvent e) {}public void paint(Graphics g) {g.setColor(Color.pink);g.fill3DRect(10, 10, 300, 300, true);g.setColor(Color.black);for (int i = 1; i < 16; i++) {g.drawLine(20, 20 * i, 300, 20 * i);g.drawLine(20 * i, 20, 20 * i, 300);}}public void setDown(int x, int y) // 落子{if (!isStart) // 判断游戏未开始{return;}if (bodyArray[x / 20][y / 20] != 0) {return;}Graphics g = getGraphics();if (color == 1)// 判断黑子还是白子{g.setColor(Color.black);color = 0;}else {g.setColor(Color.white);color = 1;}g.fillOval(x - 10, y - 10, 20, 20);bodyArray[x / 20][y / 20] = color + 1;if (gameWin1(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + "赢了!");isStart = false;}if (gameWin2(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + "赢了!");isStart = false;}if (gameWin3(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + "赢了!");isStart = false;}if (gameWin4(x / 20, y / 20)) // 判断输赢{lblWin.setText(startColor(color) + "赢了!");isStart = false;}}public String startColor(int x) {if (x == 0) {return "黑子";}else {return "白子";}}public void gameStart() // 游戏开始{isStart = true;enableGame(false);b2.setEnabled(true);}public void gameInit() // 游戏开始初始化{isStart = false;enableGame(true);b2.setEnabled(false);ckbHB[0].setState(true);for (int i = 0; i < 16; i++) {for (int j = 0; j < 16; j++) {bodyArray[i][j] = 0;}}lblWin.setText("");}public void reStart() // 游戏重新开始{repaint();gameInit();}public void enableGame(boolean e) // 设置组件状态{b1.setEnabled(e);b2.setEnabled(e);ckbHB[0].setEnabled(e);ckbHB[1].setEnabled(e);}public boolean gameWin1(int x, int y) // 判断输赢横{int x1, y1, t = 1;x1 = x;y1 = y;for (int i = 1; i < 5; i++) {if (x1 > 15) {break;}if (bodyArray[x1 + i][y1] == bodyArray[x][y]) {t += 1;}else {break;}}for (int i = 1; i < 5; i++) {if (x1 < 1) {break;}if (bodyArray[x1 - i][y1] == bodyArray[x][y]) {t += 1;}else {break;}}if (t > 4) {return true;}else {return false;}}public boolean gameWin2(int x, int y) // 判断输赢竖{int x1, y1, t = 1;x1 = x;y1 = y;for (int i = 1; i < 5; i++) {if (x1 > 15) {break;}if (bodyArray[x1][y1 + i] == bodyArray[x][y]) {t += 1;}else {break;}}for (int i = 1; i < 5; i++) {if (x1 < 1) {break;if (bodyArray[x1][y1 - i] == bodyArray[x][y]) {t += 1;}else {break;}}if (t > 4) {return true;}else {return false;}}public boolean gameWin3(int x, int y) // 判断输赢左斜{int x1, y1, t = 1;x1 = x;y1 = y;for (int i = 1; i < 5; i++) {if (x1 > 15) {break;}if (bodyArray[x1 + i][y1 - i] == bodyArray[x][y]) { t += 1;}else {break;}}for (int i = 1; i < 5; i++) {if (x1 < 1) {break;}if (bodyArray[x1 - i][y1 + i] == bodyArray[x][y]) { t += 1;}else {break;}}if (t > 4) {return true;else {return false;}}public boolean gameWin4(int x, int y) // 判断输赢左斜{int x1, y1, t = 1;x1 = x;y1 = y;for (int i = 1; i < 5; i++) {if (x1 > 15) {break;}if (bodyArray[x1 + i][y1 + i] == bodyArray[x][y]) {t += 1;}else {break;}}for (int i = 1; i < 5; i++) {if (x1 < 1) {break;}if (bodyArray[x1 - i][y1 - i] == bodyArray[x][y]) {t+=1;}else {break;}}if (t > 4) {return true;}else {return false;}}}。
五子棋游戏代码(Java语言)
五子棋游戏代码(Java语言)import java.awt.*;import java.awt.event.*;import javax.swing.*;class mypanel extends Panel implements MouseListener {int chess[][] = new int[11][11];boolean Is_Black_True;mypanel(){Is_Black_True=true;for(int i=0;i<11;i++){for(int j=0;j<11;j++){chess[i][j] = 0;}}addMouseListener(this);setBackground(Color.RED);setBounds(0, 0, 360, 360);setVisible(true);}public void mousePressed(MouseEvent e){int x = e.getX();int y = e.getY();if(x < 25 || x > 330 + 25 ||y < 25 || y > 330+25){return;}if(chess[x/30-1][y/30-1] != 0){return;}if(Is_Black_True==true){chess[x/30-1][y/30-1] = 1;Is_Black_True=false;repaint();Justisewiner();return;}if(Is_Black_True==false){chess[x/30-1][y/30-1]=2;Is_Black_True=true;repaint();Justisewiner();return;}}void Drawline(Graphics g){for(int i=30;i<=330;i+=30){for(int j = 30;j <= 330; j+= 30){g.setColor(Color.GREEN);g.drawLine(i, j, i, 330);}}for(int j = 30;j <= 330;j+=30){g.setColor(Color.GREEN);g.drawLine(30, j, 330, j);}}void Drawchess(Graphics g){for(int i=0;i < 11;i++){for(int j = 0;j < 11;j++){if(chess[i][j] == 1){g.setColor(Color.BLACK);g.fillOval((i+1)*30-8, (j+1)*30-8, 16, 16);}if(chess[i][j]==2){g.setColor(Color.WHITE);g.fillOval((i+1)*30-8, (j + 1) * 30-8, 16, 16);}}}void Justisewiner(){int black_count = 0;int white_count = 0;int i = 0;for(i=0;i<11;i++) //竖向判断{for(int j=0;j<11;j++){if(chess[i][j]==1){black_count++;if(black_count==5){JOptionPane.showMessageDialog(this, "黑棋胜利");Clear_Chess();return;}}else{black_count=0;}if(chess[i][j]==2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利");Clear_Chess();return;}}else{white_count = 0;}}for(i=0;i<11;i++) //横向判断{for(int j=0;j<11;j++){if(chess[j][i] == 1){black_count++;if(black_count==5){JOptionPane.showMessageDialog(this, "黑棋胜利");Clear_Chess();return;}}else{black_count=0;}if(chess[j][i]==2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利");Clear_Chess();return;}}else{white_count = 0;}}}for(i=0;i<7;i++) //左向右斜判断{for(int j=0;j < 7;j++){for(int k=0;k < 5;k++){if(chess[i+k][j+k]==1){black_count++;if(black_count==5){JOptionPane.showMessageDialog(this, "黑棋胜利");Clear_Chess();return;}}else{black_count=0;}if(chess[i+k][j+k]==2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利");Clear_Chess();return;}}else{white_count=0;}}}}for(i = 4;i < 11;i++) //右向左斜判断{for(int j = 6;j >= 0;j--){for(int k = 0;k < 5;k++){if(chess[i - k][j + k] == 1){black_count++;if(black_count == 5){JOptionPane.showMessageDialog(this, "黑棋胜利");Clear_Chess();return;}}else{black_count = 0;}if(chess[i - k][j + k] == 2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利");Clear_Chess();return;}}else{white_count=0;}}}}}void Clear_Chess(){for(int i=0;i<11;i++){for(int j=0;j<10;j++){chess[i][j]=0;}}repaint();}public void paint(Graphics g){Drawline(g);Drawchess(g);}public void mouseExited(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseReleased(MouseEvent e){}public void mouseClicked(MouseEvent e){}}class myframe extends Frame implements WindowListener {mypanel panel;myframe(){setLayout(null);panel=new mypanel();add(panel);panel.setBounds(0,23, 360, 360);setTitle("单人版五子棋");setBounds(200, 200, 360, 383);setVisible(true);addWindowListener(this);}public void windowClosing(WindowEvent e){System.exit(0);}public void windowDeactivated(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowOpened(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}}public class WuZiQi{public static void main(String argc[]){myframe f=new myframe();}}。
网络版五子棋的Java源代码
/** * 对客户端发来的消息处理的函数, 处理后转发回客户端。 处理消息的过程比较复杂, 要针对很多种情况分别处理。 */ public void messageTransfer(String message) { String clientName, peerName; // 如果消息以“/ ”开头,表明是命令消息。 if (message.startsWith("/")) { // 消息以“/changename ”开头的几种情况 . if (message.startsWith("/r")) { // 获取修改后的用户名 clientName = message.substring(2); if (clientName.length() <= 0 || clientName.length() > 20 || clientName.startsWith("/") || clientNameHash.containsValue(clientName) || clientName.startsWith("changename") || clientName.startsWith("list") || clientName.startsWith("[inchess]") || clientName.startsWith("creatgame") || clientName.startsWith("joingame") || clientName.startsWith("yourname") || clientName.startsWith("userlist") || clientName.startsWith("chess") || clientName.startsWith("OK") || clientName.startsWith("reject") || clientName.startsWith("peer") || clientName.startsWith("peername") || clientName.startsWith("giveup") || clieБайду номын сангаасtName.startsWith("youwin") || clientName.startsWith("所有人")) { // 如果名字不合规则,则向客户端发送信息“无效命令” 。 message = " 无效命令 "; Feedback(message); } else { if (clientNameHash .containsValue(("[inchess]" + (String) clientNameHash .get(clientSocket)))) { // 如果用户正在对弈中,则直接修改 Socket 和名字的映射 Hash 表。 synchronized (clientNameHash) { clientNameHash.put((Socket) getHashKey( clientNameHash, ("[inchess]" + clientNameHash .get(clientSocket))),
java五子棋网络版源代码加分析
本人学会的一个五子棋网络版和单机版游戏,有老师指导完成,详细的解释和代码都在下面,希望可以帮助到大家!1.客户端连接新建个gobangClient类package gobang;public class gobangClient {public static void main(String[] args) throws Exception { new ChessBoard("localhost",8866);}}2.服务端连接新建个gobangServer类package gobang;public class gobangServer {public static void main(String[] args) throws Exception { new ChessBoard(8866);}}3.源代码,有详细解释package gobang;import java.awt.BorderLayout;import java.awt.Container;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.util.ArrayList;import java.awt.Graphics;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;public class ChessBoard extends JFrame{private boolean myPlay=false;//(默认是false)是否轮到我落子private JButton button1 =new JButton("开始");private JButton button2 =new JButton("悔棋");private JPanel p1 = new JPanel();private PicPane pp = null;private int side=1;//1表示黑private int n=0;//记录点击开始的次数public static final int SIZE=15;public static int[][]board=new int[SIZE][SIZE];//用来保存棋盘上棋子状态//1为黑,2为白,0为无public static final int BLACK=1;public static final int WHITE=-1;private NetService service;private static ArrayList<String> list =new ArrayList<String>(); //保存了下棋的步骤private boolean end=true;//true表示游戏已经结束private int currentColor=1;//服务端的构造器public ChessBoard(int port) throws Exception{//调用本类的无参构造树this();//构造器调用规则:1,只能调用本类或父类的构造器2. 调用构造器的代码写在新构造器的第一行3.构造器的调用只能使用this(本类)或者(父类) //将按钮设置能无效的button1.setEnabled(false);button2.setEnabled(false);//3.创建ServerSocket对象ServerSocket ss=new ServerSocket(port);//4.等待连接Socket s=ss.accept();//5.连接成功后创建一个线程来处理请求service=new NetService(s);service.start();//6.将按钮设置成有效的button1.setEnabled(true);button2.setEnabled(true);}//客户端的构造器public ChessBoard(String ip,int port) throws Exception{ //调用本类无参构造器this();//连接服务器Socket s=new Socket(ip,port);//初始化服务类service=new NetService(s);service.start();}public ChessBoard() throws IOException{Container c = this.getContentPane();c.setLayout(new BorderLayout());pp = new PicPane();BorderLayout bl = new BorderLayout();c.setLayout(bl);FlowLayout fl = new FlowLayout();p1.setLayout(fl);p1.add(button1);p1.add(button2);c.add(p1,BorderLayout.NORTH);c.add(pp,BorderLayout.CENTER);setSize(pp.getWidth()+6,pp.getHeight()+65);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);setVisible(true);button1.addActionListener(new SomeListener());button2.addActionListener(new button2Listener());}class SomeListener implements ActionListener{public void actionPerformed(ActionEvent e){// button2.setVisible(true);// if(n==0)// {// JOptionPane.showMessageDialog(// ChessBoard.this, "开始游戏啦!",// "提示",RMATION_MESSAGE);// }// else// {// JOptionPane.showMessageDialog(// ChessBoard.this, "确定要重新开始?",// "提示",RMATION_MESSAGE); // }// board=new int[15][15];// //调用重绘// pp.repaint();// end=false;// n++;start();}}private void start(){netStart();localStart();myPlay=true;//谁先点了开始按钮,谁先开始}private void localStart(){//重新初始化棋盘board=new int[SIZE][SIZE];//重新设置当前颜色currentColor=BLACK;//清空下棋步骤list=new ArrayList<String>();//重绘棋盘pp.repaint();//重新设置使下期没有结束end=false;}private void netStart(){service.send("start");}class button2Listener implements ActionListener{public void actionPerformed(ActionEvent e){back();// if(end==true)// {// JOptionPane.showMessageDialog(// ChessBoard.this, "人家都赢了你不能悔棋啦!", // "提示",RMATION_MESSAGE); // return;// }// int length = list.size();// if(list.size()<0)// {return;}// String str1 = list.remove(list.size() - 1);// String[] str3s = str1.split(",");// String str31 = str3s[0];// String str32 = str3s[1];// int row = Integer.parseInt(str31);// int col = Integer.parseInt(str32);// board[row][col]=0;// pp.repaint();// side = (side==1?2:1);//同下// if(side==1)// side=2;// else// side=1;}}public void back(){netBack();localBack();myPlay=!myPlay;//经典啊boolean的好处啊,悔棋了还是我下棋}private void localBack(){//如果结束不能悔棋if(end){return;}//if(list.isEmpty()){return;}//String str1 = list.remove(list.size() - 1);String[] str3s = str1.split(",");String str31 = str3s[0];String str32 = str3s[1];int row = Integer.parseInt(str31);int col = Integer.parseInt(str32);board[row][col]=0;currentColor=-currentColor;//pp.repaint();//}private void netBack(){if(end){//节省时间return;}service.send("back");}public static void toCenter(JFrame frame){int width = frame.getWidth();int height = frame.getHeight();Toolkit tookie = Toolkit.getDefaultToolkit();Dimension dim = tookie.getScreenSize();int screenWidth = dim.width;int screenHeight = dim.height;frame.setLocation((screenWidth - width)/2,(screenHeight-height)/2);}class PicPane extends JPanel{private int width;private int height;private BufferedImage bImg;//棋盘private BufferedImage chessImg;//黑子private BufferedImage wImg;//白子public PicPane() throws IOException{InputStreamips =PicPane.class.getResourceAsStream("images/chessboard.jpg");bImg = javax.imageio.ImageIO.read(ips);ips =PicPane.class.getResourceAsStream("images/b.gif");chessImg = javax.imageio.ImageIO.read(ips);ips =PicPane.class.getResourceAsStream("images/w.gif");wImg = javax.imageio.ImageIO.read(ips);width = bImg.getWidth();height = bImg.getHeight();addMouseListener(new boardListener());}@Overridepublic void paint(Graphics g){super.paint(g);g.drawImage(bImg,0,0,null);//加上画棋子的代码//依据board数组中的数据for(int i=0;i<board.length;i++){for(int j=0;j<board[i].length;j++){if(board[i][j]==1){g.drawImage(chessImg,j*35+3,i*35+3,null);}else if(board[i][j]==-1){g.drawImage(wImg,j*35+3,i*35+3,null);}}}}public int getHeight(){return height;}public int getWidth(){return width;}class boardListener extends MouseAdapter//只对感兴趣的方法实现,不用借口全部实现{@Overridepublic void mouseClicked(MouseEvent ae){int x=ae.getX();int y=ae.getY();int row=(y-4)/35;int col=(x-4)/35;play(row,col);// //判断游戏的状态,游戏是否结束的逻辑// if(end)// {// return;// }// //获得点击的坐标// int x=e.getX();// int y=e.getY();// int row=y/35;// int col=x/35;// if(row>=15||col>=15)// {// return;// }// if(board[row][col]==0)// switch(side)// {// case 1:// {//e.getComponent().getGraphics().drawImage(chessImg,col*35+3,row *35+3,null);// board[row][col]=1;//记录棋子// side=2;//改为白方// list.add(row+","+col);// break;// }// case 2:// {//e.getComponent().getGraphics().drawImage(wImg,col*35+3,row*35+ 3,null);// board[row][col]=2;// side=1;//改为黑方// list.add(row+","+col);// break;//改为黑方// }// }// //判断输赢// if(isWin(row,col))// {// //如果赢了:// end=true;// //提示用户,谁赢了// JOptionPane.showMessageDialog(ChessBoard.this,// (side==1?"白方胜":"黑方胜"),"提示",RMATION_MESSAGE);// }//}}}private void play(int row,int col){if(!myPlay){//如果不是我落子,直接返回,什么也不做return;}netPlay(row,col);//使另一方的棋盘上落子localPlay(row,col);//在本地的棋盘上落子myPlay=false;}private void netPlay(int row, int col){ if(end){//只打开服务器,会报错的问题return;}service.send(row+","+col);}private void localPlay(int row, int col){if(end){return;}if(row>=SIZE||col>=SIZE||row<0||col<0){return;}if(board[row][col]!=0){return;}//保存棋子board[row][col]=currentColor;//保存下棋步骤list.add(row+","+col);//重绘棋盘pp.repaint();if(isWin(row,col)){end=true;JOptionPane.showMessageDialog(ChessBoard.this,((currentColor==BLACK?"黑方":"白方")+"胜!"),"提示",RMATION_MESSAGE);}currentColor=-currentColor;}private boolean isWin(int currRow,int currCol){ // 需要比较四个方向的棋子(是否同色)int color=board[currRow][currCol];int[][]directions={{1,0},{1,1},{0,1},{-1,1}};//从四个方向比较for(int i=0;i<directions.length;i++){//计数器int num=1;//控制正反的for(int j=-1;j<2;j+=2){//比较次数for(int k=1;k<5;k++){//获得相邻的棋子的坐标int row=currRow+j*k*directions[i][0];int col=currCol+j*k*directions[i][1];//有可能行和列越界if(row<0||row>=15||col<0||row>=15){break;}if(board[row][col]==color){num++;if(num==5){return true;}}elsebreak;}}return false;}class NetService extends Thread{Socket s;BufferedReader in;PrintWriter out;public NetService(Socket s){try {this.s=s;in=new BufferedReader(new InputStreamReader(s.getInputStream()));out=new PrintWriter(s.getOutputStream());} catch (IOException e) {e.printStackTrace();}}public void send(String message){out.println(message);out.flush(); //刷新缓冲区}public void run(){try {while(true){String command=in.readLine();if(command.equals("start")){localStart();myPlay=false;}else if(command.equals("back")){localBack();myPlay=!myPlay;}else{String[]arr=command.split(",");int row=Integer.parseInt(arr[0]);int col=Integer.parseInt(arr[1]);localPlay(row,col);myPlay=true;}}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) throws IOException {ChessBoard chessboard = new ChessBoard();toCenter(chessboard);}}。
简单JAVA五子棋代码1详解
简单JA V A五子棋代码只需要建两个类就可以了1.MainFrame类继承JFrame类2.MainPanel类继承JPanel类实现接口MouseListener两个类详细代码如下MainFrame类,如下:package game.gobang;import java.awt.BorderLayout;import java.awt.Color;import javax.swing.JFrame;/*** 五子棋*/public class MainFrame extends JFrame{public static void main(String[] args) {M ainPanel panel = new MainPanel();MainFrame frame = new MainFrame("五子棋");frame.setSize(680,680);panel.setBackground(Color.GRAY);frame.add(panel,BorderLayout.CENTER);panel.addMouseListener(panel);frame.setVisible(true);}public MainFrame(){s uper();}public MainFrame(String str){s uper(str);}}MainPanel类如下:package game.gobang;import java.awt.Color;import java.awt.Graphics;import java.awt.Panel;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JOptionPane;/*** 五子棋的面板设计*/public class MainPanel extends Panel implements MouseListener{ private static final int COLUMN = 16;//列数private static final int ROW = 16;//行数private static final int GAP = 40;//间距private static boolean isBlack = true;// 判断是否是黑棋private static int click_X;private static int click_Y;private char[][] allChess= new char[ROW][COLUMN];// 存下了旗子的位置public MainPanel(){super();for(int i=0;i<allChess.length;i++){for(int j=0;j<allChess[i].length;j++){allChess[i][j]='*';// 初始化数组allChess,*表示没有棋子存在}}}public void paint(Graphics g){f or(int i=0;i<ROW;i++){//划横线g.setColor(Color.BLACK);g.drawLine(20, 20+i*GAP, 640-20, 20+i*GAP);// 棋盘间隔分布}f or(int i=0;i<COLUMN;i++){//划纵线g.setColor(Color.BLACK);g.drawLine(20+i*GAP, 20, 20+i*GAP, 640-20);}f or(int i=0;i<allChess.length;i++){for(int j=0;j<allChess[i].length;j++){if(allChess[i][j]=='~'){g.setColor(Color.WHITE);g.fillOval(5+i*40, 5+j*40, 30, 30);g.drawOval(5+i*40, 5+j*40, 30, 30);}if(allChess[i][j]=='!'){g.setColor(Color.BLACK);g.fillOval(5+i*40, 5+j*40, 30, 30);g.drawOval(5+i*40, 5+j*40, 30, 30);}}}}public boolean isWin(int x,int y,boolean isColor){//判断是否为5个相同的棋子,是返回true,否返回falsec har ch=allChess[x][y];/* 横向判断 */i nt RLastX = x;w hile(RLastX>=0 && allChess[RLastX][y]==ch){//横向判断是否到达5个相同的棋子RLastX --;}int RNum = 0;//统计横向相同的棋子数RLastX ++;w hile(RLastX<allChess.length && allChess[RLastX][y]==ch){//横向判断是否到达5个相同的棋子RNum ++;RLastX ++;}/* 纵向判断 */i nt LLastY = y;w hile(LLastY>=0 && allChess[x][LLastY]==ch){//纵向判断是否到达5个相同的棋子LLastY --;}i nt LNum = 0;//统计纵向相同的棋子数L LastY ++;w hile(LLastY<allChess[x].length && allChess[x][LLastY]==ch){//纵向判断是否到达5个相同的棋子LLastY ++;LNum ++;}/* 左下右上判断 */i nt LDLastX = x;i nt RULastY = y;w hile(LDLastX>=0 && RULastY<allChess.length &&allChess[LDLastX][RULastY]==ch){// 横向判断有多少个连在一起了LDLastX --;RULastY ++;}i nt LDNum = 0;L DLastX ++;R ULastY --;w hile(LDLastX<allChess.length && RULastY>=0 &&allChess[LDLastX][RULastY]==ch){LDNum ++;LDLastX ++;RULastY --;}/* 左上右下判断 */i nt RULastX = x;i nt LDLastY = y;w hile(RULastX>=0 && LDLastY>=0 && allChess[RULastX][LDLastY]==ch){ RULastX --;LDLastY --;}i nt RUNum = 0;R ULastX ++;L DLastY ++;w hile(RULastX>=0 && LDLastY<allChess.length &&allChess[RULastX][LDLastY]==ch){RULastX ++;LDLastY ++;RUNum ++;}i f(RNum>=5||LNum>=5||RUNum>=5||LDNum>=5){return true;}r eturn false;}public void mouseClicked(MouseEvent e) {/ / 鼠标按下时候画出棋子}public void mousePressed(MouseEvent e) {//鼠标点击事件处理过程//获取点击坐标位置int click_x = e.getX();int click_y = e.getY();int chess_x = Math.round((float)(click_x-20)/GAP);int chess_y = Math.round((float)(click_y-20)/GAP);//获取点击后的坐标位置click_X = chess_x;click_Y = chess_y;if(isBlack==true&&allChess[chess_x][chess_y]=='*'){allChess[chess_x][chess_y] = '!';isBlack = false;}if(isBlack==false&&allChess[chess_x][chess_y]=='*'){allChess[chess_x][chess_y] = '~';isBlack = true;}System.out.println(e.getX());System.out.println(e.getY());repaint();for(int j=0;j<16;j++){f or(int i=0;i<16;i++){System.out.print(allChess[i][j]+" ");}S ystem.out.println();}System.out.println();if(isWin(chess_x,chess_y,isBlack)){S ystem.out.println("你赢了");}if(isWin(chess_x,chess_y,isBlack)){i f(isBlack){JOptionPane.showMessageDialog(null,"白子赢了");}else{JOptionPane.showMessageDialog(null,"黑子赢了");}System.exit(0);}}public void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}public void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}public void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}public void setAllChess(char[][] allChess) {this.allChess = allChess;}public char[][] getAllChess() {return allChess;}}。
JAVA课程设计 五子棋(内附完整代码)
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame 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 { 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=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[] {"开局", 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[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn 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);}elsem.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;elsereturn 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;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String 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");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );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 ChessModel(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.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(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心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 ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-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, modeChess);}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 int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.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.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(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;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子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;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)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 MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
Java实现五子棋(附详细源码)
Java实现五⼦棋(附详细源码)本⽂实例为⼤家分享了Java实现五⼦棋游戏的具体代码,供⼤家参考,具体内容如下学习⽬的:熟悉java中swing类与java基础知识的巩固.(⽂末有源代码⽂件和打包的jar⽂件)效果图:思路:**1.⾸先构建⼀个Frame框架,来设置菜单选项与按钮点击事件。
MyFrame.java⽂件代码如下package StartGame;import javax.swing.ButtonGroup;import javax.swing.Icon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JRadioButtonMenuItem;import java.awt.Color;import ponent;import java.awt.Container;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;//窗体框架类public class MyFrame extends JFrame {// static boolean canPlay1 = false;判断是否可以开始游戏final MyPanel panel = new MyPanel();public MyFrame() {// 设置窗体的⼤⼩并居中this.setSize(500, 600); // 设置窗体⼤⼩this.setTitle("五⼦棋游戏"); // 设置窗体标题int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 获取屏幕的⾼度this.setLocation((width - 500) / 2, (height - 500) / 2); // 设置窗体的位置(居中)this.setResizable(false); // 设置窗体不可以放⼤// this.setLocationRelativeTo(null);//这句话也可以设置窗体居中/** 菜单栏的⽬录设置*/// 设置菜单栏JMenuBar bar = new JMenuBar();this.setJMenuBar(bar);// 添加菜单栏⽬录JMenu menu1 = new JMenu("游戏菜单"); // 实例化菜单栏⽬录JMenu menu2 = new JMenu("设置");JMenu menu3 = new JMenu("帮助");bar.add(menu1); // 将⽬录添加到菜单栏bar.add(menu2);bar.add(menu3);JMenu menu4 = new JMenu("博弈模式"); // 将“模式”菜单添加到“设置”⾥⾯menu2.add(menu4);// JMenuItem item1=new JMenuItem("⼈⼈博弈");// JMenuItem item2=new JMenuItem("⼈机博弈");// 设置“”⽬录下⾯的⼦⽬录JRadioButtonMenuItem item1 = new JRadioButtonMenuItem("⼈⼈博弈");JRadioButtonMenuItem item2 = new JRadioButtonMenuItem("⼈机博弈");// item1按钮添加时间并且为匿名类item1.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsManAgainst(true);panel.Start();item1.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Override// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置item2按钮的事件监听事件,也就是设置⼈机博弈item2.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsManAgainst(false);panel.Start();item2.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置按钮组并把⼈机博弈与⼈⼈博弈添加到⼀个按钮组⾥⾯ButtonGroup bg = new ButtonGroup();bg.add(item1);bg.add(item2);// 将按钮组添加到菜单⾥⾯menu4.add(item2);item2.setSelected(true);// 先⾏设置JMenu menu5 = new JMenu("先⾏设置"); // 将“先⾏设置”菜单添加到“设置”⾥⾯menu2.add(menu5);// 设置⿊⼦先⾏还是⽩字先⾏的按钮JRadioButtonMenuItem item3 = new JRadioButtonMenuItem("⿊⽅先⾏");JRadioButtonMenuItem item4 = new JRadioButtonMenuItem("⽩字先⾏");// 设置item3的⿏标点击事件,设置⿊⽅先⾏item3.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsBlack(true);panel.Start();item3.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置item4的⿏标点击事件item4.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsBlack(false);panel.Start();item4.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置按钮组并把⼈机博弈与⼈⼈博弈添加到⼀个按钮组⾥⾯ButtonGroup bg1 = new ButtonGroup();bg1.add(item3);bg1.add(item4);// 将按钮组添加到菜单⾥⾯menu5.add(item3);menu5.add(item4);item3.setSelected(true);// 设置“帮助”下⾯的⼦⽬录JMenuItem menu6 = new JMenuItem("帮助");menu3.add(menu6);/** 菜单栏的⽬录设置完毕*/// 开始游戏菜单设置JMenuItem menu7 = new JMenuItem("开始游戏");menu1.add(menu7);JMenuItem menu8 = new JMenuItem("重新开始");menu1.add(menu8);menu7.addMouseListener(new MouseListener() {@Override// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubpanel.Start();// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});menu8.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否重新开始", "消息", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.Start();}// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});// 退出游戏选项设置JMenuItem menu9 = new JMenuItem("退出游戏");menu1.add(menu9);menu9.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "退出游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否退出游戏", "消息", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {System.exit(0);// 退出程序}// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}// 游戏难度设置JRadioButtonMenuItem item5 = new JRadioButtonMenuItem("傻⽠");// 添加按钮JRadioButtonMenuItem item6 = new JRadioButtonMenuItem("简单");JRadioButtonMenuItem item7 = new JRadioButtonMenuItem("普通");// JRadioButtonMenuItem item8= new JRadioButtonMenuItem("困难");ButtonGroup bg3 = new ButtonGroup();// 设置按钮组bg3.add(item5);bg3.add(item6);bg3.add(item7);// bg3.add(item8);JMenu menu10 = new JMenu("游戏难度设置");// 添加菜单到主菜单menu2.add(menu10);menu10.add(item5);// 添加选项到难度设置菜单menu10.add(item6);menu10.add(item7);// menu2.add(item8);item5.setSelected(true);// 默认选项按钮// 傻⽠难度设置的⿏标点击事件item5.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setGameDifficulty(0);panel.Start();item5.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub});// 简单难度设置模式item6.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "难度设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setGameDifficulty(1);panel.Start();item6.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 普通难度设置item7.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setGameDifficulty(2);panel.Start();item7.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});//游戏帮助提⽰信息menu6.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;};JOptionPane.showMessageDialog(null, "制作⼈员:韩红剑");}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});/** 窗⼝⾥⾯的容器设置*/Container con = this.getContentPane(); // 实例化⼀个容器⽗类con.add(panel); // 将容器添加到⽗类/** 窗⼝⾥⾯的容器设置完毕*/}}2.第⼆步,设置显⽰棋盘的容器,⽂件源代码为MyPanel.java package StartGame;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Panel;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.image.*;import java.io.File;import .URL;import java.util.Arrays;import java.util.Random;import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel;//设置窗体⾥⾯的容器操作public class MyPanel extends JPanel implements MouseListener, Runnable { private static final Toolkit ResourceUtil = null;public Image boardImg; // 定义背景图⽚static int[][] allChess = new int[15][15]; // 棋盘数组static int[][] temporaryChess = new int[15][15];int x;// 保存棋⼦的横坐标int y;// 保存棋⼦的纵坐标Boolean canPlay = false; // 游戏是否继续,默认为继续Boolean isBlack = true;// 是否是⿊⼦,默认为⿊⼦Boolean isManAgainst = false; // 判断是否是⼈⼈对战String message = "⽤户下棋";Thread t = new Thread(this);int maxTime = 120;int blackTime = 120;int whiteTime = 120;String blackMessage = "⽆限制";String whiteMessage = "⽆限制";static int gameDifficulty = 0;// 设置游戏难度,0为傻⽠模式,1为简单,2为普通,3为困难 // 获取isBlack的值public boolean getIsBlack() {return this.isBlack;}// 设置isBlack的值public void setIsBlack(boolean isBlack) {this.isBlack = isBlack;}// 获取isManAgainst的值public boolean getIsManAgainst() {return this.isManAgainst;}// 获取isManAgainst的值public void setIsManAgainst(boolean isManAgainst) {this.isManAgainst = isManAgainst;}// 获取isManAgainst的值public int getGameDifficulty() {return this.gameDifficulty;}// 设置setGameDifficulty的值public void setGameDifficulty(int gameDifficulty) {this.gameDifficulty = gameDifficulty;}// 构造函数public MyPanel() {boardImg = Toolkit.getDefaultToolkit().getImage("./src/StartGame/fiveCHessBourd.jpg"); this.repaint();// 添加⿏标监视器addMouseListener((MouseListener) this);// addMouseMotionListener((MouseMotionListener) this);// this.requestFocus();t.start();t.suspend();// 线程挂起// t.resume();}// 数据初始化@Overridepublic void paint(Graphics g) {super.paint(g);int imgWidth = boardImg.getWidth(this); // 获取图⽚的宽度int imgHeight = boardImg.getHeight(this); // 获取图⽚的⾼度int FWidth = getWidth();int FHeight = getHeight();String message; // 标记谁下棋int x = (FWidth - imgWidth) / 2;int y = (FHeight - imgHeight) / 2;g.drawImage(boardImg, x, y, null); // 添加背景图⽚到容器⾥⾯g.setFont(new Font("宋体", 0, 14));g.drawString("⿊⽅时间:" + blackTime, 30, 470);g.drawString("⽩⽅时间:" + whiteTime, 260, 470);// 绘制棋盘for (int i = 0; i < 15; i++) {g.drawLine(30, 30 + 30 * i, 450, 30 + 30 * i);g.drawLine(30 + 30 * i, 30, 30 + 30 * i, 450);}// 绘制五个中⼼点g.fillRect(240 - 5, 240 - 5, 10, 10); // 绘制最中⼼的正⽅形g.fillRect(360 - 5, 360 - 5, 10, 10); // 绘制右下的正⽅形g.fillRect(360 - 5, 120 - 5, 10, 10); // 绘制右上的正⽅形g.fillRect(120 - 5, 360 - 5, 10, 10);// 绘制左下的正⽅形g.fillRect(120 - 5, 120 - 5, 10, 10);// 绘制左上的正⽅形// 定义棋盘数组for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {// if (allChess[i][j] == 1) {// // ⿊⼦// int tempX = i * 30 + 30;// int tempY = j * 30 + 30;// g.fillOval(tempX - 7, tempY - 7, 14, 14);// }// if (allChess[i][j] == 2) {// // ⽩⼦// int tempX = i * 30 + 30;// int tempY = j * 30 + 30;// g.setColor(Color.WHITE);// g.fillOval(tempX - 7, tempY - 7, 14, 14);// g.setColor(Color.BLACK);// g.drawOval(tempX - 7, tempY - 7, 14, 14);// }draw(g, i, j); // 调⽤下棋⼦函数}}}// ⿏标点击时发⽣的函数@Overridepublic void mousePressed(MouseEvent e) {// x = e.getX();// 获取⿏标点击坐标的横坐标// y = e.getY();// 获取⿏标点击坐标的纵坐标// if (x >= 29 && x <= 451 && y >= 29 && y <= 451) { // ⿏标点击在棋⼦框⾥⾯才有效 //// }if (canPlay == true) {// 判断是否可以开始游戏x = e.getX(); // 获取⿏标的焦点y = e.getY();if (isManAgainst == true) {// 判断是否是⼈⼈对战manToManChess();} else { // 否则是⼈机对战,⼈机下棋manToMachine();}}}// 判断是否输赢的函数private boolean checkWin(int x, int y) {// TODO Auto-generated method stubboolean flag = false;// 保存共有多少相同颜⾊棋⼦相连int count = 1;// 判断横向特点:allChess[x][y]中y值相同int color = allChess[x][y];// 判断横向count = this.checkCount(x, y, 1, 0, color);if (count >= 5) {flag = true;} else {// 判断纵向count = this.checkCount(x, y, 0, 1, color);if (count >= 5) {flag = true;} else {// 判断右上左下count = this.checkCount(x, y, 1, -1, color);if (count >= 5) {flag = true;} else {// 判断左下右上count = this.checkCount(x, y, 1, 1, color);if (count >= 5) {flag = true;}}}}return flag;}// 判断相同棋⼦连接的个数private int checkCount(int x, int y, int xChange, int yChange, int color) {// TODO Auto-generated method stubint count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14 && color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0 && y - yChange <= 14 && color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}// 机器⼈判断⿊棋相连的数量private int checkCountMachine(int x, int y, int xChange, int yChange, int color) {// TODO Auto-generated method stubint count = 0;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14 && color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0 && y - yChange <= 14 && color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}public void paintConmponents(Graphics g) {super.paintComponents(g);}// 绘制⿊⽩棋⼦public void draw(Graphics g, int i, int j) {if (allChess[i][j] == 1) {g.setColor(Color.black);// ⿊⾊棋⼦g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);g.drawString(message, 230, 20);}if (allChess[i][j] == 2) {g.setColor(Color.white);// ⽩⾊棋⼦g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);g.drawString(message, 230, 20);}}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void run() {// TODO Auto-generated method stub// 判断是否有时间限制if (maxTime > 0) {while (true) {// System.out.println(canPlay + "11");if (isManAgainst) {if (isBlack) {blackTime--;if (blackTime == 0) {JOptionPane.showMessageDialog(this, "⿊⽅超时,游戏结束!"); }} else {whiteTime--;if (whiteTime == 0) {JOptionPane.showMessageDialog(this, "⽩⽅超时,游戏结束!"); }}} else {// 监控⿊⼦下棋的时间,也就是⽤户下棋的时间blackTime--;if (blackTime == 0) {JOptionPane.showMessageDialog(this, "⽤户超时,游戏结束!");}// 不监控电脑⽩字下棋}blackMessage = blackTime / 3600 + ":" + (blackTime / 60 - blackTime / 3600 * 60) + ":" + (blackTime - blackTime / 60 * 60);whiteMessage = whiteTime / 3600 + ":" + (whiteTime / 60 - whiteTime / 3600 * 60) + ":" + (whiteTime - whiteTime / 60 * 60);this.repaint();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}// 点击开始游戏设置属性,游戏开始public void Start() {this.canPlay = true;for (int i = 0; i < 14; i++) {for (int j = 0; j < 14; j++) {allChess[i][j] = 0;}}if (canPlay == true) {t.resume();}this.repaint();JOptionPane.showMessageDialog(this, "游戏开始了,请开始下棋");if (isBlack == false && isManAgainst == false) {machineChess(gameDifficulty);}// 另⼀种⽅式 allChess=new int[19][19]// message = "⿊⽅先⾏";//// isBlack = true;// blackTime = maxTime;// whiteTime = maxTime;// if (maxTime > 0) {// blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600// * 60) + ":"// + (maxTime - maxTime / 60 * 60);// whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600// * 60) + ":"// + (maxTime - maxTime / 60 * 60);// t.resume();// } else {// blackMessage = "⽆限制";// whiteMessage = "⽆限制";// }// this.repaint();// 如果不重新调⽤,则界⾯不会刷新}// ⼈⼈对战下棋函数public void manToManChess() {if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标y = (y + 15) / 30 - 1;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋⼦if (isBlack == true) {allChess[x][y] = 1;isBlack = false;blackTime = 120;message = "轮到⽩⽅";} else {allChess[x][y] = 2;isBlack = true;whiteTime = 120;message = "轮到⿊⽅";}}// 判断这个棋⼦是否和其他棋⼦连成5个boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋⼦if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!"); canPlay = false;}} else {// JOptionPane.showMessageDialog(this,// "当前位⼦已经有棋⼦,请重新落⼦");}}// ⼈机对战下棋函数public void manToMachine() {if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标y = (y + 15) / 30 - 1;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋⼦if (isBlack == true) {allChess[x][y] = 1;this.repaint(); // 绘制棋⼦machineChess(gameDifficulty);isBlack = true;blackTime = 120;message = "⽤户下棋";whiteTime = 120;boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋⼦if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!"); canPlay = false;}} else {allChess[x][y] = 1;// allChess[x][y] = 2;this.repaint();isBlack = false;whiteTime = 120;blackTime = 120;boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋⼦if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!"); canPlay = false;}machineChess(gameDifficulty);}}// 判断这个棋⼦是否和其他棋⼦连成5个// boolean winFlag = this.checkWin(x, y);// this.repaint(); // 绘制棋⼦//// if (winFlag == true) {// JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] ==// 1 ? "⿊⽅" : "⽩⽅") + "获胜!");// canPlay = false;// }}}。
五子棋代码(JAVA)
package ui;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;public class Welcome extends JLabel implements ActionListener {/*** 欢迎界面*/private static final long serialVersionUID = 1L;private FIR father = null;private JButton btnTwoGame = null;// 游戏界面按钮private JButton btnHelp = null;// 游戏帮助按钮private JButton btnExit = null;// 游戏退出按钮/*** Launch the application** @param args*//*** Create the application*/public Welcome(FIR father) {this.father = father;this.setIcon(IconResourses.bgWelcome);initialize();}/*** Initialize the contents of the frame*/private void initialize() {this.setLayout(null);// 先设置布局,再添加组件/** 实例化btnHelp,btnTwoGame,btnExit并设置相关属性,注册监听器*/btnHelp = new JButton(IconResourses.btnHelp);btnHelp.addActionListener(this);btnHelp.setBounds(450, 290, 138, 43);this.add(btnHelp);btnTwoGame = new JButton(IconResourses.btnTwoGame);btnTwoGame.addActionListener(this);btnTwoGame.setBounds(450, 230, 138, 43);this.add(btnTwoGame);btnExit = new JButton(IconResourses.btnExit);btnExit.setBounds(450, 350, 138, 43);btnExit.addActionListener(this);this.add(btnExit);}public void actionPerformed(ActionEvent e) {if (e.getSource() == btnTwoGame) {// 游戏按钮响应方法father.show("game");// 显示游戏界面} else if (e.getSource() == btnHelp) {// 游戏帮助响应方法father.show("help");// 显示帮助界面} else if (e.getSource() == btnExit) {// 游戏退出响应方法// 点击"是"确定退出游戏if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this,"确定退出游戏吗?", "五子棋", JOptionPane.YES_NO_OPTION)) { System.exit(0);}}}}package ui;import javax.swing.JLabel;public class ChessGrid extends JLabel {/*** 棋格*/private static final long serialVersionUID = 1L;private JLabel rim= null;private int row = 0; // 标志当前棋格的行private int col = 0; // 标志当前棋格的列private int flag = 0;// 标志当前棋格的状态:0无子,1黑子,2白子/*** 棋格构造函数无棋子状态** @param row 指定行位置* @param col 指定列位置*/public ChessGrid(int row, int col) {this.row = row;this.col = col;this.init();// 设用类成员初始化方法}/*** 棋格构造函数同时指定棋子状态** @param row 指定行位置* @param col 指定列位置* @param flag:指定状态*/public ChessGrid(int row, int col, int flag) {this.row = row;this.col = col;this.flag = flag;this.init();// 设用类成员初始化方法}/*** 初始化类成员*/private void init() {// 实例化类成员rim = new JLabel(IconResourses.rim);// 设置类成员相关属性rim.setBounds(0, 0, 35, 35);rim.setVisible(false);// 先设置布局,后添加组件this.setLayout(null);this.add(rim);}// 设置选框是否可见public void setRim(boolean flag) {rim.setVisible(flag);}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}// 返回当前棋格的状态public int getFlag() {return flag;}// 设置当前棋格的状态public void setFlag(int flag) {this.flag = flag;if (flag == 0) {this.setIcon(null);} else if (flag == 1) {this.setIcon(IconResourses.lblBlack);} else if (flag == 2) {this.setIcon(IconResourses.lblWhite);}}package ui;import javax.swing.Icon;import javax.swing.ImageIcon;public class IconResourses {public static Icon lblWhite=new ImageIcon(IconResourses.class.getResource("bai.gif"));//白棋子public static Icon lblBlack=new ImageIcon(IconResourses.class.getResource("hei.gif"));//黑棋子public static Icon bq_yiban=new ImageIcon(IconResourses.class.getResource("yiban.gif"));//表情一般public static Icon bq_shikao=new ImageIcon(IconResourses.class.getResource("shikao.gif"));//表情思考public static Icon yiban=new ImageIcon(IconResourses.class.getResource("yiban.gif"));public static Icon lose=new ImageIcon(IconResourses.class.getResource("lose.gif"));//表情一般public static Icon victory=new ImageIcon(IconResourses.class.getResource("victory.gif"));//胜利表情public static Icon btn_pass_un=new ImageIcon(IconResourses.class.getResource("btn_pass_un.gif"));//通过public static Icon btn_pass_on=new ImageIcon(IconResourses.class.getResource("btn_pass_on.gif"));//通过public static Icon btn_reset_un=new ImageIcon(IconResourses.class.getResource("btn_reset_un.gif"));//重置public static Icon btn_reset_on=new ImageIcon(IconResourses.class.getResource("btn_reset_on.gif"));//重置public static Icon btn_send=new ImageIcon(IconResourses.class.getResource("send.jpg"));//发送按钮public static Icon btn_return_un=new ImageIcon(IconResourses.class.getResource("btn_return_un.gif"));//返回public static Icon btn_return_on=new ImageIcon(IconResourses.class.getResource("btn_return_on.gif"));//返回public static Icon btn_goon_on=new ImageIcon(IconResourses.class.getResource("btn_goon_on.gif"));public static Icon btn_goon_un=new ImageIcon(IconResourses.class.getResource("btn_goon_un.gif"));public static Icon btn_start_on=new ImageIcon(IconResourses.class.getResource("btn_start_on.gif"));//开始public static Icon btn_start_un=new ImageIcon(IconResourses.class.getResource("btn_start_on.gif"));//开始public static Icon btn_back_on=new ImageIcon(IconResourses.class.getResource("btn_back_on.gif"));//返回public static Icon btn_back_un=new ImageIcon(IconResourses.class.getResource("btn_back_on.gif"));//返回public static Icon btnHelp=new ImageIcon(IconResourses.class.getResource("help.gif"));//帮助按钮背景public static Icon btnExit=new ImageIcon(IconResourses.class.getResource("exit.gif")); //退出游戏按钮背景public static Icon btnTwoGame=new ImageIcon(IconResourses.class.getResource("twogame.gif"));//双人游戏按钮背景public static Icon btnReturn=new ImageIcon(IconResourses.class.getResource("return.jpg"));public static Icon bgWelcome=new ImageIcon(IconResourses.class.getResource("welcome.gif"));//欢迎界面背景public static Icon bgMain=new ImageIcon(IconResourses.class.getResource("main.gif"));//游戏主界面背景public static Icon bgHelp=new ImageIcon(IconResourses.class.getResource("bg_help.gif"));//帮助界面背景public static Icon rim=new ImageIcon(IconResourses.class.getResource("kuang.gif"));//棋子外框public static Icon sound=new ImageIcon(IconResourses.class.getResource("bg.mid"));//背景音乐}package ui;import java.applet.Applet;import java.applet.AudioClip;/*** 播放声音类* 支持格式: .au、.aiff、.Wav、.Midi、.rfm*/public class Sound{//音乐路径private String url="bg.mid";//音乐对象private AudioClip audio=null;//默认构造函数,播放背景音乐public Sound(){this.init();}//根据新路径播放音乐public Sound(String url){this.url=url;this.init();}//初始化类成员private void init(){if(!"".equals(url)){try {audio = Applet.newAudioClip(Sound.class.getResource(url));} catch (Exception e) {e.printStackTrace();}}}//单曲public void play(){if(audio!=null){audio.stop();audio.play();}}//停止播放public void stop(){if(audio!=null){audio.stop();}}//循环播放public void loop(){if(audio!=null){audio.loop();}}}package ui;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JLabel;/*** 游戏帮助界面* @author*/public class Help extends JLabel implements ActionListener {/*** 版本号*/private static final long serialVersionUID = 1L;private FIR father = null;//父容器引用,构造函数中传入private JButton btnReturn = null;//返回欢迎界面按钮/*** 游戏帮助界面构造函数* @param father父容器引用*/public Help(FIR father) {//父容器引用传入,赋值this.father = father;//调用类成员初始化方法this.init();//此类继函至JLabel,以此可设置游戏欢迎界面的背景this.setIcon(IconResourses.bgHelp);}/*** 初始化方法* 此方法主要目的是:1 实例化类成员2 布局*/private void init(){//实例化类成员btnReturn = new JButton(IconResourses.btnReturn);//设置类成员位置大小btnReturn.setBounds(310, 470, 50,23);//为类成员注册监听器btnReturn.addActionListener(this);//先设设置布局,再添加组件this.setLayout(null);//添加组件this.add(btnReturn);}public void actionPerformed(ActionEvent e) {if (e.getSource() == btnReturn) {//返回按钮响应方法//显示欢迎界面father.show("welcome");}}}package ui;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;import javax.swing.*;public class Timer extends JPanel implements Runnable{/*** 时间设置以JLable作为载体*/private static final long serialVersionUID = 1L;private static Image image=Toolkit.getDefaultToolkit().createImage(Timer.class.getResource("number.gif"));private Game father;//调用父类private int secTemp;//从play开始到pause用了多少秒,每次play之后归0,secTemp记录从双方每一次落子到落子完成并暂停计时器时所消耗的时间private int seconds=1800;//比赛总时间private Thread time;//时间线程private boolean flag;//是否处于计时中/** 构造函数,默认比赛总时间为30分钟*/public Timer(Game father){this.father=father;this.init();}/** 构造函数,设置比赛总时间*/public Timer(Game father,int seconds){this.father=father;this.seconds=seconds;this.init();}/** 对私有属性seconds公开化*/public int getSeconds(){return this.seconds;}public void setSeconds(int seconds){this.seconds=seconds;this.repaint();//重置完时间后,刷新画板}/** 初始化相关成员*/private void init(){this.setBackground(Color.black);flag=false;time=new Thread(this);time.start();//启动线程,使其处于就绪状态}/** 重写JLalbe中的paint方法*/public void paint(Graphics g){super.paint(g);int temp=seconds/60;int i=0;//画分钟十位i=temp/10;g.drawImage(image, 0, 0, 9, 16, i*9, 0, (i+1)*9, 16, this);//画分钟个位i=temp%10;g.drawImage(image, 10, 0, 19, 16, i*9, 0, (i+1)*9, 16, this);//画中间线g.drawImage(image, 20, 0,29 ,16, 90, 0, 99, 16, this);//计算出秒数temp=seconds%60;//画秒钟个位i=temp/10;g.drawImage(image, 30, 0, 39, 16, i*9, 0, (i+1)*9, 16, this);//画秒钟个位i=temp%10;g.drawImage(image, 40, 0,49, 16, i*9, 0, (i+1)*9, 16, this); }/** 暂停时间*/public void pause(){this.flag=false;}/** 继续时间*/public void play(){this.flag=true;this.secTemp=0;}/** 实现线程的run接口*/public void run(){while(true){if(flag){if(seconds>0){seconds--;secTemp++;this.repaint();}else{father.timeOver();}}try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}}public int getSecTemp(){return this.secTemp;}}package ui;import java.awt.Cursor;import java.awt.Graphics;import java.awt.Image;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.util.ArrayList;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;public class Game extends JLabel implements MouseListener, ActionListener { /*** 游戏主界面*/private static final long serialVersionUID = 1L;private FIR father;private ChessGrid[][] crosses = new ChessGrid[15][15];// 实例化棋盘数组private ChessGrid temp = null;// 上一步棋格private int start = 0;// 游戏运行状态0未开始1进行中2暂停3回放private boolean flag = true;// 哪方行棋,true为黑方,false为白方private JButton btnStart = null;// 开始按钮private JButton btnReturn = null;// 返回按钮private JButton btnPass = null;// 暂停按钮private JButton btnBack = null;// 悔棋private Timer palTimeBai = null;// 白方剩余时间private Timer palTimeHei = null;// 黑方剩余时间private JLabel lblEmotionBai = null;// 白方表情private JLabel lblEmotionHei = null;// 黑方表情private ArrayList<ChessGrid> qb = null;// 棋步private Image image;// 鼠标图片/** 构造函数,转到FIR中去*/public Game(FIR father) {this.father = father;init();// 初始化类成员getImage("hei.gif");// 当转到该界面时,鼠标变成黑色的棋子this.setVisible(true);this.reSet();// 重置游戏参数}/** 初始化*/public void init() {this.setIcon(IconResourses.bgMain);// 棋盘背景界面this.setLayout(null);// 无布局// 循环棋盘格子,实例化,设置属性,同时添加监听器,并添加到游戏界面上int i = 0;// 行int j = 0;// 列for (i = 0; i < 15; i++) {for (j = 0; j < 15; j++) {crosses[i][j] = new ChessGrid(i, j);crosses[i][j].setBounds(163 + j * 35, 13 + i * 35, 35, 35);crosses[i][j].addMouseListener(this);this.add(crosses[i][j]);}}// 实例化保存棋步的容器qb = new ArrayList<ChessGrid>();// 实例化其它成员lblEmotionBai = new JLabel(IconResourses.bq_yiban);lblEmotionHei = new JLabel(IconResourses.bq_yiban);btnStart = new JButton(IconResourses.btn_start_on);btnBack = new JButton(IconResourses.btn_back_un);btnPass = new JButton(IconResourses.btn_pass_un);btnReturn = new JButton(IconResourses.btn_return_on);/** 黑白双方时间*/palTimeBai = new Timer(this);// palTimeBai.setSeconds(600);palTimeBai.setVisible(true);palTimeHei = new Timer(this);// palTimeHei.setSeconds(600);palTimeHei.setVisible(true);// 设置其它成员属性lblEmotionBai.setBounds(45, 65, 65, 65);lblEmotionHei.setBounds(45, 345, 65, 65);palTimeBai.setBounds(73, 206, 50, 16);palTimeHei.setBounds(73, 487, 50, 16);btnStart.setBounds(13, 250, 30, 60);btnBack.setBounds(78, 250, 30, 60);btnPass.setBounds(45, 250, 30, 60);btnReturn.setBounds(110, 250, 30, 60);// btnStart.setDisabledIcon(IconResourses.btn_start_un);// btnBack.setDisabledIcon(IconResourses.btn_back_un);// btnPass.setDisabledIcon(IconResourses.btn_pass_un);// btnReturn.setDisabledIcon(IconResourses.btn_return_un);btnStart.addActionListener(this);btnBack.addActionListener(this);btnPass.addActionListener(this);btnReturn.addActionListener(this);// 添加其它成员this.add(palTimeBai);this.add(palTimeHei);this.add(lblEmotionBai);this.add(lblEmotionHei);this.add(btnStart);this.add(btnBack);this.add(btnPass);this.add(btnReturn);}public void reSet() {// 重置棋盘for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {crosses[i][j].setFlag(0);crosses[i][j].setRim(false);}}start = 0;// 游戏标志设置为0,未开始flag = true;// 重新开始游戏,黑方先行棋// 暂停时间,并重置为1800秒palTimeBai.pause();palTimeBai.setSeconds(1800);palTimeHei.pause();palTimeHei.setSeconds(1800);// 重置表情lblEmotionBai.setIcon(IconResourses.bq_yiban);lblEmotionHei.setIcon(IconResourses.bq_yiban);qb.clear();// 清空棋步数组// 重置按钮图标btnStart.setIcon(IconResourses.btn_start_on);btnPass.setIcon(IconResourses.btn_pass_on);// 锁定一些功能按钮btnBack.setEnabled(false);btnPass.setEnabled(false);}/** 实现四个按钮的动作监听*/public void actionPerformed(ActionEvent e) {if (e.getSource() == btnStart) {// 开始游戏或重置游戏if (start == 0) {// 游戏未开始,执行开始操作btnStart.setIcon(IconResourses.btn_reset_on);// 开始按钮变为重置按钮btnPass.setIcon(IconResourses.btn_pass_on);// 暂停按钮变为可用的按钮btnBack.setIcon(IconResourses.btn_back_un);// 悔棋按钮变为可用的按钮/** 初始化并将黑子居中*/crosses[7][7].setBounds(163 + 7 * 35, 13 + 7 * 35, 35, 35);crosses[7][7].setFlag(1);crosses[7][7].setRim(true);qb.add(crosses[7][7]);// palTimeHei.play();// palTimeBai.pause();getImage("bai.gif");// 鼠标变成白子的图片flag = false;// 下一步为白子// 黑方先走,开始计时if (flag == true) {palTimeHei.play();palTimeBai.pause();} else {palTimeBai.play();palTimeHei.pause();}lblEmotionBai.setIcon(IconResourses.bq_shikao);// 设置黑方表情btnPass.setEnabled(true);// 暂停按钮可用btnBack.setEnabled(false);// 悔棋按钮不可用start = 1;// 标志游戏是在进行中} else {// 否则执行游戏重置操作this.reSet();}} else if (e.getSource() == btnPass) {// 暂停或继续游戏if (start == 1) {// 游戏进行中,进行暂停操作// 暂停时间palTimeBai.pause();palTimeHei.pause();start = 2;// 标志游戏为暂停状态btnPass.setIcon(IconResourses.btn_goon_on);// 更改成继续图标/** 暂停中不可悔棋*/btnBack.setIcon(IconResourses.btn_back_un);btnBack.setEnabled(false);} else if (start == 2) {// 游戏暂停中,进行继续操作// 根据当前是哪方下子,play相应的时间if (flag == true) {// 黑方行棋,开始计时palTimeHei.play();} else {// 白方行棋,开始计时palTimeBai.play();}start = 1;// 标志游戏为进行状态btnPass.setIcon(IconResourses.btn_pass_on);// 更改成暂停图标/** 游戏进行中可悔棋*/btnBack.setIcon(IconResourses.btn_back_on);btnBack.setEnabled(true);}} else if (e.getSource() == btnBack) {// 悔棋// 有棋步记录,且获得对方的同意,才可以悔棋int answer = JOptionPane.showConfirmDialog(null, "对方请求悔棋,是不答应?","信息", JOptionPane.YES_NO_OPTION);if (qb.size() > 0) {// 清除掉可能后来选择的一些格子方框if (temp != null) {temp.setRim(false);}// 取得最后下的一步棋,同时将它从棋步数组中移除/** 只能在白方行了第二着棋之后才能悔棋*/if (answer == 0 && qb.size() >= 5) {// 如果用户点击“确定”所做的操作ChessGrid box = qb.remove(qb.size() - 1);// 置空最后一步棋box.setFlag(0);box.setRim(false);}else{btnBack.setEnabled(false);}// 下棋角色,时间,表情对换// int answer=1;if (flag) {// 当前为黑方下棋,说明是白方悔棋flag = false;lblEmotionBai.setIcon(IconResourses.bq_shikao);lblEmotionHei.setIcon(IconResourses.bq_yiban);// 把被白方浪费掉的时间,返还给黑方,同时被浪费掉的这部分时间视为白方的palTimeHei.pause();int timewasteHei = palTimeHei.getSecTemp();// 黑棋还未下这一步棋所用时间palTimeHei.setSeconds(palTimeHei.getSeconds()+ timewasteHei);// palTimeBai.setSeconds(palTimeBai.getSeconds()-timewasteHei);palTimeBai.play();getImage("bai.gif");}} else {// 当前为白方下棋,说明是黑方悔棋flag = true;lblEmotionBai.setIcon(IconResourses.bq_yiban);lblEmotionHei.setIcon(IconResourses.bq_shikao);// 把被黑方浪费掉的时间,返还给白方,同时被浪费掉的这部分时间视为黑方的palTimeBai.pause();int timewasteBai = palTimeBai.getSecTemp();// 白棋上一步棋所用时间palTimeBai.setSeconds(palTimeBai.getSeconds() + timewasteBai);// palTimeHei.setSeconds(palTimeHei.getSeconds()-timewasteBai);palTimeHei.play();getImage("hei.gif");}// 没有棋步记录时,悔棋不可用,否则取得当前棋步数组中的最后一个子,进行红框标注if (qb.size() == 0) {btnBack.setEnabled(false);} else {// get(index)和remove(index)都返回当前数组中的最后一个对象// 区别是,get仅返回不从数组中删除这个对象,而remove返回的同时从数组中移除这个对象qb.get(qb.size() - 1).setRim(true);btnBack.setIcon(IconResourses.btn_back_on);btnBack.setEnabled(true);}} else if (e.getSource() == btnReturn) {// 返回欢迎界面// 游戏中,提示是否返回if (start > 0) {if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, "正在游戏中,返回将导至游戏信息丢失!", "五子棋",JOptionPane.YES_NO_OPTION)) {father.show("welcome");// 重置游戏this.reSet();}} else {father.show("welcome");}}}/** 当改白子行棋时鼠标上的图片变成白棋的图片,当改黑子行棋时鼠标上的图片变成黑棋的图片*/private void getImage(String image_url) {image = java.awt.Toolkit.getDefaultToolkit().createImage(FIR.class.getResource(image_url));Cursor transparentCursor = java.awt.Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisiblecursor"); // invisiblecursor是任意取的this.setCursor(transparentCursor);}/** 下棋的事件操作方法*/public void mouseClicked(MouseEvent e) {}/** 实现落子功能*/public void mousePressed(MouseEvent e) {crosses[7][7].setRim(false);/* 去掉当前棋上一步棋的外框*/if (qb.size() != 0) {temp = qb.get(qb.size() - 1);temp.setRim(false);}if (qb.size() == 4) {btnBack.setEnabled(true);}ChessGrid lblChessGrid = (ChessGrid) e.getSource();// 按键触发的是棋格上的JLableif (start == 1 && e.getButton() == 1) {// 游戏是否在进行中,同时只有左键起效if (lblChessGrid.getFlag() == 0) {// 只有无子的情况下,才允许落子,有子的情况下,不允许落子if (flag == false) {// 白子行棋getImage("hei.gif");// 鼠标变成黑子palTimeBai.pause();palTimeHei.play();lblChessGrid.setFlag(2);lblChessGrid.setVisible(true);lblChessGrid.setRim(true);qb.add(lblChessGrid);lblEmotionBai.setIcon(IconResourses.bq_yiban);lblEmotionHei.setIcon(IconResourses.bq_shikao);if (checkWin(lblChessGrid.getRow(), lblChessGrid.getCol())) {// System.out.println("fdk;");lblEmotionBai.setIcon(IconResourses.victory);lblEmotionHei.setIcon(IconResourses.lose);palTimeHei.pause();JOptionPane.showMessageDialog(this, "白方赢了!");this.gameOver();}flag = true;} else {// 黑子行棋getImage("bai.gif");// 鼠标变成白子palTimeHei.pause();palTimeBai.play();lblChessGrid.setFlag(1);lblChessGrid.setVisible(true);lblChessGrid.setRim(true);qb.add(lblChessGrid);lblEmotionBai.setIcon(IconResourses.bq_shikao);lblEmotionHei.setIcon(IconResourses.bq_yiban);if (checkWin(lblChessGrid.getRow(), lblChessGrid.getCol())) {lblEmotionBai.setIcon(IconResourses.lose);lblEmotionHei.setIcon(IconResourses.victory);palTimeBai.pause();JOptionPane.showMessageDialog(this, "黑方赢了!");this.gameOver();}flag = false;}}}}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}@Overridepublic void printComponents(Graphics arg0) {// TODO Auto-generated method stubsuper.printComponents(arg0);}/** 判胜处理*/// 检查当前下子是否可以胜利private boolean checkWin(int row, int col) {if (checkNum(row, col, 1) >= 5 || checkNum(row, col, 2) >= 5|| checkNum(row, col, 3) >= 5 || checkNum(row, col, 4) >= 5) { return true;} else {return false;}}// 判断连子数,type:1纵向,2横向,3左斜,4右斜private int checkNum(int row, int col, int type) {int nextrow = 0;// 向上走int nextcol = 0;int count = 1;int num = 0;if (row >= 0 && row < 15 && col >= 0 && col < 15) {if (type == 1) {// 纵向nextrow = row;// 向上走nextcol = col - 1;while (crosses[row][col].getFlag() != 0 && nextcol >= 0) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextcol--;} else {break;}}nextrow = row;// 向下走nextcol = col + 1;while (crosses[row][col].getFlag() != 0 && nextcol < 15) { if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextcol++;} else {break;}}num = count;}if (type == 2) {// 横向nextrow = row - 1;// 向左走nextcol = col;while (crosses[row][col].getFlag() != 0 && nextcol >= 0) { if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow--;} else {break;}}nextrow = row + 1;// 向右走nextcol = col;while (crosses[row][col].getFlag() != 0 && nextcol < 15) { if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow++;} else {break;}}num = count;}if (type == 3) {// 左斜nextrow = row - 1;// 向左上走nextcol = col - 1;while (crosses[row][col].getFlag() != 0 && nextcol >= 0&& nextrow >= 0) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow--;nextcol--;} else {break;}}nextrow = row + 1;// 向左下走nextcol = col + 1;while (crosses[row][col].getFlag() != 0 && nextcol < 15&& nextrow < 15) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow++;nextcol++;} else {break;}}num = count;}if (type == 4) {// 右斜nextrow = row - 1;// 向右下走nextcol = col + 1;while (crosses[row][col].getFlag() != 0 && nextcol >= 0&& nextrow >= 0) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow--;nextcol++;} else {break;}}nextrow = row + 1;// 向右上走nextcol = col - 1;while (crosses[row][col].getFlag() != 0 && nextcol < 15&& nextrow < 15) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow++;nextcol--;} else {break;}}num = count;}}return num;}// 游戏结束后清空棋盘public void gameOver() {this.reSet();// 重置棋盘}// 游戏重新开始的处理方法public void reStart() {}/** 双方任何一方还未分胜负之前时间用完后的处理*/public void timeOver() {if (palTimeBai.getSeconds() == 0 && palTimeHei.getSeconds() != 0) { JOptionPane.showMessageDialog(this, "白方游戏时间到,黑方获胜");gameOver();}if (palTimeBai.getSeconds() != 0 && palTimeHei.getSeconds() == 0) { JOptionPane.showMessageDialog(this, "黑方游戏时间到,白方获胜");gameOver();}if (palTimeBai.getSeconds() == 0 && palTimeHei.getSeconds() == 0) { JOptionPane.showMessageDialog(this, "游戏时间到,不分胜负");gameOver();}}}package ui;import java.awt.CardLayout;import java.awt.Dimension;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import javax.swing.JFrame;import javax.swing.JOptionPane;import java.awt.Toolkit;public class FIR extends JFrame implements WindowListener{private static final long serialVersionUID = 1L;private CardLayout layout;//布局private Welcome welcome;//欢迎界面private Help help;//帮助界面private Sound bgSound;//游戏背景音乐private Game game;//游戏界面/*** Launch the application* @param args*/public static void main(String args[]) {try {FIR window = new FIR();window.setVisible(true);} catch (Exception e) {e.printStackTrace();}}/*** Create the application*/public FIR() {initialize();init();}/*** Initialize the attributes of the frame*/private void initialize() {this.setTitle("单机版五子棋(无禁手)");this.setSize(700, 575);Dimension screen=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screen.width-700)/2, (screen.height-550)/2);this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);this.addWindowListener(this);//添加窗体监听器this.setResizable(false);}/*** 动态初始化该窗体*/public void init(){welcome=new Welcome(this);help=new Help(this);game=new Game(this);bgSound=new Sound();bgSound.loop();//循环播放背景音乐layout=new CardLayout();//将窗体设置为卡片布局this.setLayout(layout);this.add(welcome, "welcome");this.add(help,"help");this.add(game,"game");}/*** 显示相应名称的卡片* @param name 要显示的卡片的名称*/public void show(String name){layout.show(this.getContentPane(), name);}/***实现WindowListener接口中的抽象方法*/public void windowOpened(WindowEvent e){}/*** 在点游戏窗体关闭按钮时,提示是否退出游戏*/public void windowClosing(WindowEvent arg0) {//点击"是"确定退出游戏if(JOptionPane.YES_OPTION==JOptionPane.showConfirmDialog(this, "确定退出游戏吗?","五子棋",JOptionPane.YES_NO_OPTION)){System.exit(0);}}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}}。
最新 java五子棋源代码(完整版)
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import .*;
import java.util.*;
class clientthread extends thread
{
chessclient chessclient;
{
chessclient.isonchess=false;
chessclient.chesspad.chessvictory(chessclient.chesspad.chesscolor);
chessclient.chesspad.statustext.settext("对方退出,请点放弃游戏退出连接");
controlpad.joingamebutton.setenabled(false);
controlpad.cancelgamebutton.setenabled(false);
southpanel.add(controlpad,borderlayout.center);
southpanel.setbackground(color.pink);
panel southpanel=new panel();
panel northpanel=new panel();
panel centerpanel=new panel();
panel westpanel=new panel();
panel eastpanel=new panel();
try
{
while(true)
{
message=chessclient.in.readutf();
五子棋源代码
import java.awt.*;import java.awt.event.MouseListener;import java.awt.event.MouseEvent;import java.util.Vector;import javax.swing.*;public class wuziqi extends JFrame implements MouseListener{ public static void main(String args[]){wuziqi d=new wuziqi();}Vector v=new Vector();Vector white=new Vector();Vector black=new Vector();JButton btnstart =new JButton("开始");JButton btnstop =new JButton("停止");JToolBar tool=new JToolBar();boolean b; //用来判断白棋还是黑棋int blackcount,whitecount; //计算悔棋public wuziqi(){super("五子棋游戏");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮Container con=this.getContentPane();this.addMouseListener(this);//添加监听tool.add(btnstart);//添加按钮tool.add(btnstop);this.setSize(550,500);//设置窗体大小this.setVisible(true);}int w=20; //间距大小是双数int px=100,py=100; //棋盘的坐标int pxw=(px+w), pyw=(py+w);int w=w*16,h=w*16;int vline=(w+px); //垂直线的长度int hline=(h+py); //水平线的长度/*** 画棋盘*/public void paint(Graphics g){g.clearRect(0, 0, this.getw(), this.geth()); //清除面板g.setColor(Color.BLACK); //设置网格颜色g.drawRect(px, py, w, h); //网格大小g.drawString("简易五子棋-可以悔棋", 110, 70);for(int i=0;i<15;i++){g.drawLine(pxw+i*w,py,pxw+i*w,hline);//每条横线和竖线g.drawLine(px,pyw+i*w,vline,pyw+i*w);}g.setColor(Color.WHITE);}else{for(int x=0;x<v.size();x++){String str=(String)v.get(x);String tmp[]=str.split("-");int a=Integer.parseInt(tmp[0]);int b=Integer.parseInt(tmp[1]);a=a*w+px;b=b*w+py;if(x%2==0){g.setColor(Color.BLACK);}g.fillArc(a-w/2, b-w/2, w, w,0,360);}}public void updeta(Graphics g){ this.paint(g);}public void victory(int x,int y,Vector contain){ //判断胜利的方法int cv=0; //计算垂直的变量int ch=0; //计算水平的变量int ci1=0; //计算斜面的变量1int ci2=0; //计算斜面的变量2for(int i=1;i<5;i++){if(contain.contains((x+i)+"-"+y))ch++;else break;}System.out.println("前面已执行"+ch+"次");for(int i=1;i<5;i++){if(contain.contains((x-i)+"-"+y))ch++;else break;}System.out.println("后面已执行"+ch+"次");for(int i=1;i<5;i++){if(contain.contains(x+"-"+(y+i)))cv++;else break;}for(int i=1;i<5;i++){if(contain.contains(x+"-"+(y-i)))cv++;else break;}for(int i=1;i<5;i++){if(contain.contains((x+i)+"-"+(y+i)))ci1++;else break;}for(int i=1;i<5;i++){if(contain.contains((x-i)+"-"+(y-i)))ci1++;elsebreak;}for(int i=1;i<5;i++){if(contain.contains((x-i)+"-"+(y+i)))ci2++;else break;}for(int i=1;i<5;i++){if(contain.contains((x+i)+"-"+(y-i)))ci2++;else break;}if(ch>=4||cv>=4||ci1>=4||ci2>=4){System.out.println(v.size()+"步棋");if(v.size()%2==0){ //判断偶数是黑棋胜利,奇数白棋胜利JOptionPane.showMessageDialog(null,"恭喜你黑棋赢了");}else{JOptionPane.showMessageDialog(null,"恭喜你白棋赢了");}this.v.clear();this.black.clear();this.white.clear();this.repaint();}System.out.println(ch+" "+cv+" "+ci1+" "+ci2);}public void mouseClicked(MouseEvent e) {if(e.getButton()==e.BUTTON1){int x=e.getX();int y=e.getY();x=(x-x%w)+(x%w>w/2?w:0);y=(y-y%w)+(y%w>w/2?w:0);x=(x-px)/w;y=(y-py)/w;if(x>=0&&y>=0&&x<=16&&y<=16){if(v.contains(x+"-"+y)){System.out.println("已有棋了");}else{v.add(x+"-"+y);this.repaint();if(v.size()%2==0){black.add(x+"-"+y);this.victory(x, y,black);System.out.println("黑棋");}else{white.add(x+"-"+y);this.victory(x, y,white);System.out.println("白棋");}System.out.println(e.getX()+"-"+e.getY());}}else{System.out.println(e.getX()+"-"+e.getY()+"|"+ x+"-"+y+"\t 超出边界");}}if(e.getButton()==e.BUTTON3){ //悔棋方法全在这里System.out.println("鼠标右键-悔棋");if(v.isEmpty()){JOptionPane.showMessageDialog(this,"没有棋可以悔");}else{if(v.size()%2==0){ //判断是白方悔棋还是黑方悔棋blackcount++;if(blackcount>3){JOptionPane.showMessageDialog(this, "黑棋已经悔了三步");}else{v.remove(stElement());this.repaint();}}else{whitecount++;if(whitecount>3){JOptionPane.showMessageDialog(this, "白棋已经悔了三步");}else{v.remove(stElement());this.repaint();}}}}}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}}。
java开发实现五子棋游戏
java开发实现五⼦棋游戏本⽂实例为⼤家分享了java实现五⼦棋游戏的具体代码,供⼤家参考,具体内容如下此游戏具有双⼈对战功能和⼈机对战功能⼀、游戏界⾯的实现⼀个游戏⾸先从设计界⾯开始1、⾸先创建⼀个类,作⽤是通过对窗体组件的⼀些设置来实现简单游戏界⾯public void gameUI(){//窗体组件MyFrame jf = new MyFrame();jf.setSize(900, 800);jf.setTitle("冷丁-五⼦棋");//居中显⽰jf.setLocationRelativeTo(null);//设置退出进程jf.setDefaultCloseOperation(3);//流式布局管理器FlowLayout flow=new FlowLayout();jf.setLayout(flow);//边框布局BorderLayout border=new BorderLayout();jf.setLayout(border);//⾯板: JPanel 默认流式布局JPanel eastPanel=new JPanel();Dimension dm=new Dimension(100,0);//除了JFrame,其他组件设置⼤⼩都是该⽅法eastPanel.setPreferredSize(dm);jf.add(eastPanel,BorderLayout.EAST);}2、加⼊功能按钮JButton jbu=new JButton("开始");eastPanel.add(jbu,BorderLayout.EAST);JButton jbu2=new JButton("悔棋");eastPanel.add(jbu2,BorderLayout.EAST);JButton jbu3=new JButton("认输");eastPanel.add(jbu3,BorderLayout.EAST);JButton jbu4=new JButton("⼈机对战");eastPanel.add(jbu4,BorderLayout.EAST);//设置窗体可见jf.setVisible(true);每个按钮添加ActionListner监听jbu.addActionListener(mouse);jbu2.addActionListener(mouse);jbu3.addActionListener(mouse);jbu4.addActionListener(mouse);在GameMouse类中对过对actionPerformed⽅法的重新来判断当前是哪个按钮按下,并实现对应的功能public void actionPerformed(ActionEvent e) {//获取按钮上的内容String name=e.getActionCommand();System.out.println("点击按钮:"+name);if(name.equals("开始")){jf.removeMouseListener(this);jf.addMouseListener(this);startflag=false;flag=false;gameOver=false;for(int i=0;i<15;i++){for(int j=0;j<15;j++){}jf.paint(gr);}else if(name.equals("悔棋")){arrChess[nowx][nowy]=0;jf.paint(gr);this.flag=!this.flag;}else if(name.equals("认输")){if(this.flag){gr.setColor(Color.red);gr.setFont(new Font("TimesRoman", Font.BOLD, 50));gr.drawString("⿊⽅获胜!",300,300);}else{gr.setColor(Color.red);gr.setFont(new Font("TimesRoman", Font.BOLD, 50));gr.drawString("⽩⽅获胜!",300,300);}}else if(name.equals("⼈机对战")){jf.removeMouseListener(this);jf.addMouseListener(this);startflag=false;flag=false;gameOver=false;for(int i=0;i<15;i++){for(int j=0;j<15;j++){arrChess[i][j]=0;}}this.aiflag=true;jf.paint(gr);}}3、游戏效果是通过画笔画在组件上实现的,获取画笔:图形显⽰在哪个组件上,画笔就从该组件上获取。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分类号: U D C:D10621-408-(2007)5738-0 密级:公开编号:21成都信息工程学院学位论文基于Java的五子棋游戏的设计论文作者姓名:赵小龙申请学位类别:计算机科学与技术申请学位类别:工学学士指导教师姓名(职称):吴春旺论文提交日期:2007年06月10日基于Java的五子棋游戏的设计摘要五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。
主要完成了人机对战和玩家之间联网对战2个功能。
网络连接部分为Socket编程应用,客户端和服务器端的交互用Class Message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。
服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。
在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。
分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。
算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。
关键词:深度搜索;估值;电脑AI;五子棋;算法Gobang Java-based games designAbstractAs a sport, gobang is very popular in civil, in order to become familiar with gobang rules and techniques, and the study of simple artificial intelligence, I decide to use the Java to develope gobang games and complete the two functions including man-machine war and man-man war. Network Connection is Socket Programming for some applications, client and server interaction is definited by Class Message, which is a very good scalability, Client interface is responsible for the collection and maintenance of user input information, and error handling. Server users maintain online basic information and arbitrary two-time users of the chessboard of information, dynamic maintenance user list. During the man-machine players, it improves intelligence of the computer players through depth search and valuation module. Analyzes Module valuation of the precise elements, as well as a number of increased precision, and compares their search for nodes, which raises some computer AI programs on the basis of analysis, such as recursive algorithm, computer learning. Algorithm of procedures contribute to the understanding of the structure, logical thinking ability, In other areas of artificial intelligence has great references..Key words:Search depth; Valuation; Computer AI; Gobang ; Algorithm目录论文总页数:23页1引言 (1)1.1课题背景 (1)1.2本课题研究的意义 (1)1.3本课题的研究方法 (2)2课题相关基础 (2)2.1五子棋 (2)2.1.1棋盘和棋子 (2)2.1.2规则及解释 (3)2.1.3五子棋常用术语 (4)2.1.4五子棋攻防 (7)3JA V A (8)3.1J AVA简介 (8)3.2J AVA开发环境 (9)4课题详细研究方法 (10)4.1程序结构说明 (10)4.2棋盘及棋子的类 (11)4.2.1棋盘 (11)致谢 (13)声明 (14)1引言1.1课题背景五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为连珠,英译为Renju,英文称之为Gobang或FIR(Five in a Row 的缩写),亦有连五子、五子连、串珠、五目、五目碰、五格等多种称谓。
五子棋起源于古代中国,发展于日本,风靡于欧洲。
对于它与围棋的关系有两种说法,一说早于围棋,早在“ 尧造围棋” 之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。
在中国的文化里,倍受人们的青睐。
本世纪初五子棋传入欧洲并迅速风靡全欧。
通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。
Java语言是当今最为流行的程序设计语言之一作为一门非常优秀和极为健壮的编程语言,它同时具有的面向对象,与平台无关,分布式应用,安全,稳定和多线程等优良的特征,使用Java语言,不仅可以开发出功能强大的大型应用程序,而且Java语言本身突出的跨平台的特性也使得它特别适合于Internet上的应用开发,可以这样说,Java的出现使得所开发的应用程序“一次编写,处处可用”的实现成为了可能。
1.2本课题研究的意义近来随着计算机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有更多的娱乐项目,而棋类游戏能起到锻炼人的思维和修身养性的作用,而且棋类游戏水平颇高,大有与人脑分庭抗礼之势。
其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表;其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱。
越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而易见。
自己对人工智能比较感兴趣,而五子棋游戏程序的开发实现这个课题,正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对弈),让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。
人工智能属于计算机科学的领域,它以计算机技术为基础,近几十年来,它的理论和技术已经日益成熟,应用领域也正在不断扩大,显示出强大的生命力。
人工智能大致可以分成几个学科,它们每一个都是独特的,但是它们常常又互相结合起来完成设计任务,这时,这些学科之间的差别就变的很模糊。
人工智能在专家系统,自然语言理解,自动定理证明,自动程序设计,人工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实质上是博弈论问题)和家用电器智能化等领域都有广泛的应用。
而这个课题就是和人工智能中的博弈论领域紧密相关的。
这个题目核心是人工智能和Socekt编程,。
并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。
它的概念、方法和技术,正在各行各业广泛渗透。
智能已经成为当今各种新产品、新装备的发展方向。
所以,趁着这个机会,对人工智能中比较容易实现的人机博弈进行了解研究学习,也是很实用且很有必要的。
1.3本课题的研究方法在进行游戏设计之前,首先决定的第一个问题就是,使用什么开发环境来编写环境? 自己虽然比较熟悉Java语言,但是实际开发项目经验很少,所以决定用Jcreator,其拥有高亮语法编辑、使用向导以及完全定制的用户界面,最主要的是能够自动查找文件于 Main 方法或 Html 文件以支持Java 小应用程序,然后启动相应的工具。
其次确定整个程序的结构框架。
由于Applet运行速度较慢,如果在加上算法搜索时间,显然不符合程序的设计要求,决定用Java应用程序开发.整个程序的功能实现流程是这样的:网络对战涉及算法较少,所以先实现网络部分,实现基本的棋盘和棋子的类,添加判断胜负条件,这部是基础,也是很重要的,电脑AI也在这些基础上添加上来的。
这个题目的2个功能包括2个重要算法,电脑AI和胜负条件,胜负条件运算量不大,有固定的模式。
难点是人工智能,可以这样说,人工智能的好坏决定了这个题目的完成深度。
所以,大部份时间花在AI算法的研究和改进上,对于算法我掌握的不多,研究了一些国内的五子棋算法,参考了一些游戏设计算法,详细比较各种算法的优缺点,而且参考了现代五子棋比赛的各种规则和技巧,尽量联系实际,努力提高电脑AI。
2课题相关基础2.1五子棋2.1.1棋盘和棋子现代五子棋棋盘,经过国际棋联的多次修改,最终定为15 X 15路,即棋盘由横竖各15条平行线交叉组成,共有225个交叉点;棋盘上共有五个星位,中间的星位称为天元,周围四点为小星,与围棋盘略有不同。
见图1。
图1 棋盘五子棋的棋子和围棋相同,分黑白2种颜色,通常为散圆形,有一面凸起或二面凸起等形状,一副棋子总数为225枚,其中黑子113枚,白子112枚。
关于计时,正规比赛按不同级别设置了不同的时间限制,一般的玩家都没有这个限制。
2.1.2规则及解释1:黑棋先行,白棋随后。
从天元开始相互顺序落子。
2:最先在棋盘的横向、竖向、斜向形成连续的相同色五个棋子的一方为胜利。
3:黑棋禁手判负、白棋无禁手。
黑棋禁手包括“三、三”;“四、四”;“长连”。
黑方只能用“四、三”去取胜。
4:如分不出胜负,则定位平局。
5:对局中拔子、中途退场均判为负6:五连与禁手同时形成,先五为胜。
7:黑方禁手形成时,白方应立即指出。
若白方未发现或发现后不立即指正,反而继续落子,则不能判黑方负。
五子棋是由两个人在一盘棋上进行对抗的竞技运动。
在对局开始时,先由执黑棋的一方将一枚棋子的落在“天元”上,然后由执白棋的一方在黑棋周围的交叉点上落子。
如此轮流落子直到某一方首先在棋盘的直线横线或斜线上形成连续的五子或五子以上,则该方就算获胜。