活动地址:CSDN21天学习挑战赛

界面效果:

实现:

第一步:定义好设计该游戏要用到的组件以及相关数据;

第二步:组装组件,给组件设置相对应的功能;

第三步:调用init()方法;

具体

第一步

用到的组件:f游戏窗口,存放四张图的bufferedImage对象分别代表棋盘,黑棋,白棋,选中框;以及3个按钮button,还有结束界面result。

相关数据:例如:棋盘的宽(TABLE_WIDTH)高(TABLE_HEIGHT),棋盘横向纵向分别能下多少棋子BOARD_SIZE,每个棋子占用棋RATE,还有最棋子们对棋盘最左边框的偏移量X_OFFSET,对上边框的偏移量Y_OFFSET,棋子:board_type 值为0 -没有棋子 1-白棋 2-黑棋。

声明一个二维数组board[][]来记录棋子,如果board[ i ][ j ]值为0 -没有棋子 1-白棋 2-黑棋

定义一个选择框的坐标,用selected_X记录横坐标,用selected_Y记录纵坐标,默认值都为-1;

还自定义一个类:ChessBoard,重写paint方法用来绘画棋盘,棋子,选择框;

第二步

给按钮添加事件监听器,添加颜色变换效果,并通过改变board_type来选择下黑棋还是白棋或者是没有棋子,调用repaint方法;

给棋盘添加一个鼠标移动监听器,用来记录选选择框的位置;

定义一个判断是否获胜方法isOwn;

然后再给棋盘添加一个鼠标监听器,用来记录鼠标左击之后新棋子的坐标pos_X,pos_Y;

在左击之后,判断在玩家的棋子是否成五子,若成五子,则结束游戏,弹出(白/黑)玩家获胜;若不成五子,则继续比赛,并将选择框的坐标值select_X和select_Y重新赋值为-1;

最后设置checkboard的大小,checkboard添加到f窗口中,将f设置合适的大小,并使它可见

另外我额外给窗口添加了一个窗口关闭的事件监听器,方便大家关闭窗口;

第三步

调用init()方法

代码最核心的地方可能就是判断输赢(哪个玩家)

boolean isOwn(int pos_X,int pos_Y,int board_type)

pos_X :下的棋子横坐标,pos_Y:下的棋子纵坐标,board_type表示(执(白/黑)棋)玩家

主要思路:在玩家接下来一个棋子下落时,我们要立刻对下棋位置周围八个方向进行检验,其分大体来说是4条边,从上到下,从左到右,从左上到右下,从右上到左下;用count来记录每条边棋子的情况,当一种棋子在每条边上连续出现5个时,直接return true;结束该方法;记住在每一条边上遍历完之后要重新更新count,将其赋值为1.

isOwn()方法代码实现:

//    某玩家是否赢了private boolean isOwn(int x,int y,int board_type) {int temp=board[x][y]==board_type?1:0;int count = temp;int posX = 0;int posY = 0;
//        水平方向
//        向左遍历for (posX = x - 1; posX > 0; posX--) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向右遍历for (posX = x + 1; posX <= BOARD_SIZE; posX++) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        垂直方向
//        重新更count值count = temp;
//        向上遍历for (posY = y - 1; posY > 0; posY--) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向下遍历for (posY = y + 1; posY <= BOARD_SIZE; posY++) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        左下-右上方向
//        重新更新count值count=temp;
//        向左下角遍历for (posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        向右上角遍历for (posX = x + 1, posY = y + 1; posX <= BOARD_SIZE && posY <= BOARD_SIZE; posX++, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        左上-右下
//        更新count值count=temp;
//      向右下角遍历for (posX = x + 1, posY = y - 1; posX <= BOARD_SIZE && posY > 0; posX++, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向左上角遍历for (posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}return false;}

五子棋代码实现:

