创建一个简单的五子棋游戏,带GUI界面。不多说,上代码。首先上的是五子棋模型。这个模型提供简单的放置棋子,判断是否五子相连,也就是是否赢了。代码如下所示。

/**game five in a row* */
public class FiveInARowModel {public static final int EMPTY=0;//no chessmanpublic static final int BLACK=1;//black chessmanpublic static final int WHITE=2;//white chessmanprivate int[][]board;private int lastPutRow,lastPutCol;public FiveInARowModel(int dimension){board=new int[dimension][dimension];clear();}public int getDimension(){return board.length;}public int getChessman(int row,int col){return board[row][col];}public boolean isEmpty(int row,int col){return EMPTY==getChessman(row, col);}public boolean isFull(){for(int k=0;k<board.length;++k)for(int j=0;j<board.length;++j)if(isEmpty(k, j))return false;return true;}public void clear(){//board=new int[board.length][board.length];for(int k=0;k<board.length;++k)for(int j=0;j<board.length;++j)board[k][j]=EMPTY;lastPutRow=lastPutCol=-1;}/**@return last position of the chessman put on the board* */public int[]getLastPut(){return new int[]{lastPutRow,lastPutCol};}public boolean trySetChessman(int row,int col,int chessman){if(!isEmpty(row, col))return false;if(chessman!=BLACK&&chessman!=WHITE)return false;board[row][col]=chessman;//lastPutRow=row;//lastPutCol=col;boolean win= checkWin(row, col);board[row][col]=EMPTY;return win;}/**put a chessman on the board* @param row row of position to put chessman* @param col column of position to put chessman* @param chessman type of chessman to put* @return true if the putter wins* */public boolean setChessman(int row,int col,int chessman) throws Exception{if(!isEmpty(row, col))throw new Exception("Non-empty position!");if(chessman!=BLACK&&chessman!=WHITE)throw new Exception("Invalid chessman");board[row][col]=chessman;lastPutRow=row;lastPutCol=col;return checkWin(row, col);}//chech whether five chessmans in a lineprivate boolean checkWin(int row,int col){//left->rightint chessman=getChessman(row, col);int selfChessManNum=1;for(int left=col-1;left>=0&&getChessman(row, left)==chessman;--left,++selfChessManNum);for(int right=col+1;right<getDimension()&&getChessman(row, right)==chessman;++right,++selfChessManNum);if(selfChessManNum>=5)return true;//up->downselfChessManNum=1;for(int up=row-1;up>=0&&getChessman(up,col)==chessman;--up,++selfChessManNum);for(int down=row+1;down<getDimension()&&getChessman(down,col)==chessman;++down,++selfChessManNum);if(selfChessManNum>=5)return true;//left-up->right-downselfChessManNum=1;for(int left=col-1,up=row-1;left>=0&&up>=0&&getChessman(up, left)==chessman;--left,--up,++selfChessManNum);for(int right=col+1,down=row+1;right<getDimension()&&down<getDimension()&&getChessman(down, right)==chessman;++right,++down,++selfChessManNum);if(selfChessManNum>=5)return true;//right-up->left-downselfChessManNum=1;for(int left=col-1,down=row+1;left>=0&&down<getDimension()&&getChessman(down, left)==chessman;--left,++down,++selfChessManNum);for(int right=col+1,up=row-1;right<getDimension()&&up>=0&&getChessman(up, right)==chessman;++right,--up,++selfChessManNum);if(selfChessManNum>=5)return true;return false;}
}

接着是计算机玩家的代码。这里只是个简单的框架,只做最简单的判断,首先看是否有四子相连,则直接赢棋,否则就是下子堵另一方。

