参照书本写了一个很简单的五子棋程序

主要有如下功能:

1、初始化棋盘initBoard()

2、下棋play()

未完成的功能:

1、没有实现棋子AI

2、没有实现连机

3、UI可以继续优化

个人感觉五子棋只有在判断输赢的算法上稍微需要思考一下,别的地方都可以参考书本或者网络自己完成。

具体如下:

1、首先定义一些常量和变量

 // 定义一个二维数组来充当棋盘private static String[][] board;//五个棋子即赢private final int WIN_COUNT = 5;// 棋盘大小public static final int BOARD_SIZE = 15;//棋盘,黑棋,白棋和选择框图标BufferedImage table;BufferedImage black;BufferedImage white;BufferedImage selected;   //棋盘像素private final int TABLE_WIDTH = 535;private final int TABLE_HEIGHT = 536;//棋盘坐标的像素值和棋盘数组之间的比率private final int RATE = TABLE_WIDTH / BOARD_SIZE;//棋盘坐标的像素值和棋盘数组之间的偏移距离private final int X_OFFSET = 5;private final int Y_OFFSET = 6;  //游戏窗口JFrame f = new JFrame("五子棋");//棋盘对应的Canvas组件ChessBoard chessBoard = new ChessBoard();//当前选中点坐标private int selectedX = -1;private int selectedY = -1;

