解决方案 »

  1.   

    Random rd = new Random(); 
    int figur = Math.abs(rd.nextInt(ComputerParty.realCount+1))%3 ; 
    这两句我没看错的话,应该是电脑类ComputerParty 的成员方法把,在new的时候初始化了一次,貌似以后就没再变把,你放到showFigur方法中看看!
      

  2.   

    就是这里,figur应该每一回合都重新计算一次,不然你初始化了以后这个值就永远不变了。
      

  3.   


    package perfect;import java.util.Random;public class Computer
    {
    //  private String name;
    // private int score;
    int a,m;
    String name2;
    public void showFist()// 电脑出拳方法
    {
    Random r1 = new Random();
    a = r1.nextInt(3);// 随机生成一个1~3的数字,对应石头剪刀布。
    Random r2 = new Random();//生成电脑姓名的随机数。
    m = r2.nextInt(3);
    if (m == 0)
    {
    name2 = "曹操";
    // System.out.print("曹操");
    // c.showFist();
    }
    else if (m == 1)
    {
    name2 = "孙权";
    // System.out.print("孙权");
    // c.showFist();
    }
    else if (m == 2)
    {
    name2 = "刘备";
    System.out.print("刘备");
    // c.showFist();
    }
    if (a == 0)//生成随机数,对应前面的人名
    {
    System.out.println(name2 + "出的是  石头!");
    }
    else if (a == 1)
    {
    System.out.println(name2 + "出的是  剪刀!");
    }
    else if (a == 2)
    {
    System.out.println(name2 + "出的是  布!");
    }// Computer c = new Computer();//对computer进行实例化,用于调取showFist方法。


    // score ++;
    }
    }package perfect;import java.util.Scanner;public class Game
    {
    // private Person person; // 甲方
    // private Computer computer; // 乙方
    // private int count;// 对战次数
    String str2, str3;
    static String name,cycle;// 关于姓名输入的字符串
    public int lost, win, deuce; // /**
     * 初始化
     */
    public void initial()
    {
    // 初始化工作 for (int i = 0; i <= 16; i++)
    {
    System.out.print("*");
    }
    System.out.println();
    System.out.println("**" + "   开始    " + "      游戏     " + "  **   ");
    for (int i = 0; i <= 16; i++)
    {
    System.out.print("*");
    }
    System.out.println();
    System.out.println("出拳规则:0、石头 ,1、剪刀 ,2、布");
    System.out.print("请输入你的姓名:");
    Scanner s = new Scanner(System.in);
    boolean b = true;
    while (b)// 对所输入的姓名的字符串进行非空循环
    {
    name = s.nextLine();//定义name的值
    setName(name);//设置姓名
    // System.out.println("name = " + name);//程序初期用于测试是否讲name的值传入Person的showFist()方法
    if (!name.equals(""))// 判断所输入的字符串是后为空
    {
    b = false;
    // System.out.println("name = " + name);//初期用于测试是否传入name的值
    }
    else
    // 若为空则重新输入
    {
    System.out.print("你没有输入姓名,无法开始游戏,是否继续(y/n):");
    Scanner s2 = new Scanner(System.in);
    String str = s2.next();
    if ("y".equals(str))
    {
    b = true;
    System.out.print("请输入你的姓名:");
    }
    else
    {
    b = false;
    System.exit(0);
    } } } } public String getName()
    {
    return this.name;
    } public void setName(String name)
    {
    this.name = name;
    } /**
     * 开始游戏
     */
    public void startGame()// 开始游戏,控制游戏逻辑
    {
    Person p = new Person();
    Computer c = new Computer();
    Scanner s = new Scanner(System.in);
    Game game = new Game();
    boolean b = true;
    while (b)//对有事是否重新开始游戏进行一个循环对“n”则结束,“y”执行下一轮。
    {
    System.out.println("是否继续游戏(y/n)?");
    String cycle = s.nextLine();
    if (cycle.equals("n"))
    {
    b = false;
    break;
    }
    else if (cycle.equals("y"))
    {
    p.showFist();
    c.showFist(); // System.out.println(p.n);//程序初期用于检查n的值时候传进来。
    // System.out.println(c.a);//程序初期用于检查a的值时候传进来。
    if (p.n == c.a)// 首先经过计算,确定了所有返回的可能值,通过if语句判断输出的值
    {
    System.out.println("deuce");
    deuce++;
    }
    else if (p.n - c.a == 1 || p.n - c.a == -2)
    {
    System.out.println("lost");
    lost++;
    // System.out.println(p.n);//程序初期用于检查n的值时候传进来。
    // System.out.println(c.a);//程序初期用于检查a的值时候传进来。
    }
    else
    {
    System.out.println("win");
    win++;
    } for (int i = 0; i <= 16; i++)
    {
    System.out.print("-");
    }
    System.out.println();
    System.out.println("deuce:\t" + deuce);
    System.out.println("win:\t" + win);
    System.out.println("lost:\t" + lost);
    b = true; }
    else{ System.out.println("输入有误,是否重新输入(y/n)");
    Scanner s7 = new Scanner(System.in);
    String str7 = s7.next();
    }
    }
    } /**
     * 显示比赛结果
     */
    public void showResult()
    {
    /* 显示最后结果 */
    // 打印玩了多少局,电脑获胜还是人获胜
    Game game = new Game();
    game.startGame();
    for (int i = 0; i <= 16; i++)
    {
    System.out.print("-");
    }
    System.out.println();
    if (game.win > game.lost)
    {
    System.out.println("You are winner");
    }
    else if (game.win < game.lost)
    {
    System.out.println("You are loser");
    }
    else
    {
    System.out.println("You are deuce");
    }
    } /**
     * 计算比赛结果
     */
    // public int calcResult()
    // {
    // return 0;
    // }
    }package perfect;
    import java.util.InputMismatchException;
    import java.util.Scanner;public class Person
    {
    // private String name = "匿名";
    // private int score;
    int n; public void showFist() // 人出拳
    {
    System.out.print("你将出:");
    Scanner s = new Scanner(System.in);
    Game game = new Game();
    // 对用户输入的数字进行判断
    boolean b = true;
    while (b)
    {
    boolean b1 = false;
    do{
    try//捕获程序输入字符串异常。
    {
    n = s.nextInt();
    b1 = true;
    }
    catch (InputMismatchException n)//取出异常
    {
    s.next();
    System.out.println("输入有误,是否重新输入(y/n)");
    Scanner s5 = new Scanner(System.in);
    String str5 = s5.next();
    if ("y".equals(str5))//对异常进行判断,满足条件则继续执行
    {
    b = true;
    System.out.print("你将出:");
    }
    else if("n".equals(str5))
    {
    b = false;
    System.exit(0);
    }
    else//不满足条件则停止程序运行
    {
    System.out.println("输入有误,是否重新输入(y/n)");
    // Scanner s6 = new Scanner(System.in);
    String str6 = s5.next();
    }
    }
    }while(!b1);//直到不满足条件(!false = true)退出循环
    if (n < 3)//随机出石头剪刀布
    {
    switch (n)
    {
    case 0:
    System.out.print(game.name + "出的是  石头!");
    break;
    case 1:
    System.out.print(game.name + "出的是  剪刀!");
    break;
    case 2:
    System.out.print(game.name + "出的是  布!");
    break;
    }
    b = false;
    // 用户输入错误,让其选择是否重新输入
    }

    else//输入错误后重新输入 
    {
    System.out.print("您的输入错误,是否继续(y/n):");
    Scanner s2 = new Scanner(System.in);
    String str = s2.next();
    if ("y".equals(str))
    {
    b = true;
    System.out.print("你将出:");
    }
    else
    {
    b = false;
    System.exit(0);
    }
    }
    }
    }
    }package perfect;public class StartGuess { /**
     * 人机互动版猜拳游戏
     * @param args
     */
    public static void main(String[] args) {
    //游戏入口
    Game game = new Game();
    game.initial();
    game.showResult();
    game.startGame();
    }
    }这个是我在学校写的猜拳游戏的代码,希望对楼主有帮助
      

  4.   

    就是这里,figur应该每一回合都重新计算一次,不然你初始化了以后这个值就永远不变了。多谢二位,把那两句话放方法里就OK了。我对产生Java的运行机制还是一知半解,不清楚什么情况下代码会什么方式运行。
      

  5.   


    仁兄,我原本是认为每次进入playGame方法后,执行到int figur = xxxx 的视乎,rd.nextInt(xx)能重新取一次随机数,能否帮忙解释下为什么不会重新取么?多谢!
      

  6.   


    仁兄,我原本是认为每次进入playGame方法后,执行到int figur = xxxx 的视乎,rd.nextInt(xx)能重新取一次随机数,能否帮忙解释下为什么不会重新取么?多谢!
    它们是成员变量呀,成员变量会在类实例话的时候,进行初始化,以后再使用这实例的时候,就不会初始化了,如果想改变他的值,需要提供相应的方法!
      

  7.   


    仁兄,我原本是认为每次进入playGame方法后,执行到int figur = xxxx 的视乎,rd.nextInt(xx)能重新取一次随机数,能否帮忙解释下为什么不会重新取么?多谢!
    它们是成员变量呀,成员变量会在类实例话的时候,进行初始化,以后再使用这实例的时候,就不会初始化了,如果想改变他的值,需要提供相应的方法!多谢多谢!