1、一些对象和静态常量的定义

//定义三个BufferedImage,分别代表棋盘图、黑子图、白子图private BufferedImage table;private BufferedImage black;private BufferedImage white;//定义一个BufferedImage,代表当鼠标移动时将要下子的选择框private BufferedImage selected;//定义棋盘的宽高,这里的定义尺寸和给定的board.jpg图片的尺寸一致因为棋盘背景是通过图片加载的private final int TABLE_WIDTH = 535;private final int TABLE_HEIGHT = 536;//定义棋盘中,每行和每列可下子的数目,这个数目跟给定的board.jpg中的数目是一致的,都为15private final int  BOARD_SIZE = 15;//定义每个棋子所占棋盘总宽度的大小比率;每个棋子所占宽度 535/15=35private final int RATE = TABLE_WIDTH/BOARD_SIZE;//定义棋盘有效区域与背景图坐标之间的偏移值,x坐标右移5个像素,y坐标下移6个像素private final int X_OFFSET = 5;private final int Y_OFFSET = 6;

2、定义一个二维数组用于记录棋子

该数组的索引与该棋子在棋盘上的坐标需要有一个对应关系:例如: 索引[2][3]处的棋子,对一个的真实绘制坐标应该是:xpos = 2*RATE+X_OFFSET=75;ypos = 3*RATE+Y_OFFSET=111;
private int[][] board = new int[BOARD_SIZE][BOARD_SIZE];//如果存储0,代表没有棋子,如果存储1,代表黑棋,如果存储2,代表白棋

3、定义五子棋游戏窗口

private JFrame f = new JFrame("五子棋游戏-Ace2NoU制作");

4、定义五子棋游戏棋盘对应的Canvas组件

private class ChessBoard extends JPanel{//重写paint方法,实现绘画@Overridepublic void paint(Graphics g) {//绘制五子棋棋盘g.drawImage(table,0,0,null);//绘制选中点的红框if (selectX>0 && selectY>0){g.drawImage(selected,selectX*RATE+X_OFFSET,selectY*RATE+Y_OFFSET,null);}//遍历数组,绘制棋子for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {//绘制黑棋if (board[i][j]==1){g.drawImage(black,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);}//绘制白棋if (board[i][j]==2){g.drawImage(white,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);}}}}}private ChessBoard chessBoard = new ChessBoard();

5、定义变量,记录当前选中的坐标点对应的boad数组中对应的棋子索引

