学完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. matlab噪声倍频带声压级,近海风电场水下打桩噪声传播特性
  2. 使用Visual Studio工作流发布SharePoint网页
  3. 盘点一下全网最有趣的代码注释
  4. 总结:数组名和指针完全是两码事
  5. boost::core模块实现constexpr的地址
  6. Scala在挖财的应用实践
  7. OpenGL程序运行提示“glut32.dll丢失问题”
  8. 方程求解(洛谷P1689题题解,Java语言描述)
  9. 没有上司的舞会(洛谷-P1352)
  10. Linux(Ubuntu18.04)安装SEAL-python
  11. python中pop函数的用法_python中pop()函数怎么用
  12. css文字竖直显示_CSS属性设置 -- 盒子模型
  13. webrtc 研究-带宽控制
  14. “Defaulting to user installation because normal site-packages is not writeable“
  15. import 带{} 和不带的区别
  16. 「Adobe国际认证」关于Adobe Photoshop,创建和修改画笔教程?
  17. html5定义一个变量,JavaScript 变量
  18. 西南民族大学第十届校赛(同步赛)ABCEHJM题解
  19. 【实习之路】腾讯、小米日常实习生面试经历分享——小米篇
  20. 专访宜信CTO向江旭:技术应当服务于场景,AI天生适合金融业

热门文章

  1. 详述Android马甲包
  2. lly的瞬移方块(并查集)
  3. 使用poi操作word
  4. 没事别想不开去创业公司
  5. ARIMA时间序列分析——(一)数据平稳性检验
  6. MPEG PS流格式
  7. CSS3.0(过渡、动画、弹性盒、响应式)总结(2)
  8. pipeline流水线及分布式流水线发布php项目
  9. Android 广播接收不到短信问题,Android中短信的广播接收问题
  10. 自动控制理论开环与闭环思考(从飞行控制角度)