2、初始化棋盘

 public void initBoard() throws IOException {table = ImageIO.read(new File("image/board.jpg"));black = ImageIO.read(new File("image/black.gif"));white = ImageIO.read(new File("image/white.gif"));selected = ImageIO.read(new File("image/selected.gif"));// 初始化棋盘数组board = new String[BOARD_SIZE][BOARD_SIZE];// 把每个元素赋值为“十”for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {board[i][j] = "十";}}chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));f.add(chessBoard);f.pack();f.setVisible(true);}

3、下棋

public void play() {chessBoard.addMouseListener(new MouseAdapter() {@Override//用户点击事件转换成棋子坐标public void mouseClicked(MouseEvent e) {int xPos = (e.getX() - X_OFFSET) / RATE;int yPos = (e.getY() - Y_OFFSET) / RATE;if (board[xPos][yPos] != "●" && board[xPos][yPos] != "○") {board[xPos][yPos] = "●";}//电脑随机生成坐标,这里可以优化算法,做出AI,我自己写的比较简单,就用随机函数 实现了下。int[] computerPosArr = computerPlay();board[computerPosArr[0]][computerPosArr[1]] = "○";chessBoard.repaint();if (isWin(xPos, yPos, "●")) {//    System.out.println("black win");JOptionPane.showMessageDialog(null, "黑棋获得了胜利");}if (isWin(xPos, yPos, "○")) {//   System.out.println("black win");JOptionPane.showMessageDialog(null, "白棋获得了胜利");}}@Overridepublic void mouseExited(MouseEvent e) {selectedX = -1;selectedY = -1;// chessBoard.repaint();}});chessBoard.addMouseMotionListener(new MouseMotionAdapter() {@Override//当鼠标移动时候,改变选中点坐标public void mouseMoved(MouseEvent e) {selectedX = (e.getX() - X_OFFSET) / RATE;selectedY = (e.getY() - Y_OFFSET) / RATE;chessBoard.repaint();}});}

4、电脑的随机下棋

 public int[] computerPlay() {int posX = (int) (Math.random() * (BOARD_SIZE - 1));int posY = (int) (Math.random() * (BOARD_SIZE - 1));while (board[posX][posY] != "十") {posX = (int) (Math.random() * (BOARD_SIZE - 1));posY = (int) (Math.random() * (BOARD_SIZE - 1));}int[] result = { posX, posY };return result;}

5、判断输赢

 public boolean isWin(int posX, int posY, String ico) {// 直线起点的X坐标int startX = 0;// 直线起点Y坐标int startY = 0;// 直线结束pX坐标int endX = BOARD_SIZE - 1;// 直线结束Y坐标int endY = BOARD_SIZE - 1;// 同条直线上相邻棋子累积数int sameCount = 0;int temp = 0;// 计算起点的最小X坐标与Y坐标temp = posX - WIN_COUNT + 1;startX = temp < 0 ? 0 : temp;temp = posY - WIN_COUNT + 1;startY = temp < 0 ? 0 : temp;// 计算终点的最大X坐标与Y坐标temp = posX + WIN_COUNT - 1;endX = temp > BOARD_SIZE - 1 ? BOARD_SIZE - 1 : temp;temp = posY + WIN_COUNT - 1;endY = temp > BOARD_SIZE - 1 ? BOARD_SIZE - 1 : temp;// 从左到右方向计算相同相邻棋子的数目String[][] board = Gobang.getBoard();for (int i = startY; i < endY; i++) {if (board[posX][i] == ico && board[posX][i + 1] == ico) {sameCount++;} else if (sameCount != WIN_COUNT - 1) {sameCount = 0;}}if (sameCount == 0) {// 从上到下计算相同相邻棋子的数目for (int i = startX; i < endX; i++) {if (board[i][posY] == ico && board[i + 1][posY] == ico) {sameCount++;} else if (sameCount != WIN_COUNT - 1) {sameCount = 0;}}}if (sameCount == 0) {// 从左上到右下计算相同相邻棋子的数目int j = startY;for (int i = startX; i < endX; i++) {if (j < endY) {if (board[i][j] == ico && board[i + 1][j + 1] == ico) {sameCount++;} else if (sameCount != WIN_COUNT - 1) {sameCount = 0;}j++;}}}if (sameCount == 0) {// 从左上下到右上计算相同相邻棋子的数目int j = endY;for (int i = startX; i < endX; i++) {if (j > startY) {if (board[i][j] == ico && board[i + 1][j - 1] == ico) {sameCount++;} else if (sameCount != WIN_COUNT - 1) {sameCount = 0;}j--;}}}return sameCount >= WIN_COUNT - 1 ? true : false;}

6、画棋盘

 public class ChessBoard extends JPanel {@Overridepublic void paint(Graphics g) {g.drawImage(table, 0, 0, null);if (selectedX >= 0 && selectedY >= 0) {g.drawImage(selected, selectedX * RATE + X_OFFSET, selectedY* RATE + Y_OFFSET, null);for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {if (board[i][j].equals("●")) {g.drawImage(black, i * RATE + X_OFFSET, j * RATE+ Y_OFFSET, null);}if (board[i][j].equals("○")) {g.drawImage(white, i * RATE + X_OFFSET, j * RATE+ Y_OFFSET, null);}}}}}}

7、主函数main

 public static void main(String args[]) throws IOException{Gobang    gobang=new Gobang();gobang.initBoard();gobang.play();                      }

一个简单的JAVA五子棋相关推荐

  1. 做一个简单的java小游戏--单机版五子棋

    做一个简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的 ...

  2. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  3. Intellij Idea创建一个简单的java项目

    2016年11月12日 我即将要离开象牙塔(校园),踏入社会,想想未来我是某个公司的一个程序员,再对比一下小时的梦想,好像出入挺大的.今天我不得不为即将的工作准备,一个java开发工程师,但是我现在是 ...

  4. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  5. 一个简单的Java计时器项目,附源码

    学Java开发的小伙伴都会想着做一些项目来检验自己的学习成果,今天小千就来分享一个简单的Java计时器项目,源码也放在文中,大家可以参考一下. Java计时器项目 开发环境:win8+eclipse+ ...

  6. idea建立一个java工程_IntelliJ IDEA(三、各种工程的创建 -- 之一 -- 创建一个简单的Java工程)...

    一.创建一个简单的Java工程:HelloWorld 1. Eclipse的第一步是选择工作空间,然后创建项目: IDEA不同(没有工作空间的概念),第一步就直接创建具体的项目,项目创建过程中会选择在 ...

  7. Ant—使用Ant构建一个简单的Java工程(两)

    博客<Ant-使用Ant构建一个简单的Java项目(一)>演示了使用Ant工具构建简单的Java项目,接着这个样例来进一步学习Ant: 上面样例须要运行多条ant命令才干运行Test类中的 ...

  8. Java制作一个盒子程序_编写一个简单的Java程序,模拟计算器的功能。

    提问:编写一个简单的Java程序,模拟计算器的功能. 网友回答: 程序参考: import java.awt.*; import java.awt.event.ActionEvent; import ...

  9. 一个简单的Java EEDocker示例

    本文讲的是一个简单的Java EE&Docker示例,[编者的话]学习Docker的最好办法就是迅速在工作中应用它,本文作者使用Docker部署了一个Java EE应用,非常简单和方便.需要注 ...

最新文章

  1. vs显示不是有效的window32_玩转“黑科技”,这才是选购“户外显示屏”的正确方式!...
  2. linux centos7 升级gcc版本 使用 yum centos-release-scl devtoolset-8-gcc* 非源码编译
  3. Centos6.5集群安装64位hadoop2.2.0
  4. Hadoop hdfs配置
  5. 一些建议:给当年刚做程序员的我
  6. 直播系统中使用SEI传输用户自定义数据方案讨论
  7. 【Docker】elasticsearch 监控工具 elasticsearch-HQ Unable to create connection to: http://localhost:9200
  8. 《常见问题集》Maven
  9. 笑脸哭脸循环c语言,买卖信号(哭脸笑脸)选股公式(源码)
  10. linux下tar压缩使用
  11. Linux 系统服务之间 实现免密登陆
  12. 奇怪的加拿大:一方面大力禁烟,另一方面放松大麻
  13. 独家深访陈光明:对内经营人才,对外经营信任
  14. 打架打出来的牛逼城市!
  15. 两个向量的夹角公式_两向量夹角(求两个向量的夹角公式)
  16. [TYVJ1143]飘飘乎居士的约会
  17. s5p4418挂载nfs文件系统
  18. app三种工具的元素定位与swipe 滑动
  19. iOS使用wifi传输文件到iPhone
  20. 对现有计算机应用的建议,对计算机课程的建议

热门文章

  1. 小米路由器PC客户端无法打开路由器…
  2. 4G DTU的特点及应用方法
  3. 电子政务网络智慧运维方案
  4. c#、java、钉钉、微信小程序、APP采集modbus TCP协义的PLC数据
  5. 小傻蛋的妹妹跟随小甲鱼学习Python的第二十三、二十四节023、024
  6. android编译集成dialer应用,Comet Android Dialer
  7. linux的nfs端口111,【NFS】NFS设置固定端口,添加防火墙规则
  8. Task02:baseline学习及改进
  9. 太原理工大学系统分析与设计实验报告实验室设备_警钟长鸣!盘点国内高校实验室事故...
  10. 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (二)——repeater-console 使用