已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件工程课程设计报告学号: 20111000915 姓名: 杨志耀 学院: 计算机 班级: 191112 选题: 五子棋 .目录.一、 需求分析.31.1 总体分析31.2 初始化.31.3 主循环控制模块.31.4 玩家下子.31.5 胜负判断.3二、 功能描述.42.1 功能模块图.42.2 功能说明.4三、 系统设计.53.1 流程图.53.2 流程图说明6四、 运行结果.64.1 游戏设置图64.2 游戏说明图74.3 认输.84.4 游戏结束图.10五、 体会与总结.11六、 源代码.12一、 需求分析1.1总体分析基于本游戏,首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个19*19的二维数组allchess1919(15*15是五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用0表示空位,1表示黑子,2表示白子,这张表也是今后分析的基础。1.2初始化首先,建立盘面数组allchess1919,然后初始化显示器、鼠标、键盘输入输出设备并在屏幕上画出棋盘。1.3主循环控制模块控制下棋顺序,当轮到某方下棋时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。1.4玩家下子当轮到玩家下时,您通过键盘或鼠标在棋盘上落子,程序会根据该点的位置,在allchess1919数组的相应的地方记录“1”或“2”,以表示该点是黑子或白子。1.5胜负判断无须多言,当一方的五个棋子横向、纵向或斜向连成一线,该方即获胜。二、 功能描述2.1 功能模块图交替循环双方下棋判断哪方获胜判断是否出错并提示判断棋盘是否已满五子棋游戏2.2功能说明该五子棋程序基本上实现了五子棋的游戏功能,有双方下棋的界面及最终判断结果的界面。同时该游戏采用二维坐标实现,明了易懂,方便玩家在游戏过程中的基本操作,使游戏更加简便。在细节方面,该系统提供实时存储功能,记录下棋时机来限制玩家用时过长。关于游戏源程序我也做了详尽注释,各功能模块功能分明,可移植性强。当然该系统也有许多不足之处,第一次进行独立的课程设计,也有许多细节方面要考虑,最大的不足就是没有实现人机互弈。三、 系统设计白棋位置是否超时提示有棋一方获胜是否超时判断是否有棋黑棋是否获胜白棋是否获胜白方棋子判断是否有棋黑方棋子提示有棋黑棋位置3.1流程图开始游戏 是 否是是否否否是是否是否3.2流程图说明本程序定义了各种操作函数,各种状态判断,思想明确,思路清晰。各种判断选择了不同路径,因此输出的结果也不一样。程序中“循环”的利用非常直接和清晰,双方交替下棋,因此循环往复,最终决出胜负。分析中,也考虑了很多种情况,针对各个情况均作出了相对措施和解决方案。程序采用循环进行双方交换下棋,并进行了多种判断。首先判断下棋方是否超时,若一方超时,则判定另一方获胜。若未超时,则继续进行。然后判断“黑”棋是否获胜,若“黑”棋获胜,则输出黑方获胜;否则“白”棋下子,再判断“白”棋是否获胜,若胜,输出白方获胜,若不是就转入超时判断,若没超时会继续“黑”棋子下子,若是就输出黑方获胜。如此循环往复四、 运行结果4.1 游戏设置图 4.2 游戏说明图4.3 认输4.4 游戏结束图五、 体会与总结对于这次的报告,体会很多,开始是看老师给的算法代码,有些地方实在看不懂就问了许多同学,后期写代码也花费了很多时间,对于细节考虑我做了很多,虽然有很多思路,但大多的问题不知到如何解决,所以一直感觉是不成功的,后来在几天努力之后终于做出了一些成果,虽然算法不是很成熟,但对比以前的效果明显了许多。在这次实践设计过程中,我懂得了如何将所学的理论知识运用到实际中去,使得所学的知识能够融会贯通。同时,在课程设计过程中,我懂得了许多知识,增加了我对软件工程的兴趣,今后一定努力的学习,在实践中增加自己的学习乐趣,让自己更加充实。六、 源代码package org.liky.game.frame;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JOptionPane;public class FiveChessFrame extends JFrame implements MouseListener, Runnable / 取得屏幕的宽度int width = Toolkit.getDefaultToolkit().getScreenSize().width;/ 取得屏幕的高度int height = Toolkit.getDefaultToolkit().getScreenSize().height;/ 背景图片BufferedImage bgImage = null;/ 保存棋子的坐标int x = 0;int y = 0;/ 保存之前下过的全部棋子的坐标/ 其中数据内容 0: 表示这个点并没有棋子, 1: 表示这个点是黑子, 2:表示这个点是白子int allChess = new int1919;/ 标识当前应该黑棋还是白棋下下一步boolean isBlack = true;/ 标识当前游戏是否可以继续boolean canPlay = true;/ 保存显示的提示信息String message = 黑方先行;/ 保存最多拥有多少时间(秒)int maxTime = 0;/ 做倒计时的线程类Thread t = new Thread(this);/ 保存黑方与白方的剩余时间int blackTime = 0;int whiteTime = 0;/ 保存双方剩余时间的显示信息String blackMessage = 无限制;String whiteMessage = 无限制;public FiveChessFrame() / 设置标题this.setTitle(五子棋);/ 设置窗体大小this.setSize(500, 500);/ 设置窗体出现位置this.setLocation(width - 500) / 2, (height - 500) / 2);/ 将窗体设置为大小不可改变this.setResizable(false);/ 将窗体的关闭方式设置为默认关闭后程序结束this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 为窗体加入监听器this.addMouseListener(this);/ 将窗体显示出来this.setVisible(true);t.start();t.suspend();String imagePath = ;try imagePath = System.getProperty(user.dir)+/bin/image/background.jpg ;bgImage = ImageIO.read(new File(imagePath.replaceAll(, /); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/ 刷新屏幕,防止开始游戏时出现无法显示的情况.this.repaint();public void paint(Graphics g) / 双缓冲技术防止屏幕闪烁BufferedImage bi = new BufferedImage(500, 500,BufferedImage.TYPE_INT_RGB);Graphics g2 = bi.createGraphics();g2.setColor(Color.BLACK);/ 绘制背景g2.drawImage(bgImage, 1, 20, this);/ 输出标题信息g2.setFont(new Font(黑体, Font.BOLD, 20);g2.drawString(游戏信息: + message, 130, 60);/ 输出时间信息g2.setFont(new Font(宋体, 0, 14);g2.drawString(黑方时间: + blackMessage, 30, 470);g2.drawString(白方时间: + whiteMessage, 260, 470);/ 绘制棋盘for (int i = 0; i 19; i+) g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);/ 标注点位g2.fillOval(68, 128, 4, 4);g2.fillOval(308, 128, 4, 4);g2.fillOval(308, 368, 4, 4);g2.fillOval(68, 368, 4, 4);g2.fillOval(308, 248, 4, 4);g2.fillOval(188, 128, 4, 4);g2.fillOval(68, 248, 4, 4);g2.fillOval(188, 368, 4, 4);g2.fillOval(188, 248, 4, 4);/* * /绘制棋子 x = (x - 10) / 20 * 20 + 10 ; y = (y - 70) / 20 * 20 + 70 ; * /黑子 g.fillOval(x - 7, y - 7, 14, 14); /白子 g.setColor(Color.WHITE) ; * g.fillOval(x - 7, y - 7, 14, 14); g.setColor(Color.BLACK) ; * g.drawOval(x - 7, y - 7, 14, 14); */ 绘制全部棋子for (int i = 0; i 19; i+) for (int j = 0; j = 10 & x = 70 & y = 400 & e.getX() = 70& e.getY() = 100) int result = JOptionPane.showConfirmDialog(this, 是否重新开始游戏?);if (result = 0) / 现在重新开始游戏/ 重新开始所要做的操作: 1)把棋盘清空,allChess这个数组中全部数据归0./ 2) 将 游戏信息: 的显示改回到开始位置/ 3) 将下一步下棋的改为黑方for (int i = 0; i 19; i+) for (int j = 0; j 0) blackMessage = maxTime / 3600 + :+ (maxTime / 60 - maxTime / 3600 * 60) + :+ (maxTime - maxTime / 60 * 60);whiteMessage = maxTime / 3600 + :+ (maxTime / 60 - maxTime / 3600 * 60) + :+ (maxTime - maxTime / 60 * 60);t.resume(); else blackMessage = 无限制;whiteMessage = 无限制;this.canPlay = true; this.repaint();/ 点击 游戏设置 按钮if (e.getX() = 400 & e.getX() = 120& e.getY() = 150) String input = JOptionPane.showInputDialog(请输入游戏的最大时间(单位:分钟),如果输入0,表示没有时间限制:);try maxTime = Integer.parseInt(input) * 60;if (maxTime 0) JOptionPane.showMessageDialog(this, 请输入正确信息,不允许输入负数!);if (maxTime = 0) int result = JOptionPane.showConfirmDialog(this,设置完成,是否重新开始游戏?);if (result = 0) for (int i = 0; i 19; i+) for (int j = 0; j 0) int result = JOptionPane.showConfirmDialog(this,设置完成,是否重新开始游戏?);if (result = 0) for (int i = 0; i 19; i+) for (int j = 0; j = 400 & e.getX() = 170& e.getY() = 400 & e.getX() = 270& e.getY() = 400 & e.getX() = 320& e.getY() = 400 & e.getX() = 370& e.getY() = 5) flag = true; / 纵向的判断 int i2 = 1 ; int count2 = 1 ; * while (color = allChessx + 0y + i2) count2+; i2+; i2 = 1; * while (color = allChessx - 0y - i2) count2+; i2+; if * (count2 = 5) flag = true ; / 斜方向的判断(右上 + 左下) int i3 = 1 ; int * count3 = 1 ; while (color = allChessx + i3y - i3) count3+; * i3+; i3 = 1; while (color = allChessx - i3y + i3) count3+; * i3+; if (count3 = 5) flag = true ; / 斜方向的判断(右下 + 左上) int i4 = * 1 ; int count4 = 1 ; while (color = allChessx + i4y + i4) * count4+; i4+; i4 = 1; while (color = allChessx - i4y - i4) * count4+; i4+; if (count4 = 5) flag = true ; */ 判断横向count = this.checkCount(1, 0, color);if (count = 5) flag = true; else / 判断纵向count = this.checkCount(0, 1, color);if (count = 5) flag = true; else / 判断右上、左下count = this.checkCount(1, -1, color);if (count = 5) flag = true; else / 判断右下、左上count = this.checkCount(1, 1, color);if (count = 5) flag = true;return flag;/ 判断棋子连接的数量private int checkCount(int xChange, int yChange, int color) int count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange = 0 & x + xChange = 0& y + yChange 0)yChange+;else yChange-;xChange = tempX;yChange = tempY;while (x - xChange = 0 & x - xChange = 0& y - yChange 0)yChange+;else yChange-;return count;public void run() / TODO Auto-generated method stub/ 判断是否有时间限制if (maxTi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混凝土质检员工作总结报告20篇
- 销售组长工作总结范文5篇
- 销售员工个人发言稿(素材下载8篇)
- 污泥处理处置中心工程项目可行性研究报告
- 离子膜烧碱技改工程可行性研究报告
- 青协个人工作计划5篇
- 高中班主任工作计划下学期5篇
- 老年糖尿病生活方式
- 主题公园绿化景观设计合同
- 影视后期制作合同模版
- 2023年营养师、营养指导员专业技能及理论知识考试题库(附含答案)
- 斜井敷设电缆措施
- 施工机械设备租赁实施方案
- 牙膏产品知识课件
- 液化气站人员劳动合同范本
- 第一章 教育政策学概述
- 常见土源性寄生虫演示文稿
- 全员育人导师制学生谈话记录
- 了解学前儿童科学领域核心经验
- 幼儿园师德师风考核表实用文档
- 2023年职业技能-外汇业务考试历年真题甄选版带答案-1
评论
0/150
提交评论