import java.util.Random;//
public class ComputerPlayer {private FiveInARowModel board;private int chessman;public ComputerPlayer(FiveInARowModel board,int chessman){this.board=board;this.chessman=chessman;}/*** put a chessman on board* @return true if computer wins* */public boolean play(){int[]anotherPlayerPut=board.getLastPut();if(anotherPlayerPut[0]<0){try {board.setChessman(board.getDimension()/2, board.getDimension()/2, chessman);} catch (Exception e) {}return false;}int row=anotherPlayerPut[0],col=anotherPlayerPut[1];int nearRow=-1,nearCol=-1,dis=2*board.getDimension();//search a position if player can winfor(int k=0;k<board.getDimension();++k)for(int j=0;j<board.getDimension();++j)if(board.isEmpty(k, j)){if(Math.abs(k-row)+Math.abs(j-col)<dis){nearCol=j;nearRow=k;dis=Math.abs(k-row)+Math.abs(j-col);}if(board.trySetChessman(k, j, chessman)){try {return board.setChessman(k, j, chessman);} catch (Exception e) {//impossible to get herereturn false;}}}////left->right//check whether another player has more than 3 chessman in a rowif(checkLeftToRight(row, col))return false;if(checkUpToDown(row, col))return false;if(checkLeftUpToRightDown(row, col))return false;if(checkLeftDownToRightUp(row, col))return false;//choose a position randomlytry {board.setChessman(nearRow, nearCol, chessman);} catch (Exception e) {}return false;}private boolean checkLeftToRight(int row,int col){return check(row,col,0,1);}private boolean checkUpToDown(int row,int col){return check(row,col,1,0);}private boolean checkLeftUpToRightDown(int row,int col){return check(row,col,1,1);}private boolean checkLeftDownToRightUp(int row,int col){return check(row,col,-1,1);}//check chessmans in a line. If more than 3 chessmans in a row, then blocked itprivate boolean check(int row,int col,int drow,int dcol){int startRow=row-drow,startCol=col-dcol,endRow=row+drow,endCol=col+dcol;int chessman=board.getChessman(row, col);int sameChessNum=1;while(startRow>=0&&startCol>=0&&board.getChessman(startRow, startCol)==chessman){startRow-=drow;startCol-=dcol;++sameChessNum;}while(endRow<board.getDimension()&&endCol<board.getDimension()&&board.getChessman(endRow, endCol)==chessman){endRow+=drow;endCol+=dcol;++sameChessNum;}if(sameChessNum>=3){//more than 3  chessman in a rowif(startRow>=0&&startCol>=0&&board.isEmpty(startRow, startCol)){try {board.setChessman(startRow, startCol, this.chessman);return true;} catch (Exception e) {}}else if(endRow<board.getDimension()&&endCol<board.getDimension()&&board.isEmpty(endRow, endCol)){try {board.setChessman(endRow, endCol, this.chessman);return true;} catch (Exception e) {}}}return false;}
}

然后创建一个棋盘面板。显示棋局,设置好鼠标事件处理。

import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;import javax.swing.JOptionPane;
import javax.swing.JPanel;public class BoardPanel extends JPanel {public static final int WIDTH=600;public static final int HEIGHT=600;private static int MARGIN=20;private FiveInARowModel board;//chessman boardprivate ComputerPlayer computerPlayer;public BoardPanel(FiveInARowModel board){this.board=board;computerPlayer=new ComputerPlayer(board, FiveInARowModel.BLACK);this.setBackground(Color.WHITE);addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {Point p=e.getPoint();int row,col;int dim=BoardPanel.this.board.getDimension();int cellWidth=(getWidth()-2*MARGIN)/dim;if(p.y>=MARGIN&&p.y<MARGIN+dim*cellWidth&&p.x>=MARGIN&&p.x<MARGIN+dim*cellWidth){row=(p.y-MARGIN)/cellWidth;col=(p.x-MARGIN)/cellWidth;if(!BoardPanel.this.board.isEmpty(row, col))return;try {//user put a chessmanboolean win=BoardPanel.this.board.setChessman(row, col, FiveInARowModel.WHITE);BoardPanel.this.drawChessman(row, col);if(win){//user winsJOptionPane.showMessageDialog(BoardPanel.this, "You win!");BoardPanel.this.board.clear();BoardPanel.this.repaint();}else if(BoardPanel.this.board.isFull()){//fullJOptionPane.showMessageDialog(BoardPanel.this, "No empty cell!");BoardPanel.this.board.clear();BoardPanel.this.repaint();}else{//computer put a chessmanwin=computerPlayer.play();int[]last=BoardPanel.this.board.getLastPut();row=last[0];col=last[1];BoardPanel.this.drawChessman(row, col);if(win){//computer winsJOptionPane.showMessageDialog(BoardPanel.this, "Computer win!");BoardPanel.this.board.clear();BoardPanel.this.repaint();}else if(BoardPanel.this.board.isFull()){JOptionPane.showMessageDialog(BoardPanel.this, "No empty cell!");BoardPanel.this.board.clear();BoardPanel.this.repaint();}}} catch (Exception e1) {e1.printStackTrace();}}}});}public int getWidth() {return WIDTH;}public int getHeight() {return HEIGHT;}public void paint(Graphics g) {Graphics2D g2d=(Graphics2D) g;//fill white back groundg2d.setColor(Color.CYAN);g2d.fillRect(0, 0, WIDTH, HEIGHT);//write tipg2d.setColor(Color.BLACK);g2d.drawString("Computer", MARGIN, MARGIN*2/3);FontMetrics fm=g2d.getFontMetrics();Rectangle2D rect=fm.getStringBounds("Computer", g2d);int r=MARGIN-2;g2d.drawOval(MARGIN+(int)rect.getWidth()+r, 0, r, r);g2d.fillOval(MARGIN+(int)rect.getWidth()+r, 0, r, r);g2d.drawString("User", WIDTH/2, MARGIN*2/3);rect=fm.getStringBounds("User", g2d);g2d.drawOval(WIDTH/2+(int)rect.getWidth()+r, 0, r, r);g2d.setColor(Color.WHITE);g2d.fillOval(WIDTH/2+(int)rect.getWidth()+r, 0, r, r);//draw background of boardint cellWidth=(getWidth()-2*MARGIN)/board.getDimension();g2d.setColor(Color.GRAY);g2d.fillRect(MARGIN, MARGIN, cellWidth*board.getDimension(), cellWidth*board.getDimension());//draw linesg2d.setColor(Color.BLACK);for(int k=0;k<board.getDimension()+1;++k){g2d.drawLine(MARGIN+k*cellWidth, MARGIN, MARGIN+k*cellWidth, MARGIN+cellWidth*board.getDimension());g2d.drawLine(MARGIN, MARGIN+k*cellWidth, MARGIN+cellWidth*board.getDimension(), MARGIN+k*cellWidth);}for(int k=0;k<board.getDimension();++k){for(int j=0;j<board.getDimension();++j)drawChessman(k, j);}}private void drawChessman(int row,int col){int chessman=board.getChessman(row, col);if(chessman!=FiveInARowModel.BLACK&&chessman!=FiveInARowModel.WHITE)return;int x,y;int cellWidth=(getWidth()-2*MARGIN)/board.getDimension();x=MARGIN+col*cellWidth;y=MARGIN+row*cellWidth;Graphics2D g2d=(Graphics2D) this.getGraphics();int pad=2;Color color=chessman==FiveInARowModel.BLACK?Color.BLACK:Color.WHITE;g2d.setColor(color);g2d.fillOval(x+pad, y+pad, cellWidth-2*pad, cellWidth-2*pad);}
}

接着就是创建一个主窗口,将棋盘放在中央。

import java.awt.BorderLayout;import javax.swing.JFrame;public class MainFrame extends JFrame {public MainFrame() {FiveInARowModel board=new FiveInARowModel(19);BoardPanel panel=new BoardPanel(board);getContentPane().add(panel,BorderLayout.CENTER);setSize(panel.getWidth(),10+panel.getHeight());setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}

终于,到了主函数了。

public class Main {public static void main(String[]args){MainFrame mf=new MainFrame();mf.setVisible(true);}}

好了。看看结果吧。这是初始界面。

接着是下棋的界面。

好了,最后是用户赢了。

总体就是这样了,代码很简单。主要就是计算机的智能太低了,不过显然这是可以改进的。当然了,五子棋模型类也需要改进,毕竟现在不支持退回。

java实现的五子棋相关推荐

  1. linux控制台单人五子棋简书,Java控制台版五子棋的简单实现方法

    这篇文章主要给大家介绍了关于Java控制台版五子棋的简单实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 设计一个10*1 ...

  2. java课设 五子棋_Java课程设计 ————五子棋 (个人博客)

    JAVA课程设计 五子棋(博客个人版) •团队课程设计博客链接 •个人负责模块或任务说明 1.主框架类:设置棋盘窗体,颜色等 2.isWin方法:判断胜负 •自己的代码提交记录截图 •自己负责模块或任 ...

  3. java小游戏:五子棋人机大战

    一.java小游戏:五子棋人机大战 1.绘制窗口 package wuziqi;import javax.swing.*; import java.awt.event.MouseAdapter; im ...

  4. java实训五子棋_Java棋类游戏实践之单机版五子棋

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 一.实践目标 1.掌握JavaGUI界面设计 2.掌握鼠标事件的监听(MouseListener,MouseMotion ...

  5. java图形化五子棋总结,Java从此丰富多彩-五子棋项目总结

    当前位置:我的异常网» 编程 » Java从此丰富多彩-五子棋项目总结 Java从此丰富多彩-五子棋项目总结 www.myexceptions.net  网友分享于:2013-11-08  浏览:7次 ...

  6. Java Applet实现五子棋游戏

    Java Applet实现五子棋游戏 从谷歌的AlphaGo到腾讯的绝艺,从人脸识别到无人驾驶,从谷歌眼镜到VR的兴起,人工智能领域在不断的向前迈进,也在不断深入的探索.但背后错综复杂的技术和利益成本 ...

  7. Java小游戏——五子棋

    Java小游戏--五子棋详细解析

  8. Java实现的五子棋游戏 ~java.awtjava.swing

    文章目录 Java实现的五子棋游戏 1.实现效果 2.实现源码 2.1运行主函数main.java 2.2 棋盘布局Chessboard.java 3.Algorithm算法 点击下载链接:Java实 ...

  9. JavaFx/Java 大作业 五子棋 实验报告

    Java大作业五子棋实验报告 实验目的 通过此次实验,对这一学期学习的内容尤其是界面开发部分做了一个很好的回顾,看似简单的五子棋程序,设计好也确实费了我一点功夫 功能模块简介和系统结构图 ChessG ...

  10. Java+Swing实现五子棋游戏

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 二.系统展示 1.首页 2.黑棋走 3.白棋走 三.部分代码 AI.java Chess.java Gobang.java GobangL ...

最新文章

  1. 一起学Hadoop——实现两张表之间的连接操作
  2. 信息系统项目管理知识--项目成本管理
  3. MySql中的运算符
  4. Spring AOP两种使用方式以及如何使用解析
  5. 自考专科计算机信息管理专业好,计算机信息管理(专科)专业介绍
  6. Oracle NID工具修改数据库DBID和数据库名称
  7. win7旗舰版梦幻主题补丁~完美你的桌面
  8. 软件测试---如何选择合适的正交表
  9. 《信息与编码》考试复习笔记6----第六章连续信源熵和信道容量相关例题
  10. 联想拯救者P7000八代I7 8750H 可以安装WIN7系统吗
  11. vision安装过程中出错_NVIDIA安装程序失败 3D vision 驱动程序 失败 是为什么,如图所示...
  12. pandas精华总结
  13. matlab中floor函数,floor函数
  14. java mongodb json_java向mongoDB中插入Json
  15. Altium_Designer(protel_DXP)英文菜单汉化对应表表
  16. 网络安全-网站后台的寻找+网页JS文件信息收集
  17. 【电脑讲解】宽带连接错误711的两种解决方法
  18. mysql sphinx 中文搜索_MySQL中文全文搜索用迅搜还是Sphinx?
  19. 【第三趴】uni-app页面搭建与路由配置(了解工程目录结构、学会搭建页面、配置路由并成功运行)
  20. linux nginx rpm 安装配置,Centos下安装nginx rpm包

热门文章

  1. 汉字五行 五格五行 喜用神
  2. 和谁在一起的确很重要
  3. 固态硬盘使用的优化——适用于任何版本的固态
  4. ESP8266进阶篇
  5. appium 报错:Original error:Could not proxy command to remote server. Original error:socket hang up
  6. 发送邮件服务器连接错误什么意思,SMTP 错误(-1) :连接服务器失败
  7. 计算机应用基础0006 19春在线作业1,《计算机应用基础0006》19春在线作业1 为了实现自动控制处理 需要计算机具有的基础条件是...
  8. python笛卡尔坐标系_python – n球面坐标系到笛卡尔坐标系
  9. 通过URL传参(参数也是URL)
  10. Python 爬取 Google Map POI