学完javase一段时间了,一直没有写过什么,前段时间关注的博主分享学习经验的时候,提到自己学生时期写过java联机五子棋,于是自己也想写一个(当然这次还没实现联机功能,后续可能会写2.0)

1.页面布局

页面布局大概如下,North方一个标签来回切换黑方下子和白方下子,Center是一个棋盘,South方是四个按钮(重新开始,退出游戏,认输,悔棋)

2.实现的功能

2.1棋子四个方向五子的判赢,悔棋,重新开始和认输

3.具体实现思路

1.首先画棋盘19*19,棋盘大小我设置的是600*600,竖线和横线的间隔temp就是600/18。2.画棋子,每词鼠标点击屏幕,就画一个棋子,画的是什么颜色的棋子呢?这就需要一个boolean 型的变量判断(true 黑子,false白子),怎么控制棋子的位置在横竖线的交叉位置呢? 那么就需要用到前面的间隔temp,如何控制鼠标点击棋子下在离点击位置最近的交叉位置呢?那么就需要利用%temp后的值和temp/2比较。3.悔期怎么实现呢?那么就需要保存每一步棋子在棋盘上的位置,之后回退。4.重新开始怎么实现?那么就需要把所有用到的变量置初始值

4.注意问题

4.1局部变量和全局变量的选择

因为我的五子棋棋盘写在JPanel 里面,但是我的按钮都是写在JFrame里,这就需要我把JPanel里面用到的变量写成全局变量

4.2思路不清

开始写的时候逻辑很不清楚,遇到不会的问题或思路不清的时候可以百度和看视频(这个五子棋就是看的B站视频) 我看到是这个:java实战开发项目_五子棋游戏 超级人工智能AI_哔哩哔哩_bilibili

5.总结

视频里面用的是绝对布局,个人不是很喜欢,于是按照自己的想法写了一下,当然看起来也不是很好看。。。 当然五子棋的功能也不是很完善,代码也有一些问题, 下次五子棋2.0再完善吧!!

最后赋上源代码:

package com.cn;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class GoBang extends JFrame implements ActionListener {/*        int width = this.getSize().width; //面板大小int height = this.getSize().height;//  棋盘大小int boardWidth = 720;int boardHeight = 720;// 左上角第一个点int xbase = (width - boardWidth) / 2;int ybase = (height - boardHeight) / 2;*/final int temp = 600 / 18;int width, height, boardWidth, boardHeight, xbase, ybase;/*** 这里进行一些棋子的判断** @param g*/int allChess[][] = new int[19][19];boolean isBlack = true;int x, y;//  这里进行画图时候圆的位置(1,2)在第一行第二列int countx = 0, county = 0; // 为了实现认输的位置int chessX[] = new int[255];//存储棋盘位置,方便回溯int chessY[] = new int[255];boolean canPlay = true; // 能不能继续玩// 三个面板分别放消息提示框,主面板,一些按钮public JPanel jpMessage = new JPanel();public JPanel jpMain;public JPanel jpButton = new JPanel();public JLabel jbMessage;JButton restart;JButton exit;JButton fail;JButton regret;public GoBang() {jpMain = new PaintBoard();this.add(jpMain, BorderLayout.CENTER);jbMessage = new JLabel("黑方下子");jpMessage.add(jbMessage);this.add(jpMessage, BorderLayout.NORTH);// 按钮区的绘制restart = new JButton("重新开始");restart.addActionListener(this);exit = new JButton("退出游戏");exit.addActionListener(this);fail = new JButton("认输");fail.addActionListener(this);regret = new JButton("悔棋");regret.addActionListener(this);jpButton.add(restart);jpButton.add(exit);jpButton.add(fail);jpButton.add(regret);this.add(jpButton, BorderLayout.SOUTH);this.setBounds(0, 0, 800, 800);this.setLocationRelativeTo(null);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String args[]) {GoBang go = new GoBang();}@Overridepublic void actionPerformed(ActionEvent e) {// 重新开始所有清零if (e.getSource() == restart) {for (int i = 0; i < 19; i++) {for (int j = 0; j < 19; j++) {allChess[i][j] = 0;}}this.repaint();isBlack = true;jbMessage.setText("黑方下子");for (int i = 0; i < 19; i++) {chessX[i] = chessY[i] = 0;}canPlay = true;}if (e.getSource() == exit) {System.exit(0);}if (e.getSource() == fail) {JOptionPane.showMessageDialog(this, (isBlack ? "黑子认输" : "白子认输") + ",游戏结束!");canPlay = false;}if (e.getSource() == regret) {if (canPlay) {int result = JOptionPane.showConfirmDialog(this, isBlack ? "白方悔棋,是否同意" : "黑方悔棋,是否同意");// 棋子回退一次,储存棋子横纵坐标的数组也回退,black也要回退if (result == 0) {allChess[chessX[--countx]][chessY[--county]] = 0;if (isBlack)isBlack = false;elseisBlack = true;this.repaint();}}}}// jPMain部分class PaintBoard extends JPanel implements MouseListener {public PaintBoard() {this.addMouseListener(this);}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);width = this.getSize().width; //面板大小height = this.getSize().height;//  棋盘大小boardWidth = 600;boardHeight = 600;// 左上角第一个点,为了让面板居中xbase = (width - boardWidth) / 2;ybase = (height - boardHeight) / 2;Graphics2D g2d = (Graphics2D) g;int x0, y0, x1, y1;//画线的时候用到的四个点this.setBackground(new Color(246, 186, 114));
//            this.addMouseListener(this);for (int i = 0; i <= 18; i++) {if (i == 0 || i == 18) {//调整画线的大小g2d.setStroke(new BasicStroke(3.0f));    //画棋盘边界时,线条加粗。setStroke()方法设置线条粗细,} else {g2d.setStroke(new BasicStroke(1.0f));}//开始确定每一个点的坐标,然后画行x0 = xbase;y0 = ybase + i * temp;x1 = xbase + 18 * temp;y1 = ybase + i * temp;g2d.drawLine(x0, y0, x1, y1);// 开始画列x0 = xbase + temp * i;y0 = ybase;x1 = xbase + temp * i;y1 = ybase + 18 * temp;g2d.drawLine(x0, y0, x1, y1);}int radius = 16;// 开始画黑心点圆和白心圆for (int i = 0; i < 19; i++) {for (int j = 0; j < 19; j++) {if (allChess[i][j] == 1) {g2d.setColor(Color.black);g2d.fillOval(i * temp + xbase - radius / 2, j * temp + ybase - 7, radius, radius);} else if (allChess[i][j] == 2) {g2d.setColor(Color.white);g2d.fillOval(i * temp + xbase - radius / 2, j * temp + ybase - 7, radius, radius);g2d.drawOval(i * temp + xbase - radius / 2, j * temp + ybase - 7, radius, radius);}}}}@Overridepublic void mouseClicked(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {if (canPlay) {x = e.getX();y = e.getY();//  判断鼠标点击位置if (x >= xbase & x <= (xbase + 18 * temp) & y >= ybase & y < (ybase + 18 * temp)) {// 判断是不是下在空的位置int tempX = (x - xbase) / temp, tempY = (y - ybase) / temp;// todo 这里是关键判断这点坐标的数组下标是什么if ((x - xbase) % temp > temp / 2) {x = tempX + 1;} elsex = tempX;if ((y - ybase) % temp > temp / 2)y = tempY + 1;elsey = tempY;// 先判断有没有棋子,处理没有棋子的情况if (allChess[x][y] != 0) {JOptionPane.showMessageDialog(this, "这里有棋子了");} else {chessX[countx++] = x;chessY[county++] = y;if (isBlack) {System.out.println(x + "," + y);allChess[x][y] = 1;isBlack = false;jbMessage.setText("白方下子");} else {System.out.println(x + "," + y);allChess[x][y] = 2;isBlack = true;jbMessage.setText("黑方下子");}this.repaint();if (isWin()) {JOptionPane.showMessageDialog(this, "You have won the game!");canPlay = false;}}}}}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}// 判断是不是赢了private boolean isWin() {int color = allChess[x][y];int count;
/*            while (color == allChess[x + i][y]) {count++;i++;}i = 1;while (color == allChess[x - i][y]) {count++;i++;}if (count >= 5) {return true;}// 这里进行纵向判断count = 1;i = 1;while (color == allChess[x][y - i]) {count++;i++;}i = 1;while (color == allChess[x][y + i]) {count++;i++;}if (count >= 5) {return true;}// 这里进行斜方向的判断count = 1;i = 1;while (color == allChess[x - i][y - i]) {count++;i++;}i = 1;while (color == allChess[x + i][y + i]) {count++;i++;}if (count >= 5) {return true;}// 这里进行斜方向的判断count = 1;i = 1;while (color == allChess[x + i][y - i]) {count++;i++;}i = 1;while (color == allChess[x - i][y + i]) {count++;i++;}if (count >= 5) {return true;}return false;*/count = this.Count(1, 0, color);if (count >= 5) {return true;} else {count = this.Count(0, 1, color);if (count >= 5) {return true;} else {count = this.Count(1, 1, color);if (count >= 5)return true;else {count = this.Count(1, -1, color);if (count >= 5)return true;}}}return false;}private int Count(int xChange, int yChange, int color) {int count = 1;int tempX = xChange, tempY = yChange;while (color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0)yChange++;elseyChange--;}}xChange = tempX;yChange = tempY;while (color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0)xChange++;if (yChange != 0) {if (yChange > 0)yChange++;elseyChange--;}}return count;}}
}

