java五子棋小游戏实现代码
前言
之前学完java基础课程,试着简单做了一下java的一个五子棋小游戏,记录下来。
界面
由于直接用的java库中的一些基本控件写的一个GUI,并没有做过多优化,感觉比较丑
下面是界面展示:
文章图片
【java五子棋小游戏实现代码】黑子先行,但是我这边简化规则,并没有考虑黑子先行的一些禁手。
下面直接贴代码
接口类
我把五子棋界面的一些常量都定义在了这个接口类中,包括棋盘的起始坐标,棋盘线的间距和棋子半径
public interface constant {int[][] chessLocation = new int[15][15]; static final int x = 50; //左上角位置static final int y = 50; static final int LN = 15; //棋盘一些常量static final int R = 45; }
实现类
接口
这个类中继承了 constant、MouseListener、ActionListener三个接口
其中:
- constant为自己定义
- MouseListener为鼠标监听
- ActionListener为事件监听
show()绘制窗口基本框架
paint()绘制棋盘网格线和棋子
IsWin()判断输赢的基本逻辑
mouseClicked()获取鼠标位置,判断棋子落点等
actionPerformed()判断鼠标点击哪个按钮(开始游戏or认输or悔棋)执行相应操作
import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; public class game_logic extends JPanel implements constant, MouseListener, ActionListener {int chess_x = 0, chess_y = 0; int X = 0, Y = 0; boolean IsBlack = true; //判断黑白boolean flag = false; //是否已经开始游戏 //生成三个响应按钮JFrame frame = new JFrame(); JButton start = new JButton("开始游戏"); JButton regret = new JButton("悔棋"); JButton Lost = new JButton("认输"); public void ShowUI() {frame.setSize(740, 800); frame.setTitle("五子棋"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击关闭结束程序frame.setLocationRelativeTo(null); //窗口居中frame.setVisible(true); //窗体可视化frame.setResizable(false); //窗体大小不可调整frame.add(this); this.setBackground(Color.LIGHT_GRAY); //设置背景颜色this.addMouseListener(this); //窗体中添加鼠标监听器start.setSize(50, 80); //设置按钮大小start.addActionListener(this); //按钮添加事件监听器Lost.setSize(50, 80); Lost.addActionListener(this); regret.setSize(50, 80); regret.addActionListener(this); this.add(start); //添加按钮到棋盘上this.add(Lost); this.add(regret); }/*** 绘制方法* 绘制五子棋棋盘* @param g*/@Overridepublic void paint(Graphics g) {super.paint(g); for (int i = 0; i < LN; i++) {//画棋盘g.drawLine(x, y + i * R, x + (LN - 1) * R, y + i * R); //行*15g.drawLine(x + i * R, y, x + i * R, y + (LN - 1) * R); //列*15}for (int i = 0; i < LN; i++) {//画棋子for (int j = 0; j < LN; j++) {if (chessLocation[i][j] == 1) {g.setColor(Color.BLACK); //黑棋先行g.fillOval(50 + i * R - 23, 50 + j * R - 23, R, R); }if (chessLocation[i][j] == 2) {g.setColor(Color.WHITE); g.fillOval(50 + i * R - 23, 50 + j * R - 23, R, R); }repaint(); }}}/***判断输赢**/public int IsWin() {int k = 0; for (int f = 2; f < 12; f++) {for (int g = 2; g < 12; g++) {if (chessLocation[f][g] == 1) {if (chessLocation[f][g] == chessLocation[f - 1][g] && chessLocation[f - 1][g] == chessLocation[f - 2][g] && chessLocation[f - 2][g] == chessLocation[f + 1][g] && chessLocation[f + 1][g] == chessLocation[f + 2][g]) {k = 1; break; }if (chessLocation[f][g] == chessLocation[f][g - 1] && chessLocation[f][g - 1] == chessLocation[f][g - 2] && chessLocation[f][g - 2] == chessLocation[f][g + 1] && chessLocation[f][g + 1] == chessLocation[f][g + 2]) {k = 1; break; }if (chessLocation[f][g] == chessLocation[f - 1][g - 1] && chessLocation[f - 1][g - 1] == chessLocation[f - 2][g - 2] && chessLocation[f - 2][g - 2] == chessLocation[f + 1][g + 1] && chessLocation[f + 1][g + 1] == chessLocation[f + 2][g + 2]) {k = 1; break; }if (chessLocation[f][g] == chessLocation[f - 1][g + 1] && chessLocation[f - 1][g + 1] == chessLocation[f - 2][g + 2] && chessLocation[f - 2][g + 2] == chessLocation[f + 1][g - 1] && chessLocation[f + 1][g - 1] == chessLocation[f + 2][g - 2]) {k = 1; break; }}if (chessLocation[f][g] == 2) {if (chessLocation[f][g] == chessLocation[f - 1][g] && chessLocation[f - 1][g] == chessLocation[f - 2][g] && chessLocation[f - 2][g] == chessLocation[f + 1][g] && chessLocation[f + 1][g] == chessLocation[f + 2][g]) {k = 2; break; }if (chessLocation[f][g] == chessLocation[f][g - 1] && chessLocation[f][g - 1] == chessLocation[f][g - 2] && chessLocation[f][g - 2] == chessLocation[f][g + 1] && chessLocation[f][g + 1] == chessLocation[f][g + 2]) {k = 2; break; }if (chessLocation[f][g] == chessLocation[f - 1][g - 1] && chessLocation[f - 1][g - 1] == chessLocation[f - 2][g - 2] && chessLocation[f - 2][g - 2] == chessLocation[f + 1][g + 1] && chessLocation[f + 1][g + 1] == chessLocation[f + 2][g + 2]) {k = 2; break; }if (chessLocation[f][g] == chessLocation[f - 1][g + 1] && chessLocation[f - 1][g + 1] == chessLocation[f - 2][g + 2] && chessLocation[f - 2][g + 2] == chessLocation[f + 1][g - 1] && chessLocation[f + 1][g - 1] == chessLocation[f + 2][g - 2]) {k = 2; break; }}}}return k; }@Overridepublic void mouseClicked(MouseEvent e) {X = e.getX(); Y = e.getY(); //获取鼠标位置if (flag == true) {if (X >= 25 && X <= 705 && Y >= 25 && Y <= 705) {//比棋盘稍微大一点的落子判定范围,即棋盘边缘位置//应该安放的棋子的位置chess_x = (X - 20) / R; chess_y = (Y - 20) / R; if (chessLocation[chess_x][chess_y] == 0) {//存储棋子状态,转换棋子颜色if (IsBlack == true) {chessLocation[chess_x][chess_y] = 1; IsBlack = false; } else {chessLocation[chess_x][chess_y] = 2; IsBlack = true; }if (IsWin() == 1) {JOptionPane.showMessageDialog(this, "黑棋获胜"); flag = false; }if (IsWin() == 2) {JOptionPane.showMessageDialog(this, "白棋获胜"); flag = false; }repaint(); }}}}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void actionPerformed(ActionEvent e) {String buttonName = e.getActionCommand(); if (buttonName.equals("开始游戏") && flag == false) {//开始游戏,棋盘清空flag = true; for (int i = 0; i < LN; i++) {for (int j = 0; j < LN; j++) {chessLocation[i][j] = 0; }}IsBlack = true; repaint(); }if (buttonName.equals("认输") && flag == true) {flag = false; if (IsBlack) {JOptionPane.showMessageDialog(this, ",白棋认输,黑棋获胜"); } else {JOptionPane.showMessageDialog(this, ",黑棋认输,白棋获胜"); }}if (buttonName.equals("悔棋") && flag == true) {if (chessLocation[chess_x][chess_y] == 1) {JOptionPane.showMessageDialog(this, "黑方悔棋"); }if (chessLocation[chess_x][chess_y] == 2) {JOptionPane.showMessageDialog(this, "白方悔棋"); }chessLocation[chess_x][chess_y] = 0; IsBlack = !IsBlack; repaint(); }}}
其中比较有趣的是五子棋判赢方式,假设棋盘大小15*15,则我只需要判断正中间的13*13d的格子,向两边扩展,判断是否五子连珠。
具体说明代码里都有注释,不多赘述。
主函数类
public class Main_game {public static void main(String[] args) {game_logic start=new game_logic(); start.ShowUI(); }}
总结
实现了五子棋小游戏的基本功能,但是略感粗糙,细节不足。对于基本控件调用一学就会,做一个小的游戏demo这是对流程控制和操作逻辑的训练很有效的一种方式。之前看了别人的代码觉得简单,但是自己写的时候往往逻辑流程难以连续,思维混乱,有些过程只有自己写了才知道其中的坑。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机