《JAVA程序设计》实训报告实训题目: 五子棋游戏制作专业:计算机网络班级:14网络(1)班姓名:指导教师:2015 年12 月31日目录1.实训目的 (3)2.实训题目描述和要求 (4)2.1 实训题目描述 (4)2.2 实训题目要求 (4)3.实训报告内容 (5)3.1 需求分析 (5)3.2 概要设计 (5)3.3 详细设计 (6)3.4 编码 (7)3.5 测试 (19)4.总结 (24)实训指导教师评语 (26)1.实训目的随着经济社会的迅速发展,人们生活水平有了很大的提高,人们的生活观念也发生了巨大的改变。
高品质的生活、现代化得生活方式成为人们共同追求的目标;休闲、娱乐性活动作为时尚生活中的一部分,而被大多数的人所追捧。
棋类项目作为一种智力型项目,可以益智健心、修身养性,也可以满足人们对于娱乐和休闲的新需求。
一些项目比如五子棋等等,由于项目本身互动的特点,一直被人们所喜爱,因此得以生存和发展,成为许多人喜爱的休闲娱乐性棋类项目。
而今,以网络技术为核心和计算机技术的现代网络技术已经在现实生活得到了十分的广泛的使用。
休闲类网络游戏集合了益智性、趣味性、互动性、娱乐性于一体,已经成为多数人群的选择的休闲方式。
《Java程序设计》课程实训,学生可以将理论知识与具体实践相结合,巩固对JAVA相关方法和概念的理解,通过实训单机版五子棋游戏的编程,加深对所学知识的理解和应用。
如: 通过实训能够结合实例进一步理解面向对象程序设计的基本概念,掌握程序设计的基本方法和技巧,灵活的使用包,进一步的理解接口,熟练的掌握在接口中对事件的实现。
深入理解和灵活运用面向对象程序设计的基本特性,培养良好的程序设计风格,提高抽象思维、逻辑思维的能力。
并且让学生能够基本使用实训软件eclipse,以及安装JDK和环境变量的配置。
通过本次实训,可以开拓思维,增强编程思想,为深入学习JAVA打下良好基础,在学完此门课程后,能使用Java开发小型应用程序。
2.实训题目描述和要求2.1 实训题目描述实训题目:JAVA五子棋单机版游戏制作。
描述:五子棋在我国的历史可谓是源远流长,喜爱它的玩家也是大有人在,是很多人的娱乐首选,也是一种竞技项目。
但很多的五子棋软件一般都是单机版的,游戏无法在两个玩家之间进行。
基于上述原因,五子棋作为一个古老而又有广泛群众基础的游戏,他的完善性无疑是家玩家有很大的影响,在互联网迅速发展的今天,五子棋的流行已经不仅仅只是在现实生活中的面对面的娱乐竞技,在网上也已经是广大玩家的首选娱乐游戏已在各个游戏平台有应用。
通过JAVA的swing组件,实现五子棋简单的双人对弈并通过内部条件判断实现输赢的双方下棋过程。
2.2 实训题目要求1. 运用JAVA程序设计和Eclipse软件设计出一个五子棋程序。
2. 五子棋游戏的主窗口也就是游戏界面的实现(尽量制作一个界面美观的游戏界面)3. 棋子黑白色的设置及判定。
4. 完成判断某一横行是否连成五子及所有方向是否连成五子的判断。
5. 几个简单按钮的实现,“开始游戏”,“游戏设置”,“游戏说明”,“关于”,“认输”,“退出”。
6. 能够完成基本的下棋功能并能判断输赢7. 能够实现开始游戏的功能,随时重新开始一盘游戏。
8. 能够实现游戏设置的功能,可以对游戏玩家有时间的设定,且要求时间不能为负数,如果时间为0则无限制,9. 能够实现游戏说明的功能,可以解释游戏的基本规则。
10. 能够实现游戏认输的功能,当有一方认输时,游戏结束。
11. 能够实现游戏关于的功能,关于游戏的制作及问题解决指南。
12. 能够实现游戏退出的功能,当游戏结束时游戏退出。
13. 完成当某一方下棋是游戏界面会有游戏信息提示。
14. 完成游戏时间设置游戏界面下方会有时间走时功能。
3.实训报告内容3.1 需求分析一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是游戏制作人需要面对的问题。
作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考虑到玩家在游戏时的舒适性本次实训要求制作的是一个简单的单机版五子棋游戏,所以只需要完成一些最基本的功能即可,例如游戏开始功能、游戏设置功能、游戏认输功能以及游戏退出功能等。
3.2 概要设计制作的五子棋游戏整体界面设计为500*500像素大小,其中棋盘大小为360*360像素大小。
游戏界面上能够显示相关游戏信息,例如当前游戏玩家信息、游戏剩余时间、游戏输赢信息等。
3.3 详细设计整个游戏界面的上方显示当前游戏玩家信息,能够提醒黑白双方下棋。
中间靠左显示游戏棋盘,由纵横相互构成一个分割均匀的小正方形。
中间靠右放置各个游戏功能按钮,如:“开始游戏”“游戏设置”“游戏说明”“认输”“关于”“退出”,且它们都能各自实现自己的功能。
下方显示双方玩游戏玩家剩余时间信息。
而判断胜负是这个游戏的核心,一个游戏最重要的部分,如果连判断胜负都不可以实现的话,那么这个游戏程序是没有用的。
依据五子棋的基本规则,判断某一方向上是否有同一颜色的棋子连成五个或五个以上的,如果有,那么游戏就结束了,并判先连成五子的一方获得了胜利。
效果如下图所示:3.4 编码1. 导入包代码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;2. 窗口制作代码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() ;//刷新屏幕,防止开始游戏时出现无法显示的情况3. 图片路径代码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();}4. 双缓冲技术代码public void paint(Graphics g) {//双缓冲技术防止屏幕闪烁BufferedImage bi = new BufferedImage (500,500,BufferedImage.TYPE_INT_ARGB);Graphics g2 = bi.createGraphics() ;g2.setColor(Color.BLACK);5. 绘制界面信息代码//绘制背景g2.drawImage(bgImage, 1, 25, this) ;//输出标题信息g2.setFont(new Font("黑体",Font.BOLD,20));g2.drawString("游戏信息:" + message, 130, 60);//输出时间信息g2.setFont(new Font("宋体",0,16));g2.drawString("黑方时间: "+blackMessage, 40, 470);g2.drawString("白方时间: "+whiteMessage, 235, 470);6. 绘制棋盘,棋子代码//绘制棋盘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(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,WHTTE);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<19;j++) {if (allChess[i][j] == 1){//黑子int tempX = i * 20+10 ;int tempY = j * 20+70 ;g2.fillOval(tempX-7, tempY-7, 14, 14);}if (allChess[i][j] == 2) {//白子int tempX = i * 20+10 ;int tempY = j * 20+70;g2.setColor(Color.WHITE);g2.fillOval(tempX-7, tempY-7, 14, 14);g2.setColor(Color.BLACK);g2.drawOval(tempX-7,tempY-7,14,14);}}}g.drawImage(bi,0,0,this) ;}7. 判断鼠标按下棋子下落代码public void mousePressed(MouseEvent e) {// TODO Auto-generated method stub/*System.out.println("X:"+e.getX());System.out.println("y:"+e.getY());*/if (canPlay == true) {x = e.getX() ;y = e.getY() ;if (x >=10 && x <= 370 && y >= 70 && y <= 430){ if(((x - 10) - (x - 10) /20 * 20) <= 10){x = (x - 10) / 20;}else{x = (x - 10) / 20 + 1;}if(((y - 70) - (y - 70) / 20 * 20) <= 10){y = (y - 70) / 20;}else{y = (y - 70) /20 + 1;}8. 判断游戏胜利的代码//判断这个棋子和其他棋子连成5连,即判断游戏是否结束boolean winFlag = this.checkWin();if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束:"+ (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜! ");t.suspend() ;canPlay = false ;}}else{JOptionPane.showMessageDialog(this,"当前位置已有棋子,请重新落子!");}this.repaint() ;}}9. 设置开始游戏代码//点击开始游戏按钮if (e.getX() >=390 && e.getX() <= 470 && e.getY() >=70 && e.getY() <= 95){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 < 19; j++){allChess[i][j] = 0;}}//另一种方式allChess = new int[19][19];message = "黑方先行";isBlack = true ;blackMessage = "无限制";whiteMessage = "无限制";this.canPlay = true ;t.suspend() ;this.repaint() ;}}10. 设置游戏设置代码//点击游戏设置按钮if (e.getX() >=390 && e.getX() <= 470 && e.getY() >=120 && e.getY() <= 150){String input = JOptionPane.showInputDialog("请输入游戏最大时间(单位:分钟)如果输入0,表示没有时间限制:");try {maxTime = Integer.parseInt(input) * 60;if (maxTime < 0) {JOptionPane.showMessageDialog(this, "请输入正确信息,不允许输入负数!");}if (maxTime == 0) {intresult = JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if (result == 0){for (int i = 0; i < 19;i++){for (int j = 0; j < 19; j++){ allChess[i][j] = 0;}}//另一种方式allChess = new int[19][19];message = "黑方先行";isBlack = true ;blackTime = maxTime ;whiteTime = maxTime ;blackMessage = "无限制";whiteMessage = "无限制";this.canPlay = true ;t.suspend() ;this.repaint() ;}}if (maxTime > 0) {int result = OptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if (result == 0){for (int i = 0; i < 19;i++){for (int j = 0; j < 19; j++){allChess[i][j] = 0;}}//另一种方式allChess =new int[19][19];message = "黑方先行";isBlack = true ;blackTime = maxTime ;whiteTime = maxTime ;blackMessage = maxTime /3600 + ":" +(maxTime /60 -maxTime /3600 * 60) + ":" + (maxTime - maxTime / 60 * 60);iteMessage = maxTime / 3600 + ":" + (maxTime /60 -maxTime /3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);t.resume();this.canPlay = true ;this.repaint() ;}}} catch (NumberFormatException e1) {// TODO Auto-generated catch blockif(input!= null){JOptionPane.showMessageDialog(this, "请正确输入信息!");}}}11. 设置游戏说明代码//点击游戏说明按钮if (e.getX() >=390 && e.getX() <= 470 && e.getY() >=170& e.getY() <= 200){JOptionPane.showMessageDialog(this, "这是一个五子棋小游戏程序,黑白双方轮流下棋,当某一方连到五子时,游戏结束。