五子棋游戏java课设含可运行程序.doc_第1页
五子棋游戏java课设含可运行程序.doc_第2页
五子棋游戏java课设含可运行程序.doc_第3页
五子棋游戏java课设含可运行程序.doc_第4页
五子棋游戏java课设含可运行程序.doc_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

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

文档简介

课程设计说明书 NO.28五子棋游戏1.课程设计目的Java语言是当今最为流行的程序语言之一,它具有面向对象,与平台无关,分布式应用,安全,稳定和多线程等优良特点。所以通过此次课程设计,不仅巩固所学Java语言基本知识,重点掌握Java的图形界面的设计,增进Java语言编辑基本功,还要掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用,和一些像绘图辅助工具的使用。把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为以后的工作打下坚实的基础。本课程设计设计GUI界面的五子棋游戏,该软件不仅仅简单的把五子棋的各种算法实现还对各种问题设置选择方式,使该程序更具有人性化,可以方便的保存,保存上一期没有完成的游戏对弈,打开时会有提示界面。总之,程序的设计充分体现优良的界面和简单操作。2.设计方案论证2.1设计思路2.1.1 棋盘和棋子布局现代五子棋棋盘,经过国际棋联的多次修改,最终定为15 X 15路,即棋盘由横竖各15条平行线交叉组成,共有225个交叉点;棋盘上共有五个星位,中间的星位称为天元,周围四点为小星。五子棋的棋子和围棋相同,分黑白2种颜色,通常为散圆形,有一面凸起或二面凸起等形状,一副棋子总数为225枚,其中黑子113枚,白子112枚。关于计时,正规比赛按不同级别设置了不同的时间限制,一般的玩家都没有这个限制。2.1.2 规则和解释(1)黑棋先行,白棋随后。从天元开始相互顺序落子。(2)最先在棋盘的横向、竖向、斜向形成连续的相同色五个棋子的一方为胜利。(3)黑棋主动判负、白棋也是这样。(4)如分不出胜负,则定位平局。(5)对局中拔子、中途退场均判为负(6)五连与禁手同时形成,先五为胜。(7)黑方禁手形成时,白方应立即指出。若白方未发现或发现后不立即指正,反而继续落子,则不能判黑方负。 五子棋是由两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由执黑棋的一方将一枚棋子的落在“天元”上,然后由执白棋的一方在黑棋周围的交叉点上落子。如此轮流落子直到某一方首先在棋盘的直线 横线或斜线上形成连续的五子或五子以上,则该方就算获胜。2.1.3 程序结构说明开始游戏初始化主循环控制模块玩家双方相互下子胜负判断退出胜利否则继续退出图1 五子棋程序流程图2.2设计方法 本程序是Java Application,要实现五子棋双人对弈,程序包含3个独立的类文件分别是FiveChessFrame.java、MyChessFrame.java、Test.java。其中FiveChessFrame.java主要负责棋盘的初始化,定义了面板上的其他元素,以及判断胜负条件等主题框架结构。MyChessFrame.java则是响应鼠标事件的处理和监听。也包括了事件处理和人工智能。Test.java则负责调用各个类,保存玩家的信息,完成整体的实现。2.2.1 Test.java 主类 Test类是主程序类 有main函数 该类主要是设计提示窗口,完成在运行时的操作,主要有游戏开始、游戏结束、重新选择等信息,很好的友好界面设计。它们的主要实现是通过Swing的JOptionPane.showMessageDialog()函数简单实现。或者调用主函数FiveChessFrame。2.2.2 FiveChessFrame整个架构的核心部分,类名为FiveChessFrame。封装了棋盘的各种可能用到的功能,如保存棋盘数据、初始化、判断胜负等。用户操作主界面,主界面与FiveChessFrame进行交互来完成对游戏的操作。2.2.3 棋盘及棋盘类 调用Swing中的JFrame类的paint()函数,用paint()实现窗体的设计尤其是棋盘的绘制。这里主要是19行19列,每行和列添加20个像素,并且为棋盘添加了五个驻点,使棋盘看起来清楚明了。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)2.2.4 棋子及棋子类确定下子的坐标(xp,yp)画特定大小的椭圆,这里的坐标指棋子相对棋盘的绝对坐标。该棋子的判定的界限不能超过棋盘的界限。for (int i = 0; i 19; i+) for (int j = 0; j 0) while (true) if (isBlack) blackTime-;if (blackTime = 0) JOptionPane.showMessageDialog(this, 黑方超时,游戏结束!); else whiteTime-;if (whiteTime = 0) JOptionPane.showMessageDialog(this, 白方超时,游戏结束!);blackMessage = blackTime / 3600 + :+ (blackTime / 60 - blackTime / 3600 * 60) + :+ (blackTime - blackTime / 60 * 60);whiteMessage = whiteTime / 3600 + :+ (whiteTime / 60 - whiteTime / 3600 * 60) + :+ (whiteTime - whiteTime / 60 * 60);this.repaint();try Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();System.out.println(blackTime + - + whiteTime);2.2.6 胜负判断条件要判断四个方向,横向、竖向、以及2个斜向。思想还是比较简单,相同颜色连成五子即胜利,完整的判断胜负条件包括连五和活四,活四还要检查两边的棋子,虽然运算量不大,但五子棋的标准就是连五即胜,一步之差,我们既要遵守规则,也要简化代码实现尽完整的功能。判定胜负的是用私有成员函数boolean checkWin(),其设定一个判定的旗帜Flag而且初始化时设定False,事先要建立一个盘面数组allChessxy,即棋型表。在对八个方向的棋子进行总结,得出看谁胜利。判定的几个方向的方法是: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;判断胜负的玩家相互游戏,判断胜负是是要有提示。如果有一方获胜,弹出提示框,如果确认则清空棋盘继续新游戏。实现的函数是 JOptionPane.showMessageDialog(null,You Win The Game,Congratulations,JOptionPane.INFORMATION_MESSAGE);需要注意的一点是落下的棋子如果离任何一方的边界小于4,则以边界为限制判断是否有一方获胜,这样的话也要考虑多种方向,但原理还是和基本情况是一样的。3.设计结果与分析本程序是图形界面的设计,所以需要有一个添加在对话框上的图形,该图的大小事500x500的而且图形界面初始化时是居中实现的。用Eclipse图形设计如图2所示: 图2 界面修剪图 游戏开始后,如果我们不会相关的操作,可以单击说明,来进入网站观看说明部分,而且在本游戏中师通过对话框的形式给出的。另外关于该游戏的开发者是谁,制作网站在哪儿或者下载地址是哪儿的,可以通过关于按钮来了解详细信息。本游戏设置显示出的分别是:如图3和如图4图3 游戏说明图图4 游戏关于图 运行游戏后,正式的对战可以有时间设定,点击设置游戏时间,出现对话框这时你可以输入你想要设定的时间,该时间是按分钟设置的,会出现如图3所示:图3 游戏设置图上一步设置完,单击“确定”设置结束后一般会提示你是否重新开始游戏或者说设置完成,如果单击是这时程序就会重新设置,这时游戏下方会出现刚开始设置的时间,通过这个确定游戏双方的使用时间,这样就会增加对弈双方的紧迫感。使游戏更具紧张气氛。如图4所示:图4 游戏设置确定图 当点击确定后,双方就可以进行对战了,当轮到一方时,该方的设定时间就会走动,而另一方就会停止。如图5所示:图5 游戏对战图 如果这场游戏时间超时,或者一方中途认输的,就可以提示出单击认输的按钮,这样就可以结束游戏啦!如图6所示:图6 认输图 结束游戏,如果双方的对战时,临时退出的话,可以单击退出。或者当我们对战结束,判定的胜负,都可以单击退出。如图7所示图7 游戏结束图4.设计体会通过编写这个程序,我体会最为深刻的一点是五子棋游戏的整体结构的设计和Java程序流程设计模式的重要性。即使是对于这一个并不大的程序,代码的组织都觉得变得非常重要,因为这关系到日后的运行维护以及扩展。这个游戏之中,有关程序的实现以及对五子棋界面的设计有大量的方法,而且大都都相似,但是对于整个程序的架构,却只有亲身去实践后才可以知道各个模块是怎样衔接和联系的。几千上万行的代码需要通过合适的方法组织起来,使编写代码更加有条理,更加符合软件工程的标准,这才是最重要的。在刚开始编写这个程序的时候,我幼稚地认为其中最重要的是里面的各种算法还有图形界面的设计。但是编写了这个程序而且在试运行的时候却发现程序越写越不容易维护,而且最难原来不是程序的算法的写出,整个程序的实现的流程写出了才是打开程序的钥匙,所以我有点渐渐的偏离了方向。后来我在网上搜索一下,原来前人早已为我们准备好了各种精良可用的现成算法,而且算法的设计都很精良,我们只是拿来用就可以了,但是对于代码的组织(也就是软件的架构)才是真正软件实现的一大要点,因此我们必须在编写代码之前选择一种最为合适的方法来组织这些代码,否则我们将会失去更多的提高自己的机会。于是,我将以前写的代码进行了彻底的修改,学习了前人写的优良算法,也总结的整体设计思想。渐渐让自己明白了很多程序设计的东西。更多的明白用Java设计软件的便利性和安全性等优势。在这次设计最明白的要数对程序的GUI的设计了。这都是在老师的教导下才有能力设计并真正的实现的。所以在此感谢老师的教导。5.参考文献1李芝兴,杨瑞龙Java程序设计之网络编程M北京:清华大学出版社;2007.6:179-2112印旻Java语言与面向对象程序设计M北京:清华大学出版社;2009.11:128-1393张思民,梁维娜Java程序设计实践教程M北京:清华大学出版社;2006.8:1-214朱站立、沈伟 JAVA2程序设计实用教程M北京:电子工业出版社;2008.4.:62-765郭国军五子棋的核心算法M陕西:西安电子科技大学出版社;2008.4.:612-7066. 附录:1.FiveChessFrame类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();/ 刷新屏幕,防止开始游戏时出现无法显示的情况.this.repaint();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();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 (maxTime 0) while (true) if (isBlack) blackTime-;if (blackTime = 0) JOptionPane.show

温馨提示

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

评论

0/150

提交评论