public class Gobang {TextArea result=new TextArea();//定义五子棋游戏窗口private JFrame f = new JFrame("五子棋游戏");//声明四个BufferedImage对象,分别记录四张图片BufferedImage table;BufferedImage black;BufferedImage white;BufferedImage selected;//声明棋盘的宽和高final int TABLE_WIDTH = 535;final int TABLE_HEIGHT = 536;//声明棋盘横向和纵向分别可以下多少子,他们的值都为15final int BOARD_SIZE = 15;//声明每个棋子占用棋盘的比率final int RATE = TABLE_WIDTH / BOARD_SIZE;//声明变量,记录棋子对于x方向和y方向的偏移量final int X_OFFSET = 5;final int Y_OFFSET = 6;//声明一个二维数组,记录棋子, 如果索引[i][j]处的值为  0-没有棋子  1-白棋  2-黑棋int[][] board = new int[BOARD_SIZE][BOARD_SIZE];//声明红色选择框的坐标  该坐标其实就是二维数组board中的索引int selected_X = -1;int selected_Y = -1;//自定义类,继承Canvasprivate class ChessBoard extends JPanel {@Overridepublic void paint(Graphics g) {//绘图//绘制棋盘g.drawImage(table,0,0,null);//绘制选择框if (selected_X>0 && selected_Y>0){g.drawImage(selected,selected_X*RATE+X_OFFSET,selected_Y*RATE+Y_OFFSET,null);}//绘制棋子for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {//绘制黑棋if (board[i][j] == 2){g.drawImage(black,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);}//绘制白棋if (board[i][j] == 1){g.drawImage(white,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);}}}}}ChessBoard chessBoard = new ChessBoard();//声明变量,记录当前下棋的颜色int board_type = 2;//声明底部需要用到的组件Panel p = new Panel();Button whiteBtn = new Button("白棋");Button blackBtn = new Button("黑棋");Button deleteBtn = new Button("删除");public void refreshBtnColor(Color whiteBtnColor,Color blackBtnColor,Color deleteBtnColor){whiteBtn.setBackground(whiteBtnColor);blackBtn.setBackground(blackBtnColor);deleteBtn.setBackground(deleteBtnColor);}public void init() throws Exception {//组装视图,编写逻辑whiteBtn.addActionListener(e->{// 修改当前要下的棋子的标志为1board_type = 1;// 刷新按钮的颜色refreshBtnColor(Color.GREEN,Color.GRAY,Color.GRAY);});blackBtn.addActionListener(e->{// 修改当前要下的棋子的标志为2board_type = 2;// 刷新按钮的颜色refreshBtnColor(Color.GRAY,Color.GREEN,Color.GRAY);});deleteBtn.addActionListener(e->{// 修改当前要下的棋子的标志为0board_type = 0;// 刷新按钮的颜色refreshBtnColor(Color.GRAY,Color.GRAY,Color.GREEN);});p.add(whiteBtn);p.add(blackBtn);p.add(deleteBtn);f.add(p,BorderLayout.SOUTH);//组装棋盘//初始化图片table = ImageIO.read(new File("src\\awt\\img\\board.jpg"));white = ImageIO.read(new File("src\\awt\\img\\white.gif"));black = ImageIO.read(new File("src\\awt\\img\\black.gif"));selected = ImageIO.read(new File("src\\awt\\img\\selected.gif"));//处理鼠标移动chessBoard.addMouseMotionListener(new MouseAdapter() {@Overridepublic void mouseMoved(MouseEvent e) {selected_X = (e.getX()-X_OFFSET)/RATE;selected_Y = (e.getY()-Y_OFFSET)/RATE;chessBoard.repaint();}});//处理鼠标点击chessBoard.addMouseListener(new MouseAdapter() {//当鼠标被点击后 会调用这个方法@Overridepublic void mouseClicked(MouseEvent e) {int xPos = (e.getX()-X_OFFSET)/RATE;int yPos = (e.getY()-Y_OFFSET)/RATE;board[xPos][yPos] = board_type;if(isOwn(xPos,yPos,1)){result.append("白棋获胜");chessBoard.setVisible(false);p.setVisible(false);f.add(result);}if(isOwn(xPos,yPos,2)){result.append("黑棋获胜");chessBoard.setVisible(false);p.setVisible(false);f.add(result);}chessBoard.repaint();}@Overridepublic void mouseExited(MouseEvent e) {selected_X=-1;selected_Y=-1;chessBoard.repaint();}});chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));f.add(chessBoard);//        关闭窗口f.addWindowFocusListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});//设置frame最佳大小并可见f.pack();f.setVisible(true);}
//    某玩家是否赢了private boolean isOwn(int x,int y,int board_type) {int temp=board[x][y]==board_type?1:0;int count = temp;int posX = 0;int posY = 0;
//        水平方向
//        向左遍历for (posX = x - 1; posX > 0; posX--) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向右遍历for (posX = x + 1; posX <= BOARD_SIZE; posX++) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        垂直方向
//        重新更count值count = temp;
//        向上遍历for (posY = y - 1; posY > 0; posY--) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向下遍历for (posY = y + 1; posY <= BOARD_SIZE; posY++) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        左下-右上方向
//        重新更新count值count=temp;
//        向左下角遍历for (posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        向右上角遍历for (posX = x + 1, posY = y + 1; posX <= BOARD_SIZE && posY <= BOARD_SIZE; posX++, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        左上-右下
//        更新count值count=temp;
//      向右下角遍历for (posX = x + 1, posY = y - 1; posX <= BOARD_SIZE && posY > 0; posX++, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向左上角遍历for (posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}return false;}public static void main(String[] args) throws Exception {new Gobang().init();}}

如果有些小伙在运行时,出现下面这个问题。可以把new File()中的相对路径改成关于盘符的绝对路径。

代码中使用的图片在下面的百度网盘中

链接:https://pan.baidu.com/s/1CQSk_rU0S0C7Y1XXiHs56Q?pwd=xzhf 
提取码:xzhf

棋类游戏-五子棋小游戏相关推荐

