Java 程序设计课程设计猜数游戏.doc
课程设计(论文)题 目 名 称 猜数游戏 课 程 名 称 Java 程序设计课程设计 学 生 姓 名 学 号 系 、专 业 信息工程系、07网络工程专业 指 导 教 师 2010年 1 月 3 日摘 要 本程序是一个游戏程序,程序让计算机自动生成一个随机数,让玩家猜,猜的数比随机数大则提示“大了”,比随机数小则提示“小了”,再让玩家重新猜,直到猜对为止,猜对了以后会表扬玩家,并算出玩家共猜了多少次。关键词: 游戏、随机数、猜数目 录1 问题描述.12 需求分析.13 概要设计.13.1 自定义类说明.13.2 程序流程分析 . 14 详细设计.44.1 game类的实现.45 测试分析.66 课程设计总结.8参考文献9附录(部分源程序清单)101 问题描述计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,给出所用次数和评语。2 需求分析 需要创建一个game类,该类实现产生随机数、提示出错信息、计算猜错次数、给出玩家游戏信息等功能。其中包括一个循环函数,玩家猜的不对就提示“大了”或“小了”要求玩家再次输入,不断循环,直到玩家猜对。还包括提示出错程序,即玩家输入不是数字或不输入时会提示出错。还有计数函数,计算玩家共猜了多少次。最后是猜对表扬函数,即玩家猜对后表扬玩家,同时给出玩家共猜了多少次的信息。3 概要设计31自定义类说明3.1.1类名: game类(1)作用: 主类,用来(2)继承的父类: 没有(3)实现的接口: 没有 (4)成员变量说明: 整型变量rnd:计算机产生的随机数 整型变量counter:存放猜数次数的变量 字符串变量str:存放输入字符串(5)成员方法说明: Math.random():随机产生一个数 JOptionPane.showInputDialog:产生一个输入消息对话框 JOptionPane.showMessageDialog:产生一个输出消息对话框 Integer.parseInt:强制类型转换32 程序流程分析开始显示“小了”i<rnd不能为空,错误输入错误输入!inti=Integer.parseInt(str);str.equals("")不是数字c+c<sarray.lengthintc=0true计算机产生随机数请输入数据,并赋值给stri>rndcounter>5显示“大了”成功,你只猜了counter次,你真是太棒了 恭喜你猜对了,你猜了counter次import java.awt.event.*;import javax.swing.*;import java.io.*;import java.security.*;import javax.crypto.*;import javax.crypto.spec.*;public class FileEncrypterT extends JFrame Package key;final JButton jbE=new JButton("加密");final JButton jbD=new JButton("解密");FileEncrypterT()super("文件加密器(TriDES)");setBounds(100,100,600,380);this.setResizable(false);Container c=getContentPane();c.setLayout(new FlowLayout();final FilePanel fp = new FilePanel("文件选择");c.add(fp);final KeyPanel pp=new KeyPanel("输入Key");c.add(pp);jbE.addActionListener(new ActionListener()public void actionPerformed(ActionEvent event)File file = new File(fp.getFileName();if (file.exists()encrypt(file.getAbsoluteFile(),pp.getKey();elseJOptionPane.showMessageDialog( null,"请选择文件!","提示",JOptionPane.OK_OPTION););jbD.addActionListener(new ActionListener()public void actionPerformed(ActionEvent event)File file = new File(fp.getFileName();if (file.exists()decrypt(file.getAbsoluteFile(),pp.getKey();elseJOptionPane.showMessageDialog(null,"请选择文件!","提示",JOptionPane.OK_OPTION););getContentPane().add(jbE);getContentPane().add(jbD);public static void main(String args) FileEncrypterT fe=new FileEncrypterT();fe.show();private void encrypt(File fileIn,String sKey)try if(sKey.length() = 48) byte bytK1 = getKeyByStr(sKey.substring(0,16); byte bytK2 = getKeyByStr(sKey.substring(16,32); byte bytK3 = getKeyByStr(sKey.substring(32,48); FileInputStream fis = new FileInputStream(fileIn); byte bytIn = new byte(int)fileIn.length(); for(int i = 0;i<fileIn.length();i+) bytIni = (byte)fis.read(); byte bytOut = encryptByDES(encryptByDES( encryptByDES(bytIn,bytK1),bytK2),bytK3); String fileOut = fileIn.getPath() + ".tdes" FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;i<bytOut.length;i+) fos.write(int)bytOuti);fos.close();JOptionPane.showMessageDialog(this,"加密成功!","提示",JOptionPane.OK_OPTION);elseJOptionPane.showMessageDialog(this,“密码长度必须等于48!”,“错误信息”JOptionPane.ERROR_MESSAGE); catch(Exception e)e.printStackTrace();private void decrypt(File fileIn,String sKey)try if(sKey.length() = 48) String strPath = fileIn.getPath();if(strPath.substring(strPath.length()-5).toLowerCase().equals(".tdes") strPath = strPath.substring(0,strPath.length()-5);else JOptionPane.showMessageDialog(this,"不是合法的加密文件!","提示",JOptionPane.OK_OPTION);return;JFileChooser chooser = new JFileChooser();chooser.setCurrentDirectory(new File(".");chooser.setSelectedFile(new File(strPath);int ret = chooser.showSaveDialog(this);if(ret=JFileChooser.APPROVE_OPTION)byte bytK1 = getKeyByStr(sKey.substring(0,16);byte bytK2 = getKeyByStr(sKey.substring(16,32);byte bytK3 = getKeyByStr(sKey.substring(32,48);FileInputStream fis = new FileInputStream(fileIn);byte bytIn = new byte(int)fileIn.length();for(int i = 0;i<fileIn.length();i+)bytIni = (byte)fis.read();byte bytOut = decryptByDES(decryptByDES(decryptByDES(bytIn,bytK3),bytK2),bytK1); File fileOut = chooser.getSelectedFile();fileOut.createNewFile();FileOutputStream fos = new FileOutputStream(fileOut);for(int i = 0;i<bytOut.length;i+)fos.write(int)bytOuti);fos.close();JOptionPane.showMessageDialog(this,"解密成功!","提示",JOptionPane.OK_OPTION);elseJOptionPane.showMessageDialog(this,"密码长度必须等于48!","错误信息 ",JOptionPane.ERROR_MESSAGE);catch(Exception e)JOptionPane.showMessageDialog(this,"解密失败,请核对密码!","提示",JOptionPane.OK_OPTION);private byte encryptByDES(byte bytP,byte bytKey) throws Exception DESKeySpec desKS = new DESKeySpec(bytKey); SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); SecretKey sk = skf.generateSecret(desKS); Cipher cip = Cipher.getInstance("DES"); cip.init(Cipher.ENCRYPT_MODE,sk); return cip.doFinal(bytP);private byte decryptByDES(byte bytE,byte bytKey) throws Exception DESKeySpec desKS = new DESKeySpec(bytKey); SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); SecretKey sk = skf.generateSecret(desKS); Cipher cip = Cipher.getInstance("DES"); cip.init(Cipher.DECRYPT_MODE,sk); return cip.doFinal(bytE);private byte getKeyByStr(String str)byte bRet = new bytestr.length()/2;for(int i=0;i<str.length()/2;i+)Integer itg= newInteger(16*getChrInt(str.charAt(2*i)getChrInt(str.charAt(2*i+1);bReti = itg.byteValue();return bRet;private int getChrInt(char chr)int iRet=0;if(chr="0".charAt(0) iRet = 0;if(chr="1".charAt(0) iRet = 1;if(chr="2".charAt(0) iRet = 2;if(chr="3".charAt(0) iRet = 3;if(chr="4".charAt(0) iRet = 4;if(chr="5".charAt(0) iRet = 5;if(chr="6".charAt(0) iRet = 6;if(chr="7".charAt(0) iRet = 7;if(chr="8".charAt(0) iRet = 8;if(chr="9".charAt(0) iRet = 9;if(chr="A".charAt(0) iRet = 10;if(chr="B".charAt(0) iRet = 11;if(chr="C".charAt(0) iRet = 12;if(chr="D".charAt(0) iRet = 13;if(chr="E".charAt(0) iRet = 14;if(chr="F".charAt(0) iRet = 15;return iRet; System.exit(0);counter+;结束 图3.1 主程序流程图程序运行时计算机产生一个随机数,并把这个随机数赋值给rnd,再进入while循环,程序要求玩家输入一个数字,不为数字或输入为空时,弹出对话框,提示输入为空和错误输入。当输入的数比随机数小时弹出对话框提示“小了”,当输入的数比随机数大时弹出对话框提示“大了”,要求玩家再次输入数字直到输入的数和随机数一样时退出循环,并弹出成功对话框,给出评语“恭喜你猜对了,你猜了counter 次”或“你只猜了 counter 次,你真是太棒了!”如图3.1所示。4 详细设计41game类的实现/创建game类public class Game public static void main(String args) /rnd是计算机产生的随机数 int rnd=(int)(Math.random()*100)+1; /counter用来统计玩家猜数次数 int counter=1; while(true) /输入对话框,用showInputDialog方法 String str=javax.swing.JOptionPane.showInputDialog("请输入数据:"); /定义一个字符数组,将str转换后的值赋给它 char sarray =str.toCharArray(); for(int c=0;c<sarray.length;c+) /判断是否为数字,若不是则提示错误 if(!Character.isDigit(sarrayc) javax.swing.JOptionPane.showMessageDialog(null,"错误输入!"); System.exit(0); /判断是否空if (str.equals("") /单纯显示信息,用showMessageDialog方法 JOptionPane.showMessageDialog(null, "不能为空!","错误", JOptionPane.ERROR_MESSAGE); /把str的值强制转换为整型并赋给i int i=Integer.parseInt(str); /判断玩家输入值与随机数大小,小了则给出对话框提示“小了”,大了则提示“大了” if(i<rnd) javax.swing.JOptionPane.showMessageDialog(null,"小了"); else if(i>rnd) javax.swing.JOptionPane.showMessageDialog(null,"大了"); else /猜对后,根据猜测次数给出相应的评价 if(counter>5) javax.swing.JOptionPane.showMessageDialog(null,"恭喜你猜对了!n你猜了 "+ counter + " 次!"); else JOptionPane.showMessageDialog(null,"成功!n你只猜了 "+ counter + " 次!n你真是太棒了!"); System.exit(0); counter+; 5 测试分析程序运行界面如下:(1)输入对话框:当程序运行时自动弹出的对话框,要求输入一个数字(2)输入不是数字时:当输入的不是数字是会弹出错误输入的对话框(3)输入为空时:没有输入按了确定时,弹出不能为空的对话框(4)输入的数比随机数大或小时:当输入的数比计算机产生的随机数大了时弹出对话框,提示“大了”或“小了”,按确定后再重新输入直到猜对(5)输入正确时:当输入数字跟计算机产生的随机数相同时,给出对话框,提示成功,并给出评语6 课程设计总结这次课程设计的成功来之不易,一路艰辛坎坷,由最初接到课题时的茫然不知如何动手,到后来和帮我的同学钻研探讨后一步步接近成功,有喜有犹,有了新的思路时兴奋得拍手,发现思路行不通或发现编写程序出的一个个错误时愁眉苦脸,真让我痛并快乐着这种努力钻研剔除一个个错误后一步步接近成功的经验,是我最大的收获,让我有了屡败屡战的优秀品质。通过这次课程设计我的Jave编程熟练了很多,我想感谢我的指导老师许老师,感谢老师的细心认真的辅导,他的帮助让我从开始的一片茫然到后来的豁然开朗。这次课程设计能够顺利的完成,除了我个人的努力,还有同学的帮助,同时也离不开指导老师的答疑解惑。参考文献1 李尊朝,苏军Java语言程序设计(第二版)北京:中国铁道出版社,20072 印昊Java与面向对象程序设计教程北京:高等教育出版社,19993 耿祥义,张跃平Java2 实用教程(第二版)北京:清华大学出版社,20064 黄同成,黄俊民,董建寅数据结构M北京:中国电力出版社,2008附录(部分源程序清单)import java.awt.*;import javax.swing.*;public class Game public static void main(String args) int rnd=(int)(Math.random()*100)+1; int counter=1; while(true) String str=javax.swing.JOptionPane.showInputDialog("请输入数据:"); char sarray =str.toCharArray(); for(int c=0;c<sarray.length;c+) if(!Character.isDigit(sarrayc) javax.swing.JOptionPane.showMessageDialog(null,"错误输入!"); System.exit(0); if (str.equals("") /判断是否空 /单纯显示信息,用showMessageDialog方法 JOptionPane.showMessageDialog(null, "不能为空!","错误", JOptionPane.ERROR_MESSAGE); int i=Integer.parseInt(str); if(i<rnd) javax.swing.JOptionPane.showMessageDialog(null,"小了"); else if(i>rnd) javax.swing.JOptionPane.showMessageDialog(null,"大了"); else if(counter>5) javax.swing.JOptionPane.showMessageDialog(null,"恭喜你猜对了!n你猜了 "+ counter + " 次!"); else JOptionPane.showMessageDialog(null,"成功!n你只猜了 "+ counter + " 次!n你真是太棒了!"); System.exit(0); counter+;