    private int selectX = -1;private int selectY = -1;

6、定义一个变量,记录当前用户选择下的是白棋还是黑棋还是清除,清除:0,黑棋:1,白棋:2;默认黑棋先走

private int chessCategory = 1;

7、定义Panel,放置点击按钮

Panel p = new Panel();private Button whiteBtn = new Button("白棋");private Button blackBtn = new Button("黑棋");private Button clearBtn = new Button("删除");

8、按钮点击颜色更新

public void updateBtnColor(Color whiteBtnColor,Color blackBtnColor,Color clearBtnColor){whiteBtn.setBackground(whiteBtnColor);blackBtn.setBackground(blackBtnColor);clearBtn.setBackground(clearBtnColor);}

9、胜负判定方法

public boolean isWon(int x, int y, int color){int count = 1;int posX = 0;int posY = 0;/*先判断水平方向上的胜负将水平方向以传入的点x上的y轴作为分割线分为两部分先向左遍历,判断到的相同的连续的点 count++ */for(posX = x-1; posX > 0;posX--){if (board[posX][y] == color) {count++;if (count >= 5)return true;}else break;}for (posX = x +1; posX < BOARD_SIZE; posX++){if(board[posX][y] == color){count++;if(count>=5)return true;}  elsebreak;}count = 1;for(posY = y-1;posY>0;posY--){if(board[x][posY] == color){count++;if(count>=5)return true;}  elsebreak;}for(posY = y+1; posY<BOARD_SIZE; posY++){if(board[x][posY] == color){count++;if (count>=5)return true;} elsebreak;}count=1;for(posX = x-1, posY = y-1; posX>0&&posY>0; posX--,posY--){if (board[posX][posY] == color){count++;if(count>=5){//count = 1;return true;}} elsebreak;}for (posX = x+1, posY = y+1;posX<BOARD_SIZE&&posY<BOARD_SIZE; posX++, posY++){if (board[posX][posY] == color){count++;if(count>=5){//count = 1;return true;}}elsebreak;}count=1;for (posX = x+1, posY = y-1; posX<BOARD_SIZE&&posY>0; posX++,posY--){if (board[posX][posY] == color){count++;if(count>=5){//count = 1;return true;}}elsebreak;}for (posX = x-1, posY = y+1; posX>0&&posY<BOARD_SIZE; posX--,posY++){if (board[posX][posY] == color){count++;if(count>=5){//count = 1;return true;}}elsebreak;}return false;}

10、主要功能函数

public void init() throws Exception{//初始化按钮的颜色updateBtnColor(Color.LIGHT_GRAY,Color.GREEN,Color.LIGHT_GRAY);whiteBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {chessCategory = 2;updateBtnColor(Color.GREEN,Color.LIGHT_GRAY,Color.LIGHT_GRAY);}});blackBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {chessCategory=1;updateBtnColor(Color.LIGHT_GRAY,Color.GREEN,Color.LIGHT_GRAY);}});clearBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {chessCategory=0;updateBtnColor(Color.LIGHT_GRAY,Color.LIGHT_GRAY,Color.GREEN);}});p.add(whiteBtn);p.add(blackBtn);p.add(clearBtn);//把Panel放入到frame底部f.add(p,BorderLayout.SOUTH);//初始化黑棋,白棋,棋盘,选中框table = ImageIO.read(new File("board.jpg"));black = ImageIO.read(new File("black.gif"));white = ImageIO.read(new File("white.gif"));selected = ImageIO.read(new File("selected.gif"));//初始化board数组,默认情况下,所有位置处都没有棋子for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {board[i][j]=0;}}//设置chessBoard的最佳大小chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));//给chessBoard注册鼠标监听器chessBoard.addMouseListener(new MouseAdapter() {//鼠标单击会触发@Overridepublic void mouseClicked(MouseEvent e) {//将用户鼠标的坐标,转换成棋子的坐标int xPos = (e.getX()-X_OFFSET)/RATE;int yPos = (e.getY()-Y_OFFSET)/RATE;if(board[xPos][yPos]==0 && chessCategory!=0)board[xPos][yPos] = chessCategory;else if(chessCategory == 0)board[xPos][yPos] = chessCategory;//重绘chessBoardchessBoard.repaint();if(chessCategory!=0){if(isWon(xPos,yPos,chessCategory)) {if (chessCategory == 1)JOptionPane.showMessageDialog(null, "黑棋胜利", "结束",JOptionPane.WARNING_MESSAGE,new ImageIcon("win.png"));elseJOptionPane.showMessageDialog(null, "白棋胜利", "结束",JOptionPane.WARNING_MESSAGE, new ImageIcon("win.png"));for (int i = 0; i < BOARD_SIZE; i++)for (int j = 0; j < BOARD_SIZE; j++)board[i][j] = 0;chessBoard.repaint();}}}//当鼠标退出棋盘区域后,复位选中坐标,重绘chessBoard,要保证红色选中框显示正确@Overridepublic void mouseExited(MouseEvent e) {selectX=-1;selectY=-1;chessBoard.repaint();}});//给chessBoard注册鼠标移动监听器chessBoard.addMouseMotionListener(new MouseMotionAdapter() {//当鼠标移动时,修正selectX和selectY,重绘chessBoard,要保证红色选中框显示正确@Overridepublic void mouseMoved(MouseEvent e) {//将鼠标的坐标,转换成棋子的索引selectX = (e.getX()-X_OFFSET)/RATE;selectY = (e.getY()-Y_OFFSET)/RATE;chessBoard.repaint();}});//把chessBoard添加到Frame中f.add(chessBoard);f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});//设置frame最佳大小并可见f.pack();f.setVisible(true);}

11、主函数

public static void main(String[] args) throws Exception{new Gobang().init();}

Java图形界面编程练习——五子棋程序相关推荐

  1. Java图形编程实验总结_实验二java图形界面编程2015级.doc

    实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...

  2. Java图形界面编程模拟ATM自助取款系统

    本人学习Java时一直想做一个图形界面的程序,所以利用闲暇时间,做了一个Java图形界面编程模拟ATM自助取款系统,界面简洁漂亮,基本功能ATM功能实现. 程序初始时 考号:123456 密码:123 ...

  3. java图形界面多线程_多线程编程、Java I/O系统和Java图形界面编程

    多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同 ...

  4. Java图形界面编程

    一.Java图形用户界面(gui)介绍 1.Java GUI简介   图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加 ...

  5. java图形界面编程 房子_Java图形界面编程

    AWT简介 AWT是抽象窗口工具箱:其中包含了图形界面开发的基本类库. AWT主要包括:容器,布局管理器,事件处理,基本组件四个部分. 容器:用于放置基本组件 布局管理器:对容器中的组件进行布局管理 ...

  6. java图形界面编程视频,mysql数据库引擎面试

    拼多多三面惨败,java中间件.数据库与spring框架,答不上- 面试开火箭,工作拧螺丝-月初有个朋友面试拼多多,一面自信满满过了,结果三面却惨败-昨天朋友约我出来讨论问题在哪里,三面就答不上了(卡 ...

  7. java图形界面编程如何给窗口设置背景图片

    文章目录 前言 一.知识点介绍 二.代码实现 总结 前言 相信大家在GUI编程过程中,也就是开发窗口程序过程中,比如游戏界面等,难免会需要给窗口添加背景图片,接下来我将给大家详细讲解如何给窗口设置背景 ...

  8. Java图形界面编程--界面版猜数字游戏

    界面版猜数字游戏 package com.lddx.day0305;import java.awt.Color; import java.awt.event.ActionEvent; import j ...

  9. Kafka的生产者原理及重要参数说明,java图形界面编程视频

    ============================================================================ 此时生产者不着急把消息发送出去,而是先放到一个 ...

最新文章

  1. 专家访谈:为什么我们需要Erlang
  2. python3函数可变输入参量
  3. 人脸检测源码facedetection
  4. C++调用方式 入栈顺序
  5. python登录界面实现密码在明文与星号间切换_两个API让星号密码框显示成明文
  6. Java 初学记录之一 快速输入
  7. NET中的三种Timer的区别和用法
  8. 课时47:魔法方法:定制序列
  9. 计算机学院实验报告 课程名称 .NET程序设计 实验名称 实验四 CSS+DIV网页布局与样式
  10. 网络安全之特洛伊木马的攻防战略(转)
  11. AcrelEMS-EV汽车制造能效管理系统解决方案
  12. 监听Solidity合约事件
  13. 使用Java实现多个文件压缩打包
  14. 华为核心交换机绑定IP+MAC+端口案例
  15. KB、MB、GB等和KiB、MiB、GiB等的区别
  16. Margin对span无效
  17. 海南信用社计算机试题,2021年海南农村信用社计算机笔试内容17
  18. 【小样本基础】深度学习中的元学习:元学习的理解、经典MAML算法、用元学习解决具体问题的思路、元学习的分类
  19. Python 最强 IDE 详细使用指南!
  20. pywin32处理Excel

热门文章

  1. NIST SP 800-132基于口令的密钥生成函数PBKDF和主密钥保护数据的方法研究
  2. 常州百度大数据产业园 在沪签约引进一批企业
  3. win10系统访问我的电脑win10打开命令行
  4. 题解:::Contest1001 - 河南工程学院2022级新生周赛(一)
  5. python+vue 服装穿搭信息管理系统
  6. android Application
  7. 集体智慧编程 英文版
  8. weather中国气象网的天气城市编码获取地址
  9. Pytorch 中的 non_blocking
  10. 入门-《Zbrush 自学宝典》适合基础学员【软件精通】