  1. python小游戏 五子棋小游戏设计与实现

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3.1 环境配置 3.2 Pygame介绍 4 具体实现 5 最后 0 项目简介

  2. Python简短代码实现五子棋小游戏。。。

    五子棋是是一种两人对弈的纯策略型棋类游戏. 玩法介绍: 玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜.玩法二:自己形成五子连线就替换对方任意一枚棋子.被替换的 ...

  3. Android Studio实现五子棋小游戏

    项目目录 一.项目概述 二.开发环境 三.详细设计 1.布局设计 2.验证码 3.AI人机 4.背景音乐 四.运行演示 五.项目总结 六.源码获取 一.项目概述 五子棋是一种两人对弈的策略型棋类游戏, ...

  4. c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc

    C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...

  5. Java编写的五子棋小游戏

    看书的时候看到一个不完整的Java编写的一个五子棋小游戏,为了恢复一下编程能力刚刚把这个小程序完成了. 实现的功能很简单,两人对下五子棋,程序自动回判断输赢.在ubuntu下搞得,没有装什么高端的输入 ...

  6. 简单的5*5,五子棋小游戏

    使用C语言简单的实现棋盘为5*5的五子棋小游戏,以下为源代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  7. php 设计五子棋游戏,基于js+canvas实现五子棋小游戏

    本文实例为大家分享了js+canvas实现五子棋小游戏的具体代码,供大家参考,具体内容如下 效果展示: 源码展示: 五子棋 * { margin: 0; padding: 0; } body { ma ...

  8. 基于 Blazor 开发五子棋小游戏

    今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...

  9. java 五子棋项目_Java项目如何实现五子棋小游戏

    Java项目如何实现五子棋小游戏 发布时间:2020-07-21 14:53:06 来源:亿速云 阅读:77 作者:小猪 小编这次要给大家分享的是Java项目如何实现五子棋小游戏,文章内容丰富,感兴趣 ...

最新文章

  1. 远程访问×××——Easy ×××
  2. linux中的查找文件夹
  3. 简明python教程 --C++程序员的视角(七):异常
  4. 深度学习的数学 (3)基础函数
  5. 工业交换机的端口号结构特征
  6. mysql开启布隆过滤器_海量数据去重之布隆过滤器
  7. 从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
  8. 2021巨量引擎母婴行业白皮书
  9. 鉴定5分钟,准确率95.64% | 微生物所付钰组实现了微生物单细胞水平的快速准确鉴定...
  10. WEB产品展示Bootstrap4模板
  11. PowerDesigner15使用时的十五个问题
  12. 这世上有个词叫Crush,有多少人误把它当做Love
  13. SpringBoot+Swagger2
  14. Spark中使用Dataset的groupBy/agg/join/broadcast hasjoin/sql broadcast hashjoin示例(java api)
  15. java jdk 文档下载_JDK8 API文档(下载)
  16. Android音频之多设备同时输出-cast通路分析
  17. 【PCAN医疗应用系列】CAN总线技术在实现实时荧光定量基因扩展(PCR)仪控制系统上的应用(2)
  18. STM32H7 at070tn92 LTDC SDRAM 调试笔记
  19. 记录学习Android基础的心得07:硬件控制P1
  20. 关于华硕飞行堡垒系列无法使用扇热小风扇的问题

热门文章

  1. 哪个PDF软件好用?这几款你们知道吗?
  2. 指数爆炸问题的基本思路
  3. 名键风流 十六款斐尔可顶级机械键盘赏
  4. 棋盘算法c语言程序,骑士走棋盘算法
  5. 为什么荒野行动服务器信息卡了,荒野行动画面卡顿的原因是什么?荒野行动画面卡顿的快速有效解决方法...
  6. 无状态,无连接的理解
  7. python turtle 绘制七段数码管以及14段数码管显示字母和时间
  8. 什么是纯虚函数?什么是抽象类?
  9. 中考计算机易错知识点,【中考备考】易错知识点归类
  10. linux脚本出错仍执行后续脚本,crontab执行脚本出错