java实现简易五子棋相关推荐

  1. java五子棋难度设置_tiger(我) 用 java写简易五子棋游戏 上次没通过这次看看行不行...

    import java.io.*; import java.util.*; public class 五子棋游戏 { static  int m=1; static  int n=1; static ...

  2. 用java实现简易五子棋小游戏,双人+输赢判断

    游戏开始截图 游戏进行中截图 游戏结束截图 小游戏代码如下 public class Qi{public static void main(String[] args) {Scanner sc = n ...

  3. java 五子棋 简单_java实现简易五子棋游戏

    本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 编写一个简易五子棋,棋盘在控制台中绘制,棋盘每- - 个点都有对应的坐标,下棋者输 入对应坐标落棋子,运行效果如图所 ...

  4. Java 简易五子棋游戏的编写

    编写一个简易五子棋,棋盘在控制台中绘制,棋盘每- - 个点都有对应的坐标,下棋者输 入对应坐标落棋子,运行效果如图所示.两位数字表示的坐标中,第-一个数字表示横坐标, 第二个数字表示纵坐标,运行结果如 ...

  5. Java 简易五子棋

    使用Swing实现的简易五子棋,棋盘由225个JButton构成,棋子用⬦⬥两个符号代替. 点击空白格子落子,再次点击上一步落子的位置悔棋; 判断胜负逻辑:黑子为-1,白子为1,空白格为0,当一枚棋子 ...

  6. 用Java写一个简易五子棋游戏

    一. 程序基本思路: 1.写窗口.棋盘面板.控制面板: 2.绘制棋盘: 3.绘制棋子: 4.添加组件功能: 5.判断输赢: 6.悔棋: 7.复盘. 二.实际操作 1.创建窗口.添加面板 package ...

  7. C语言五子棋标记,C语言实现简易五子棋

    本文实例为大家分享了C语言实现简易五子棋的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include #include #include #d ...

  8. 简单计算器的设计java_(基于java的简易计算器的设计.doc

    (基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...

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

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

最新文章

  1. 【从零学习OpenCV 4】4种读取Mat类元素的的方法
  2. 清华唐杰教授:人工智能的下一个十年,认知推理是重点(附PPT下载)
  3. 帝国cms模板辅助编辑插件lsk_ecms.crx使用说明
  4. 《Adobe Photoshop CC经典教程(彩色版)》—第4课4.7节添加调整图层
  5. 产品功能上线前,如何高效的埋点?
  6. C语言 | 基于STM32的IIC代码实现(源代码)
  7. 轻松学MVC4.0–2 创建用户列表页面
  8. Linux 下查看某一个程序所使用的内存方法介绍
  9. java 捆绑_java – 如何在jar文件中捆绑图像
  10. kettle 内存设置_Kettle性能调优汇总
  11. python3写网络爬虫_python3写网络爬虫
  12. 腾讯微博正式关闭:目前无法登陆 用户可申请个人内容备份
  13. go 框架iris 响应记录器
  14. IDEA 2020 配置 Maven 创建 Spring Boot 项目
  15. pip学习20200810
  16. Excel提示:您的组织策略阻止我们为您完成此操作
  17. 机器翻译实战(英译汉)Transformer代码学习详解
  18. Gradle实践之自定义打包jar+Log开关自动关闭
  19. 做外贸用哪个企业邮箱比较好?大容量外贸企业邮箱哪家好?
  20. Adobe的视频和音频编码和格式转换软件Media Encoder(Me) 2023版本下载与安装教程

热门文章

  1. 一看就能上手的敏捷婚礼
  2. 压缩包文件解压找回密码
  3. 『贪心』阿狸和桃子的游戏
  4. ERROR: Cannot uninstall ‘PyYAML‘. It is a distutils installed project and thus we cannot...
  5. ubuntu更新过程中出现错误:校验数字签名时出错。此仓库未被更新,下列签名无效
  6. 关于电瓶车管理的思考
  7. [日常]mov文件转换为gif
  8. 2023年软考时间流程安排:
  9. mysql弱口令字典_自制弱口令字典top100
  10. html5在线裁剪,HTML5 本地裁剪图片并上传至服务器(老梗)