学完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. SESSION常见问题辑
  2. 遍历聚合对象中的元素——迭代器模式(二)
  3. xfce4开始菜单中的小老鼠图标不见了
  4. JMeter: org.apache.http.NoHttpResponseException
  5. 代码设计的基础原则_设计原则:良好设计的基础
  6. HDU 2896 病毒侵袭【AC自动机】
  7. 面向对象(匿名内部类重写多个方法调用)
  8. linux 提取日志字段,记一次Linux下提取MySQL日志关键字段
  9. java+selenium实现web多系统登录
  10. 外包软件开发时要避免的五个陷阱
  11. 2021 年百度之星·程序设计大赛 - 初赛二
  12. codeforces NCPC2015 GYM 100781A Adjoin the Networks 圖的直徑
  13. HTML制作搞笑照片,美图秀秀怎么制作搞笑的GIF表情 搞笑的GIF表情在怎么制作
  14. 125款浪漫七夕表白网站源码【建议收藏】HTML+CSS+JavaScript
  15. mybatis获取map中的key和value
  16. 【Wing Loss】《Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks》
  17. 离职、辞职、辞退、劳动纠纷应该怎么办?(附劳动法)
  18. There was a problem with the instance info replicator
  19. go环境搭建开发工具安装配置
  20. C++ API设计 - 读书笔记(XMind)

热门文章

  1. 【转】如何订机票最划算?
  2. html 字体兼容,设置兼容浏览器的中文字体
  3. 【慕伏白教程】Git的安装与基本使用
  4. java sencha_sencha编译出错
  5. 基于ESP32环境监测控制和预警(微信小程序)
  6. 活动现场大屏幕互动系统(微信墙)修复版完美PHP源码,带完整素材包和详细使用文档
  7. ios微信H5网页没有声音的解决方法
  8. 云栖大会开源重磅升级!PolarDB-X v2.2: 企业级和国产化适配
  9. 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据
  10. shell十三问(转)