个人作业

Github链接:

https://github.com/ZhaoCuncun/test/tree/master

一、实践目的

1、掌握基本输入输出。

2、掌握方法定义与调用,理解参数传递方式。

3、掌握数组的声明、定义与初始化,数组的处理。

4、掌握数组作为方法参数和返回值。

二、实践要求

利用方法、数组、基本输入输出等Java基础知识,给出所选项目的基本设计与实现。

三、项目需求

 

所选项目名称:猜数字游戏

游戏随机自动生成一个随机数random number即0~99(包括0和99)的整数字,然后让用户猜是什么数字。用户可以随便猜一个数字,游戏会提示太大还是太小,从而缩小猜数范围。经过几次猜测与提示后,直至猜到,给出所用猜数次数和评语最终退出游戏。在游戏过程中。记录用户最终猜对时所需次数。游戏结束后公布结果。

具体要求:通过菜单栏里提供的选项,进入游戏界面。系统提示猜数字游戏的运行情况,一般情况下为正常,随即游戏者可以输入自己的猜数结果,可以通过按回车键完成输入。每次完成一次游戏时,给出猜测的次数的统计。按其他选项还可以选择退出游戏,查询答案,查询游戏记录,清除游戏记录。

游戏中要求完成一下内容:

1)要求记录产生的随机数并计算用户猜数次数、并完成提示玩家游戏信息等功能;

2)要求在玩家输入不是数字或输入范围不符合时会提示错误信息;

3)要求能判断程序随机生成数字与用户猜的数字的大小,玩家猜的数字偏大于随机生成数就提示“您猜的数字偏大,请重新输入”或玩家猜的数字偏小于随机生成数就提示“您猜的数字偏小,请重新输入”;

 4)要求在玩家猜对的时候,提示信息“猜对啦!”,并统计玩家猜数次数,反馈给玩家;

5)要求在玩家发出“enter”口令时能进入游戏;

6)要求在玩家发出“answer”口令时能显示该次游戏的答案;

7)要求在玩家发出“record”口令时能显示以往游戏中的最好成绩;

8)要求在玩家发出“clear”口令时能清除以往的游戏记录,并显示记录已被清除;

9)要求在玩家发出“exit”口令时能退出游戏。

四、项目设计方案

猜数游戏的功能模块包含进入游戏模块,用来初始游戏,并记录用户猜测的数据与游戏随机产生的随机数;成绩记录模块用来将用户游戏数据记录在计算机中,以便随时调用。答案显示模块用来提供用户正确的答案。记录清空模块用来将用户之前的游戏成绩记录删除清空。退出游戏模块可以使用户在后悔进入游戏的情况下,立即结束游戏。

 

 

游戏中,Guessgame作为类,负责创建游戏系统的运行,记忆测试系统由该类开始执行。其中定义int i 为猜数次数,定义n 为用户猜的数字,定义number为一个随机数math random,用于产生随机的数字,范围要求在0~99之间;程序中运用方法system.in,用于记录用户输入的数据,使用if语句判断数字的大小,使用while语句循环判断数字大小,并逐个与其后的值相比较,当表达式的值与随机数字值相等时, 即执行其后的语句,若程序中出现错误,则可通过try catch语句来跳出错误,继续执行下面的语句。使用System.out.println方法输出语句,给出数字判断或评价。程序中设置了printStackTrace()方法来打印异常信息在程序中出错的位置及原因。

 

具体的成员方法说明及个别实现语句说明请见下表:

 

 

 

 

+Guessgame

 

成语变量

+i          :int

+number    :int

+n         :int

 

成员方法

Math.random()

System.in()

System.out.println()

printStackTrace()

 

语句

+while

+for

+if else

+finaly

+try...catch

图B.类与成员变量成员方法及语句之间的关系图

用户可通过输入框选择任务,如:开始游戏,退出游戏,显示答案,成绩记录,清除记录等。进入游戏后,程序自动生成随机数,并发送请求用户输入数字,通过else if语句判断数字与生成数的大小,并弹出对话框,输出信息。之后再重新输入直到猜对,程序可以无限次的输入数字。猜数正确后,会弹出对话框,输出信息,给出游戏最新记录,然后自动退出游戏。该游戏记录存档在D盘,以记录猜数成绩信息,若输入clear,可清除记录,显示记录空。Answer口令以显示系统自动生成的随机数。Exit口令以直接退出游戏。

游戏中,最重要的部分是判断数字大小,该过程中将定义好的n与随机生成的数字number比较,运用到if else语句。猜对后,运用break语句跳转到评价语句,显示游戏记录。Try catch语句用于输入错误时跳出语句。

五、核心算法详细设计

   

对于每个类的主要方法,给出其详细设计的核心算法,如:

5.1 游戏菜单设置的具体算法

import java.io.BufferedReader;

