五子棋程序

编程入门 行业动态 更新时间:2024-10-03 14:19:04

<a href=https://www.elefans.com/category/jswz/34/1709943.html style=五子棋程序"/>

五子棋程序

 

一、项目简介

功能描述五子棋小游戏程序,完成了基本的落子,输赢判断,认输和悔棋功能

参考git地址或博客地址applications/text/src/wzq at main · xzh222/applications (github)

 

个人负责任务:整个程序结构的构思,输赢判断实现,悔棋功能实现

善后以及修补bug

 

团队博客链接:

gchenLielong/article/details/118093570

二、功能流程图

三、个人任务简述

描述自己负责的模块、功能、完成了什么任务。

1. 完成的任务与功能

简单描述将自己完成的有特色的地方、重难点地方。

序号

完成功能与任务

描述

1

程序整体结构的构思

将程序结构分为JFrame容器搭建,棋盘棋子等的绘制,输赢悔棋等逻辑判断,鼠标监听器的操作

2

输赢判断

每下一颗子都进行一次是否有五子相连的判断(使用while循环迭代)

3

悔棋功能

数组记录下每颗棋的落子顺序,悔棋时将最近一次的棋子的信息从棋盘数组上删除

4

 

 

5

 

 

  • 本人负责功能详解
  1. 程序整体结构的构思

将程序结构分为JFrame容器搭建,棋盘棋子等的绘制,输赢悔棋等逻辑判断,鼠标监听器的操作,并做好了分工

  1. 输赢判断

每下一颗子都进行一次是否有五子相连的判断(使用while循环迭代)

一开始出现了一些小问题,判断的迭代数成负数后会导致循环崩溃,使棋盘边界的棋子无法判断胜负,加上限制范围的条件语句后bug修复

实在想不到更好的方法来更简洁的判断胜负。。

  1. 悔棋

数组记录下每颗棋的落子顺序,悔棋时将最近一次的棋子的信息从棋盘数组上删除

一开始想通过链表记下每颗棋子的顺序,发现多此一举

  1. 音乐播放

该功能所需要的sun.audio包找不到,若用wav格式音频播放,对于wav编码的理解又是一个大坑,索性放弃该功能

 

  • 课程设计感想

 第一次写出一个完整的java小程序,收获良多,心中的成就感也难以言表

  1. 写程序前对整体结构的构思非常重要,一开始毫无章法的乱写着实耗费了我很长时间
  2. 因为是多人合作,将功能分开实现,所以功能模块化十分重要

在这方面我们做的不是特别好

  1. bug总是在码代码的不经意间产生,再回头找bug时却不知从何下手,对程序的注释的作用在此刻体现出来。
  2. 多去测试,想尽办法刁难你的程序,有时候大体上看起来没有问题,实际上bug都藏在小角落。

六、展望

模块化这方面我做的不好,希望以后接触到更大的项目时能够发挥更好

这次的界面大部分都是由JFrame的画笔功能实现,实际上也通过往JFrame里添加各种容器组件的方式实现。

代码:

package wzq;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class game extends JFrame implements MouseListener,imformation {public static void main(String[] args) {game mj=new game();mj.myJFrame();}public static final Color Light_Brown = new Color(153,102,0);int x = 0, y = 0;//保存棋子坐标int jl = 0;//步数int[][] SaveGame = new int[16][16];//保存每个棋子int [] bsx = new int[260];//保存棋子坐标int [] bsy = new int[260];int qc = 1;//记录白棋=2,黑棋=1int qn = 0;//判断棋子是否重复boolean canplay = true;//判断游戏是否开始和结束String go = "黑子先行";//---------------------------------------------------------------------------------------------------------------------//窗体public void myJFrame() {setTitle("五子棋"); //标题setSize(cw, cy); //窗口大小setResizable(false); //窗口是否可以改变大小=否setDefaultCloseOperation(game.EXIT_ON_CLOSE);//窗口关闭方式为关闭窗口同时结束程序int width = Toolkit.getDefaultToolkit().getScreenSize().width;//获取屏幕宽度int height = Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕高度this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中this.addMouseListener(this);this.setVisible(true); //窗口是否显示=是}//---------------------------------------------------------------------------------------------------------------------//覆写paint方法,绘制界面public void paint(Graphics g) {//双缓冲技术防止屏幕闪烁BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);Graphics g2 = bi.createGraphics();//获取图片路径BufferedImage image = null;try {image = ImageIO.read(new File("src/wzq/1.png"));} catch (IOException e) {e.printStackTrace();}g2.drawImage(image, 70, 50, this);//显示图片g2.setColor(Color.BLACK);//设置画笔颜色g2.setFont(new Font("华文行楷", 10, 50));//设置字体g2.drawString("   五子棋", 530, 100);//绘制字符//棋盘g2.setColor(Light_Brown);//设置画笔颜色g2.fillRect(qx-20, qy-20, qw+40, qh+40);//绘制棋盘背景矩形//开始按钮g2.setColor(Color.WHITE);//设置画笔颜色g2.fillRect(bx, by, bw, bh);//绘制开始按钮g2.setFont(new Font("华文行楷", 10, 30));//设置字体g2.setColor(Color.black);//设置画笔颜色g2.drawString("开始", 615, 185);//绘制字符//悔棋按钮g2.setColor(Color.LIGHT_GRAY);//设置画笔颜色g2.fillRect(bx, by + 60, bw, bh);//绘制悔棋按钮g2.setFont(new Font("华文行楷", 10, 30));//设置字体g2.setColor(Color.WHITE);//设置画笔颜色g2.drawString("悔棋", 615, 245);//绘制字符//认输按钮g2.setColor(Color.GRAY);//设置画笔颜色g2.fillRect(bx, by + 120, bw, bh);//绘制认输按钮g2.setFont(new Font("华文行楷", 10, 30));//设置字体g2.setColor(Color.WHITE);//设置画笔颜色g2.drawString("认输", 615, 305);//绘制字符//游戏信息栏g2.setColor(Color.getHSBColor(30, (float) 0.10, (float) 0.90));//设置画笔颜色g2.fillRect(550, 350, 200, 150);//绘制游戏状态区域g2.setColor(Color.black);//设置画笔颜色g2.setFont(new Font("黑体", 10, 20));//设置字体g2.drawString("游戏信息", 610, 380);//绘制字符g2.drawString(go, 610, 410);//绘制字符g2.setColor(Color.BLACK);//设置画笔颜色//绘制棋盘格线for (int x = 0; x <= qw; x += 35) {g2.drawLine(qx, x + qy, qw + qx, x + qy);//绘制一条横线g2.drawLine(x + qx, qy, x + qx, qh + qy);//绘制一条竖线}//绘制标注点for (int i = 3; i <= 11; i += 4) {for (int y = 3; y <= 11; y += 4) {g2.fillOval(35 * i + qx - 3, 35 * y + qy - 3, 6, 6);//绘制实心圆}}//绘制棋子for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (SaveGame[i][j] == 1)//黑子{int sx = i * 35 + qx;int sy = j * 35 + qy;g2.setColor(Color.BLACK);g2.fillOval(sx - 13, sy - 13, 26, 26);//绘制实心圆}if (SaveGame[i][j] == 2)//白子{int sx = i * 35 + qx;int sy = j * 35 + qy;g2.setColor(Color.WHITE);g2.fillOval(sx - 13, sy - 13, 26, 26);//绘制实心圆g2.setColor(Color.BLACK);g2.drawOval(sx - 13, sy - 13, 26, 26);//绘制空心圆}}}g.drawImage(bi, 0, 0, this);}//---------------------------------------------------------------------------------------------------------------------//判断输赢private boolean WinLose() {boolean flag = false;//输赢int count = 1;//相连数int color = SaveGame[x][y];//记录棋子颜色//判断横向棋子是否相连int i = 1;//迭代数while (x+i>=0&&y>=0&&color == SaveGame[x + i][y]) {count++;i++;}i = 1;//迭代数while (x-i>=0&&y>=0&&color == SaveGame[x - i][y]) {count++;i++;}if (count >= 5) {flag = true;}//判断纵向棋子是否相连count = 1;i = 1;//迭代数while (x>=0&&y+i>=0&&color == SaveGame[x][y + i]) {count++;i++;}i = 1;//迭代数while (x>=0&&y-i>=0&&color == SaveGame[x][y - i]) {count++;i++;}if (count >= 5) {flag = true;}//判断斜向棋子是否相连(左上右下)count = 1;i = 1;//迭代数while (x-i>=0&&y-i>=0&&color == SaveGame[x - i][y - i]) {count++;i++;}i = 1;//迭代数while (x+i>=0&&y+i>=0&&color == SaveGame[x + i][y + i]) {count++;i++;}if (count >= 5) {flag = true;}//判断斜向棋子是否相连(左下右上)count = 1;i = 1;//迭代数while (x+i>=0&&y-i>=0&&color == SaveGame[x + i][y - i]) {count++;i++;}i = 1;//迭代数while (x-i>=0&&y+i>=0&&color == SaveGame[x - i][y + i]) {count++;i++;}if (count >= 5) {flag = true;}return flag;}//---------------------------------------------------------------------------------------------------------------------//初始化游戏public void Initialize() {//遍历并初始化数组for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {SaveGame[i][j] = 0;}}//黑子先行qc = 1;go = "轮到黑子";}//---------------------------------------------------------------------------------------------------------------------@Override//鼠标点击public void mouseClicked(MouseEvent e) {}@Override//鼠标按下public void mousePressed(MouseEvent e) {//获取鼠标点击位置x = e.getX();y = e.getY();//判断是否已开始游戏if (canplay == true) {//判断点击是否为棋盘内if (x > qx && x < qx + qw && y > qy && y < qy + qh) {//计算点击位置最近的点if ((x - qx) % 35 > 17) {x = (x - qx) / 35 + 1;} else {x = (x - qx) / 35;}if ((y - qy) % 35 > 17) {y = (y - qy) / 35 + 1;} else {y = (y - qy) / 35;}//判断当前位置有没有棋子if (SaveGame[x][y] == 0) {SaveGame[x][y] = qc;qn = 0;jl++;bsx[jl] = x;//记录点位bsy[jl] = y;} else {qn = 1;}//切换棋子if (qn == 0) {if (qc == 1) {qc = 2;go = "轮到白子";} else {qc = 1;go = "轮到黑子";}}this.repaint();//重新执行一次paint方法//弹出胜利对话框boolean wl = this.WinLose();if (wl) {JOptionPane.showMessageDialog(this, "游戏结束," + (SaveGame[x][y] == 1 ? "黑方赢了" : "白方赢了"));//弹出提示对话框canplay = false;}//            System.out.println(1);//测试} else {
//            System.out.println(0);//测试}}//实现开始按钮//判断是否点击开始按钮if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by && e.getY() < by + bh) {//判断游戏是否开始if (canplay == false) {//如果游戏结束,则开始游戏canplay = true;JOptionPane.showMessageDialog(this, "游戏开始");//初始化游戏Initialize();this.repaint();//重新执行一次paint方法} else {//如果游戏进行中,则重新开始JOptionPane.showMessageDialog(this, "重新开始");//初始化游戏Initialize();this.repaint();//重新执行一次paint方法}}//实现悔棋按钮//判断是否点击悔棋按钮if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 60 && e.getY() < by + 60 + bh) {//判断游戏是否开始if (canplay == true) {//遍历棋盘上是否有棋子int z = 0;for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (SaveGame[i][j] != 0) {z++;}}}//判断是否有棋子if (z != 0) {SaveGame[bsx[jl]][bsy[jl]] = 0;//实现悔棋jl--;//步数后退if(qc==1)qc = 2;elseqc = 1;this.repaint();} else {JOptionPane.showMessageDialog(this, "棋盘上已无棋子");}} else {JOptionPane.showMessageDialog(this, "请先开始游戏");}}//实现认输按钮//判断是否点击认输按钮if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 120 && e.getY() < by + 120 + bh) {//判断游戏是否开始if (canplay == true) {//判断是谁认输if (qc == 1) {JOptionPane.showMessageDialog(this, "黑方认输,白方获胜");canplay = false;} else if (qc == 2) {JOptionPane.showMessageDialog(this, "白方认输,黑方获胜");canplay = false;}} else {JOptionPane.showMessageDialog(this, "请先开始游戏");}}}

效果图:

 

更多推荐

五子棋程序

本文发布于:2024-02-28 13:22:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769950.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:五子   程序

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!