用类和对象的思想,一个简单的人机猜拳游戏

要求:编写一个人机猜拳的控制台小游戏,实现玩家命名,选择计算机对手名字,记录分数的功能。

思路:
三个功能类,
玩家类Person,实现命名方法,出拳方法;
计算机类Computer,实现选择计算机对手,计算机出拳方法,Random生成随机数;
裁判类Game,实现判断胜负和计分,if判断玩家和电脑输赢并计分。

主要涉及的知识:
类和方法,方法的调用,if方法,switch方法,Random生成随机数
因为还没学字符串的对比方法,只能用有限的知识简单实现。

玩家类代码:

//玩家类代码
/*
用一个String类型变量记录玩家从键盘输入的名字
用一个int类型变量记录玩家的出拳,Switch来显示对应的提示
*/
import java.util.*; //由于需要从接盘接收输入,所以需要导包
class Person
{
    Scanner input = new Scanner(System.in);
    String name; //用户名
    int score;  //积分
    int perFist;//记录玩家出哪个?
    //玩家命名方法
    public void personName()
    {
        System.out.print("请输入你的名字:");
        name = input.next();  //从键盘接收输入赋值给name实现玩家起名
    }
    //玩家出拳方法
    public void personGame()
    {
        System.out.print("请出拳:1.石头,2.剪刀。3.布 (输入相应数字):");
        perFist = input.nextInt(); //接收输入的数字
        switch(perFist) //switch方法判断输入的数字输出相应的提示
        {
            case 1:{
                System.out.print("你出拳:石头\n");
                break;
            }
            case 2:{
                System.out.print("你出拳:剪刀\n");
                break;
            }
            case 3:{
                System.out.print("你出拳:布\n");
                break;
            }
            default:{
                System.out.print("请输入正确的数字\n");
                break;
            }
        }
    }
}

计算机类代码:

/*
类似玩家类起名方法,用一个String类型来记录计算机对手的名字
然后产生一个1-3的随机数,模拟剪刀石头布,
根据产生的随机数,用switch方法显示计算机的出拳
*/
class Computer
{
    //Random random = new Random(); //产生随机数模拟计算机出拳
    int compFist;  //记录计算机出拳
    Scanner input = new Scanner(System.in);
    String name;  //记录选择的计算机对手名字
    int score;  //输出计算机出拳结果
    //选择计算机对手名称
    public void computerGame()
    {
        System.out.print("请选择电脑人物(1.刘备 2.孙权 3.曹操):");
        int m1 = input.nextInt(); //获取键盘输入并通过switch判断
        switch(m1)
        {
            //根据输入给计算机对手起名
            case 1:{
                System.out.print("你选择了刘备对战\n");
                name = "刘备";
                break;
            }
            case 2:{
                System.out.print("你选择了孙权对战\n");
                name = "孙权";
                break;
            }
            case 3:{
                System.out.print("你选择了曹操对战\n");
                name = "曹操";
                break;
            }
            default:{
                System.out.print("请输入正确的选择\n");
                break;
            }
        }
    }
    //计算机出拳方法
    public void computerFist()
    {
        Random random = new Random();
        compFist = random.nextInt(3)+1; //产生一个1-3的随机数
        switch(compFist) //根据产生的随机数显示计算机出了哪个
        {
            case 1:{
                System.out.println("电脑出拳:石头");
                break;
            }
            case 2:{
                System.out.println("电脑出拳:剪刀");
                break;
            }
            case 3:{
                System.out.println("电脑出拳:布");
                break;
            }
        }
    }
}

裁判类代码:

//裁判
/*
实现思路:
要实现判断胜负和记录分数,由于没有学习字符串对比,用1,2,3的数字代替出拳,
根据条件用if来判断胜负。
*/
class Game
{
    int markGame = 0;//记录游戏次数
    int compMark = 0; //记录计算机分数
    int markTie = 0; //记录平局次数
    //判断胜负
    public void  start()
    {
        Person perGame = new Person(); //由于不是在同一个类下的静态变量,所以需要new一个对象去调用方法
        perGame.PersonGame(); //这里是调用玩家出拳方法
        Computer compGame = new Computer();
        compGame.ComputerFist(); //这里是调用计算机出拳方法
        /*
        思路:
        如果计算机产生的随机数等于玩家输入的数字,那么就认为是和局,然后玩家胜利的情况有三种,如果玩家出石头并且计算机出剪刀,如果玩家出布并且计算机出石头,如果玩家出剪刀并且计算机出布,那么玩家胜利,其余情况都为计算机胜利。
        */
        if(perGame.perFist==compGame.compFist) //和局输出
        {
            System.out.println("结果:和局");
            markTie++; //这里记录局数,每次游戏自增一次
        }else if((perGame.perFist==1&&compGame.compFist==2)||(perGame.perFist==2&&compGame.compFist==3)||(perGame.perFist==3&&compGame.compFist==1)){
            System.out.println("结果:恭喜,你赢了"); //输出用户赢
        }else{
            System.out.println("结果:抱歉,你输了"); //计算机赢
            compMark++; //记录计算机胜利的次数
        }
        markGame++; //这里记录局数,每次游戏自增一次
    }
}

最后就是main方法然后将所有的类连接起来:

class Demo
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        boolean exit = true; //结束游戏条件
        Person a1 = new Person(); //程序首先执行这里,让玩家起名
        a1.personName();
        Computer b1 = new Computer(); //第二步选择电脑对手名字
        b1.computerGame();
        Game c1 = new Game();  //然后new裁判方法,实现对战和记录游戏得分
        while(true)  //循环,重复游戏
        {
            c1.start(); //裁判方法
            System.out.print("是否开启下一轮(y/n):");
            String temp = input.next(); //上面的c1.start执行完之后就是一次游戏了,然后询问是否继续
            System.out.println("-----------------------");
            exit = "y".equals(temp); //然后判断是否输入y,如果是就继续游戏
            if(exit==false) //如果不是那么进入if里面执行退出游戏的语句
            {
                System.out.println(a1.name+"VS"+b1.name+"\n对战次数:"+c1.markGame);
                System.out.println("最终你的得分为:"+(c1.markGame-c1.compMark-c1.markTie)+"电脑得分为:"+c1.compMark);
                System.out.println("系统退出,谢谢使用");
                break;
            }
        }
    }
}

后记:
这是接触类和对象之后第一次比较大的作业,初次接触类时跟很多人那样,都蒙了,不知道方法该怎么调用。
在同一个类下面的方法,只要有static修饰符修饰的,都可以直接用类名修饰
比如 Demo.aaa();或者直接aaa();,直接调用aaa方法,但是前提是在同一个class下面的静态方法。
如果不是,就需要用实例去调用,比如Demo a1 = new Demo();然后再用a1区调用方法。

猜你喜欢

转载自blog.csdn.net/yzccc/article/details/53200177