import java.io.File;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.RandomAccessFile;

 

public class Guessgame

{

int i = 0;// 记录猜数字的次数

 

void operate()

{

System.out.println("欢迎来到 赵存存 开发的猜数字小游戏" +

               "\n"+"输入“enter”进入游戏;" +

               "\n" + "输入“exit”退出游戏;" +

               "\n"+ "输入“record”最新的游戏记录;" +

               "\n" + "输入“answer”显示该次游戏的正确答案;" +

               "\n"+ "输入“clear”清除记录"+"\n");

System.out.println("请选择上面的选项:");

 

以上程序段通过定义int变量来记录猜数字的次数,并通过输出语句,来显示游戏的菜单。

 

5.2 生成随机数的具体算法

void playGame(int number)

{

// int number = (int) (Math.random() * 100);

System.out.println("游戏开始,请猜数,输入0-100之间的一个数:");

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

String str = "";

int n;

RandomAccessFile raf = null;

try

{

while (br != null && !str.equals("exit"))

{

str = br.readLine();

n = Integer.parseInt(str);

i++;// i记录输入数字的次数}}

 

以上程序段通过定义变量int来生成随机数,定义变量int来记录用户的猜测的数字,通过while语句实现退出。

 

5.3 比较数字大小的具体算法

if (a < number) {

System.out.println("你猜的数字偏小!");

// break;

}

else if (a > number) {

System.out.println("你猜的数字偏大!");

// break;

 

}

else if (a == number) {

System.out.println("猜对啦,恭喜你!");

System.out.println("你输入了"+ i + "次");

 

以上程序段通过ifelse语句实现生成随机数与用户猜数之间的比较,并通过输出语句显示相关评价。

 

5.4 记录与清除成绩的具体算法

File f = new File("d:\\RandomAccessFile.txt");

raf = new RandomAccessFile(f, "rw");

// raf.seek(0);

// while(f.length()!=

raf.setLength(0);// 写之前先将文件清空

raf.writeInt(i);// 输入数字的次数写入文件

 

raf.seek(0);// 定位到文件头

// raf.seek(raf.length()-1);//定位到文件尾

System.out.println("最新的游戏记录:" + raf.readInt() + "次");// 打印最新的猜数字记录

………

File f = new File("d:\\RandomAccessFile.txt");

RandomAccessFile raf = new RandomAccessFile(f, "rw");

 

if (raf.length() > 0)// 如果文件中有记录,则输出此数,否则显示“记录空”的提示

{

int i = raf.readInt();

System.out.println("最新的猜数字记录: " + i + "次");

}

else

System.out.println("无记录");

}

else if (s.equals("answer")) {// 输入“answer”显示该次游戏的正确答案;

System.out.println("该次游戏的正确答案: " + number);

r.playGame(number);// 进入游戏

}

else if (s.equals("clear"))

……

 

以上程序段将游戏中记录成绩的文件自动存档在D盘里,便于游戏中用户查询成绩记录,除了成绩的查询,程序段还具有清除记录的功能。

 

5.5 清空成绩的具体算法

File f = new File("d:\\RandomAccessFile.txt");

     

    RandomAccessFile raf = new RandomAccessFile(f, "rw");

  // raf.seek(0);

      raf.setLength(0);// 写之前先将文件清空

  // raf.writeInt(i);// 输入数字的次数写入文件

 

  // raf.seek(0);// 定位到文件头

System.out.println("记录已被清空");// 打印最新的猜数字记录

            }

 

            }

 

   } catch (IOException e) {

 

// TODO Auto-generated catch block

    e.printStackTrace();

     }

以上程序段可以实现将记录在D盘里的游戏记录清除的功能,寻找处于D盘的文件,将其内记录的成绩清除,随后用System.out.println输出语句将记录已被清空的口令告知用户。

 

5.6 错误跳转的具体算法

try {

if (raf != null)

raf.close();

}

catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

 

以上程序段通过try…catch语句实现错误状态下的跳出动作。

猜数游戏源程序如下:

import java.io.BufferedReader;

import java.io.File;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.RandomAccessFile;

 

public class Guessgame

{

int i = 0;// 记录猜数字的次数

 

void operate()

{

System.out.println("欢迎来到 赵存存 开发的猜数字小游戏" +

            "\n"+"输入“enter”进入游戏;" +

            "\n" + "输入“exit”退出游戏;" +

            "\n"+ "输入“record”最新的游戏记录;" +

            "\n" + "输入“answer”显示该次游戏的正确答案;" +

            "\n"+ "输入“clear”清除记录" + "\n");System.out.println("请选择上面的选项:"

);

}

 

void playGame(int number)

{

// int number = (int) (Math.random() * 100);

System.out.println("游戏开始,请猜数,输入0-100之间的一个数:");

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

String str = "";

int n;

RandomAccessFile raf = null;

try

{

while (br != null && !str.equals("exit")) {

str = br.readLine();

n = Integer.parseInt(str);

i++;// i记录输入数字的次数

if (n < number) {

System.out.println("你猜的数字偏小");

// break;

}

 else if (n > number) {

System.out.println("你猜的数字偏大");

// break;

 

}

 else if (n == number)

{

System.out.println("恭喜你,猜对啦!");

System.out.println("你输入了" + i + "次");

 

File f = new File("d:\\RandomAccessFile.txt");

raf = new RandomAccessFile(f, "rw");

// raf.seek(0);

// while(f.length()!=

raf.setLength(0);// 写之前先将文件清空

raf.writeInt(i);// 输入数字的次数写入文件

 

raf.seek(0);// 定位到文件头

// raf.seek(raf.length()-1);//定位到文件尾

System.out.println("最新的游戏记录:" + raf.readInt() + "次");// 打印最新的猜数字记录

System.exit(0);

}

 

}

 

}

 catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

Finally

 {

try {

if (raf != null)

raf.close();

}

catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

}

 

public static void main(String[] args)

{

int number = (int) (Math.random() * 100);

 

game r = new game();

r.operate();

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

String s = "";

Try

{

while (s != null)

{    

s = br.readLine();

if (s.equals("enter"))// 输入“enter”进入游戏;

r.playGame(number);

else if (s.equals("exit"))// 输入“exit”退出游戏;

System.exit(0);

else if (s.equals("record"))//输入“record”打印最新的猜数字记录;

{

File f = new File("d:\\RandomAccessFile.txt");

RandomAccessFile raf = new RandomAccessFile(f, "rw");

 

if (raf.length() > 0)// 如果文件中有记录,则输出此数,否则显示“记录空”的提示

{

int i = raf.readInt();

System.out.println("最新的猜数字记录: " + i + "次");

}

else

System.out.println("无记录");

}

else if (s.equals("answer")) {// 输入“answer”显示该次游戏的正确答案;

System.out.println("该次游戏的正确答案: " + number);

r.playGame(number);// 进入游戏

}

else if (s.equals("clear"))

{

// 输入“clear”清除记录

 

File f = new File("d:\\RandomAccessFile.txt");

RandomAccessFile raf = new RandomAccessFile(f, "rw");

// raf.seek(0);

 

raf.setLength(0);// 写之前先将文件清空

// raf.writeInt(i);// 输入数字的次数写入文件

 

// raf.seek(0);// 定位到文件头

 

System.out.println("记录已被清空");// 打印最新的猜数字记录

}

}

}

 catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 finally {

 

try {

if (br != null)

br.close();

}

 catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

六、完整源码

       完整源码:给出完整的源代码。如:

import java.io.BufferedReader;

import java.io.File; 

import java.io.IOException; 

import java.io.InputStreamReader;

import java.io.RandomAccessFile;

 

public class Guessgame {

    int i = 0;// 记录猜数字的次数

     

     

    void operate() 

    { 

    System.out.println("欢迎来到开发的猜数字小游戏" +

            "\n"+"输入“enter”进入游戏;" +

     "\n" + "输入“exit”退出游戏;" +     

    "\n"+ "输入“record”最新的游戏记录;" +  

    "\n" + "输入“answer”显示该次游戏的正确答案;" +  "\n"+ "输入“clear”清除记录"+"\n");

    System.out.println("请选择上面的选项:");

    }

    void playGame(int number) 

    { 

//  int number = (int) (Math.random() * 100); 

    System.out.println("游戏开始,请猜数,输入0-100之间的一个数:");

    InputStreamReader isr = new InputStreamReader(System.in);

    BufferedReader br = new BufferedReader(isr);

    String str = ""; 

     

    int n; 

    RandomAccessFile raf = null;

    try

     

    { 

    while(br != null&& !str.equals("exit")) 

    { 

    str = br.readLine();

    n = Integer.parseInt(str);

    i++;// i记录输入数字的次数}}

    if

     (n < number) { 

    System.out.println("你猜的数字偏小");

//  break;

    } 

     

    else if(n > number) { 

    System.out.println("你猜的数字偏大");

//  break;

     

    } 

     

    else if(n == number)

    { 

    System.out.println("恭喜你,猜对啦!");

    System.out.println("你输入了" + i + "次");

     

    File f =

    new

     File("d:\\RandomAccessFile.txt");

    raf = new RandomAccessFile(f, "rw");

//  raf.seek(0); 

//  while(f.length()!= 

    raf.setLength(0);// 写之前先将文件清空

    raf.writeInt(i);// 输入数字的次数写入文件

     

     

    raf.seek(0);// 定位到文件头

     

//  raf.seek(raf.length()-1);//定位到文件尾

     

    System.out.println("最新的游戏记录:" + raf.readInt() + "次");

    // 打印最新的猜数字记录

     

    System.

    exit(0);

    }

     

    }

     

    } 

     

    catch(IOException e)

    { 

//  TODOAuto-generated catch block

    e.printStackTrace();

    }  

    finally  {

    try

     { 

    if(raf != null)

    raf.close();

    }  

    catch (IOException e) 

    { 

//  TODOAuto-generated catch block

    e.printStackTrace();

    }

    }

     

    }

     

    public static void main(String[] args) 

    { 

    int number = (int) (Math.random() * 100);

     

    Guessgame r = new Guessgame();

    r.operate(); 

    InputStreamReader isr = new InputStreamReader(System.in); 

    BufferedReader br = new BufferedReader(isr);

        String s = "";

        try

         

        { 

        while(s != null)

        {

         

        s = br.readLine(); 

        if(s.equals("enter"))// 输入“enter”进入游戏;

        r.playGame(number); 

        else if (s.equals("exit"))// 输入“exit”退出游戏;

        System.exit(0); 

        else if(s.equals("record"))//输入“record”打印最新的猜数字记录

        ; 

        { 

        File f = new File("d:\\RandomAccessFile.txt"); 

        RandomAccessFile raf = new RandomAccessFile(f, "rw");

         

        if

         (raf.length() > 0)// 如果文件中有记录,则输出此数,否则显示“记录空”的提示

         

        { 

        int i = raf.readInt(); 

        System.out.println("最新的猜数字记录: " + i + "次");

        } 

        else

         

        System.out.println("无记录");

        }  

         

        if(s.equals("answer")) {// 输入“answer”显示该次游戏的正确答案; 

        System.out.println("该次游戏的正确答案: " + number);

        r.playGame(number);// 进入游戏

         

        }  

        else if (s.equals("clear"))

        { 

//          输入“clear”清除记录

         

             

            File f = new File("d:\\RandomAccessFile.txt"); 

            RandomAccessFile raf =

            new

             RandomAccessFile(f, "rw");

//          raf.seek(0);

             

            raf.setLength(0);// 写之前先将文件清空

             

//          raf.writeInt(i);// 输入数字的次数写入文件

//          raf.seek(0);// 定位到文件头

             

            System.out.println("记录已被清空");// 打印最新的猜数字记录

            }

            }

            } 

             

            catch(IOException e) { 

//          TODOAuto-generated catch block

            e.printStackTrace();

            } 

             

            finally{

             

            try

            if(br != null) br.close();

            } 

             

            catch

             (IOException e) { 

//          TODOAuto-generated catch block

            e.printStackTrace();

            }

            }

             

            } 

            }

 

 

七、使用说明与运行结果截图

使用说明:

程序运行时,显示菜单栏,供用户选择将要进行的工作。有四种选择:record指令用于显示游戏成绩记录,answer指令用于显示该次游戏中的正确答案,clear指令用于清除系统记录的成绩,exit指令用于选择直接退出游戏。进入游戏时,计算机产生一个随机数,系统请求用户输入猜的数字,当输入的数比随机数小时弹出对话框提示“小了”,当输入的数比随机数大时弹出对话框提示“大了”,要求玩家再次输入数字直到输入的数和随机数一样时退出循环,并弹出成功对话框,给出评语“恭喜你猜对了”,随即显示该次游戏中用户猜数字的次数。结束任务。

       运行结果截图:

 

图1.游戏猜数过程

 

图2. 查询游戏记录状态图

 

图3. 查询游戏答案状态图

 

图4. 游戏记录清空状态图

 

图5. 退出游戏状态图

 

 

      

八、实践总结

思考一段时间后,我决定做猜数游戏的课程实践。主要考虑到以前时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个猜数游戏程序,由于其功能简单设计也相对较易,对于我个人的学习情况比较合适,并且通过设计这样的一个猜数程序,也能使自己对JAVA的一些基础知识掌握的更加牢固。

 从这次实验中的学到了许多。比如:try…catch语句就妙不可言。想尽办法没能实现的功能,它竟然能实现了!除此之个还由许多个方法也得到了巩固。以前总是模模糊糊的,现在心里十分清楚了。

 平时的学习自身只注意到了书本上面的知识,对一些类及方法的运用显得稚嫩,这次的学习让我从纸上谈兵逐渐的过渡到实践出真知。经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。

 通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。

 还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。终于可以自己设计程序了,以前感觉学的都用不到,现在才知以前学的用途真大,想学编程是少不了的。以前感觉,编程是多么的神秘,现在通过自己实践,才知道,编程也没那么神秘,但却很有乐趣的。那种看到自己亲手编的程序运行出结果的感觉是无法用言语表达的。

 

posted on 2015-04-30 14:01  赵存存  阅读(208)  评论(3编辑  收藏  举报

导航