五子棋程序设计报告_第1页
五子棋程序设计报告_第2页
五子棋程序设计报告_第3页
五子棋程序设计报告_第4页
五子棋程序设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

宜宾学院面向对象课程设计 学 院:_计算机与信息工程学院_ 班 级: 2014级6班 学生姓名: 郑亮 学 号: 设计地点(单位)_宜宾学院_设计题目:_双人五子棋_ 完成日期: 2015年 12月 5日 目录1 问题要求及任务描述31.1题目要求31.2 主要任务32 解决问题的主要思路和方法32.1 关键问题32.2 拟采用解决问题的方法及算法42.3主要算法和处理流程图以及类图等43 程序实现63.1 程序实现时应考虑的问题63.2 主要源代码及说明83.2.1 总体设计83.2.1 详细设计84 测试184.1 游戏测试结果及分析185 小结215.1本问题解决方法及程序实现小结215.2尚未解决的问题及下一步工作思路。235.3 心得与体会236 参考文献24双人五子棋游戏设计报告书1 问题要求及任务描述1.1题目要求双人五子棋游戏1.2 主要任务1独立设计、编制、调试出一款双人五子棋游戏,并单独完成其中一定量的函数模块。 2要求该游戏具有趣味性和可操作性,能够正常运行。其中用到Java语言中的各种语句、结构。(如其中需要注意全局变量和局部变量的申明,数组的使用等) 3双人五子棋要求能够进入可视化界面,二人对弈,当有五颗同色棋子相连时,判断出输赢等一系列游戏流程。2 解决问题的主要思路和方法2.1 关键问题1棋盘的绘制2棋子的绘制,必须落在棋盘的交叉点处3有棋子的地方不能重复落子4棋子的黑白交替5五子连珠的判断(即游戏输赢判断)2.2 拟采用解决问题的方法及算法1棋盘的绘制:可以用一层for 循环通过分别对X,Y 坐标设置相应的增量来绘制棋盘的横线和竖线。2绘制棋子:通过填充一个椭圆的方式来绘制棋子,棋子的落子位子:首先定义一个二维数组a,用二维数组的两个参数来对应一个交叉点的X,Y虚坐标,通过鼠标点击的位置所得坐标来整除棋盘格子的宽度。这样就得到了鼠标点击的位置的最近的一个交叉的位置。然后通过交叉点的位置信息,以交叉点为圆心来绘制相应的棋子。3有棋子的位置不能重复落子:可以给二维数组a付初值 为“0”,当 axy = 0 时表示无子可以落子,当axy ! = 0 时就不能落子。4棋子的黑白交替:可以定义一个布尔型变量 Order 当为真时就为 :黑子 Order 为假时就为 :白子。5五子连珠的判断:首先定义一个整形变量 color 来存放棋子的颜色。先对color进行赋值。横向的判断是定义count1 来记录棋子个数,当横向左右有相同颜色的棋子就让count1加上1,当count1 = 5 时五子连珠成功,结束游戏。其它纵向和斜向方法相同。2.3主要算法和处理流程图以及类图等类视图:算法处理流程图3 程序实现3.1 程序实现时应考虑的问题1. 根据所选题目,首先设计模块图2. 画出主程序和主要模块的流程图3.2 主要源代码及说明3.2.1 总体设计主要包括的类有两个个:Myframe, MyPanel 1、Myframe类: Myframe类是java版五子棋的主框架,程序的启动类。 其中包括游戏界面的创建、按钮的设置、相关的事件监听器设置、游戏的启动、实现重新游戏。 2、MyPanel类: MyPanel类主要实现的是棋盘的绘制、创建数组存放棋子的坐标、设置只能在棋盘内可以落子、实现判断黑白棋的输赢。3.2.1 详细设计1 .Myframe类变量定义:private MyPanel; /新建一个自定义的Jpanelpublic JButton btnReset; /创建新游戏按钮public JButton btnExit;/创建退出public JButton btnMin;/创建最小化按钮public JButton btnBfirst;/创建黑子先按钮public JButton btnWfirst;/创建白子先按钮按钮的监听器和按钮功能实现:/* * 创建新游戏按钮 */btnReset = new JButton(u65B0u6E38u620F);btnReset.setFont(f1);btnReset.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent arg0) myPanel.Reset(); /调用重置棋盘的函数myPanel.canPlay = true; /开始游戏myPanel.repeat = true;/解决重复点击设置颜色按钮repaint();/调用重绘函数);btnReset.setBounds(432, 351, 142, 58);myPanel.add(btnReset);btnReset.setUI(new MyButtonUI();btnReset.setBackground(new Color(250, 154, 81, 240);/* * 创建退出按钮 */btnExit = new JButton(u9000u51FA); btnExit.setFont(f2);btnExit.setBounds(506, 415, 68, 39);myPanel.add(btnExit);btnExit.setUI(new MyButtonUI(); btnExit.setBackground(new Color(250, 154, 81, 240);btnExit.addMouseListener(new MouseAdapter() /实现按钮单击退出的功能Overridepublic void mouseClicked(MouseEvent arg0) System.exit(0););/* * 创建最小化按钮 */btnMin = new JButton(u9690u85CF); btnMin.setFont(f2);btnMin.setBounds(432, 415, 68, 39);myPanel.add(btnMin);btnMin.setUI(new MyButtonUI();btnMin.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent e) /实现单击按钮窗口最小化的功能setExtendedState(JFrame.ICONIFIED););btnMin.setBackground(new Color(250, 154, 81, 240);/* * 黑子优先按钮 */btnBfirst = new JButton(u9ED1u5148);btnBfirst.setFont(f2);btnBfirst.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent arg0) if(myPanel.repeat)boolean b = true;myPanel.setOrder(b); /设置落子顺序的函数,真伪黑先,假为白myPanel.repeat = false;);btnBfirst.setUI(new MyButtonUI();btnBfirst.setBackground(new Color(250, 154, 81, 240);btnBfirst.setBounds(506, 50, 68, 39);myPanel.add(btnBfirst);/* * 白子优先按钮 */btnWfirst = new JButton(u767Du5148);btnWfirst.setFont(f2);btnWfirst.addMouseListener(new MouseAdapter() Overridepublic void mouseClicked(MouseEvent arg0) if(myPanel.repeat)boolean b = false;myPanel.setOrder(b); /设置落子顺序的函数,真伪黑先,假为白线。 myPanel.repeat = false;);btnWfirst.setUI(new MyButtonUI();btnWfirst.setBackground(new Color(250, 154, 81, 240);btnWfirst.setBounds(432, 50, 68, 39);myPanel.add(btnWfirst);1 .MyPanel类变量定义:private int ChessRadius = 14; /棋子半径private int GridNum = 20 ; /棋盘格子数private int GridWidth = 20; / 棋盘格子宽度public int x = 0;public int y = 0; / 棋子坐标public int a = new intGridNumGridNum;/ 保存下过的棋子位子,“0”表示无子,“1”表示黑子, “2”表示白子public boolean Order; / 真为黑方先,假为白方先public boolean repeat = false; /解决重复 点击设置颜色的按钮public String s; / 显示游戏顺序public boolean canPlay = false; /为真就开始游戏功能实现:public void setOrder(boolean Order) / 设置落子顺序this.Order = Order;public void Reset() / 重置棋盘for (int i = 0; i GridNum; i+) for (int j = 0; j = 35 & x = 60 & y = 440) x = (x - 30) / GridWidth;y = (y - 55) / GridWidth;if (axy = 0) if (Order = true) axy = 1;Order = false;s = 轮到白方;repaint(); else axy = 2;Order = true;s = 轮到黑方;repaint();/* * 关键问题中:判断五子相连算法的具体实现 */private boolean winOrLose() boolean flag = false;int color=3;if(axy= 1 |axy= 2 ) color = axy;/ 判断横向int count1 = 1;int i = 1;while (x + i = 0 & color = ax - iy) count1+;i+;if (count1 = 5) flag = true;/ 判断纵向int count2 = 1;int i2 = 1;while (y + i2 = 0 & color = axy - i2) count2+;i2+;if (count2 = 5) flag = true;/ 判断左上,右下int count3 = 1;int i3 = 1;while (x + i3 GridNum & y + i3 = 0 & y - i3 = 0 & color = ax - i3y - i3) count3+;i3+;if (count3 = 5) flag = true;/ 判断右上,左下int count4 = 1;int i4 = 1;while (x + i4 = 0 & color = ax + i4y - i4) count4+;i4+;i4 = 1;while (x - i4 = 0 & y + i4 = 5) flag = true;return flag;/* * 关键问题中:棋盘绘制的具体实现 */g2d.setColor(new Color(139, 90, 38);g2d.setStroke(new BasicStroke(1);for (int i = 0; i GridNum; i+) g2d.drawLine(35 + GridWidth * i, 60, 35 + GridWidth * i, 440); / 竖线g2d.drawLine(35, 60 + GridWidth * i, 415, 60 + GridWidth * i); / 横线/* * 关键问题中:棋盘绘制的具体实现 */g2d.setColor(Color.black); 设置画笔颜色for (int i = 0; i GridNum; i+) for (int j = 0; j GridNum; j+) if (aij = 1) / 黑子int x = i * GridWidth + 35;int y = j * GridWidth + 60;g2d.fillOval(x - 7, y - 7, ChessRadius, ChessRadius); /绘出棋子g2d.setColor(new Color(168, 13, 20);g2d.drawString(s, 460, 155); / 显示游戏顺序g2d.setColor(Color.black);if (aij = 2) / 白子g2d.setColor(new Color(168, 13, 20);g2d.drawString(s, 460, 155);g2d.setColor(Color.white);int _x = i * GridWidth + 35;int _y = j * GridWidth + 60;g2d.fillOval(_x - 7, _y - 7, ChessRadius, ChessRadius);g2d.setColor(Color.black);/* * 游戏结束显示游戏结果 */if (winOrLose() g2d.setColor(new Color(230,0,0);g2d.setFont(new Font(黑体, Font.BOLD, 30);g2d.drawString(axy = 1 ? 黑方 : 白方) + 获胜, 445, 240);g2d.setColor(Color.black);g2d.drawString(“游戏结束”,415,290);g2d.setFont(new Font(楷体, Font.BOLD, 25);canPlay = false;4 测试4.1 游戏测试结果及分析1.游戏先手测试:白子先:黑先:2.检验判断胜利:游戏程序能正常运行,并且游戏功能正常。5 小结5.1本问题解决方法及程序实现小结在游戏界面设计之初为了考虑游戏的美观性,采用了现在比较热门的扁平化设计所以去掉了JFrame中经典的框架界面。所以在Myframe类中的构造函数public Myframe()中的setUndecorated(true);这句代码就是去掉JFrame中的经典外边框。当然去掉界面的外边框就没有了退出和最小化的功能,为了实现这两个功能所以在游戏界面中加上了“隐藏”和“退出”这两个按钮。去点JFrame中的经典边框,也就没有了标题栏和拖动标题栏移动界面的功能了,可以看出上面的截图中有一条白色的标题栏。标题栏的主要实现方法如下:/* * 画出游戏窗口标题栏 */g2d.setColor(new Color(250,250,250); /设置标题栏的颜色为白色。g2d.setClip(0, 3, getWidth(), 30); / 设置标题栏的高度为30px。g2d.fillRoundRect(1, 3, getWidth() - 7, getHeight() - 1, 20, 20); / 填充一个矩形作为标题栏g2d.setClip(null);/* * 设置游戏标题 */g2d.setFont(new Font(黑体, Font.BOLD, 20);g2d.setColor(Color.DARK_GRAY);g2d.drawString(五子棋, 14, 25);然后拖动标题栏实现窗口移动的功能就在Myframe类中实现的源代码如下:myPanel.addMouseMotionListener(new MouseMotionAdapter() Overridepublic void mouseDragged(MouseEvent e) if (e.getY()=30) / 实现窗口拖动功能setLocation(jfx+(e.getXOnScreen()-mx), jfy+(e.getYOnScreen()-my); );myPanel.addMouseListener(new MouseAdapter() Overridepublic void mousePressed(MouseEvent e) mx = e.getXOnScreen();my = e.getYOnScreen();jfx = getX();jfy = getY(););myPanel.setBorder(new EmptyBorder(5, 5, 5, 5);setContentPane(myPanel);myPanel.setLayout(null);/*代码参考 “极客学院教学视频java教学视频自定义API视频教程”*/5.2尚未解决的问题及下一步工作思路。该游戏还缺少几个关键功能:悔棋,游戏计步器,游戏时间的限制。这几个功能未能实现。这些功能只有在学完时间类的操作后才能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论