猜拳游戏 JAVA代码实现

猜拳游戏

规则

0表示石头,1表示剪刀,2表示布

输入输出

键盘接收游戏局数Tom的出拳情况(0、1、2)
输出显示Tom的每一局输赢情况
所有回合结束后,输出所有回合的输赢情况和用户赢的次数

  • 输入
请输入你要玩的回合数:
3

请出拳(0-石头,1-剪刀,2-布):
1
  • 输出
=======本局情况=======
==0:石头 1:剪刀 2:布==
Tom		电脑		输赢情况		
1		2		你赢了
=======回合一览=======
==0:石头 1:剪刀 2:布==
Tom		电脑		输赢情况		
1		2		你赢了		
1		2		你赢了		
1		1		你俩平局		
=====你总共赢了2局=====

设计思路

  • 有一个用户Tom,设计他的成员变量,成员方法。
  • 电脑可以随机出拳。(随机生成0,1,2)
  • 主类实现游戏流程
  • Customer类实现两个用户(Tom和电脑)的出拳信息

算法流程

  1. 实现主类(MoraGame)的回合数输入
  2. 创建存储信息的变量:二维数组、对象
  3. 实现玩家类(Player)的功能
    • 定义属性:tom、com、winCount
    • 定义方法:
      • tom的出拳(setTom/getTom)
      • com的出拳(setCom/getCom)
      • 输赢判断(judge):并实现获胜回合数的增加
  4. 完善主类功能(游戏流程实现)
    • 循环进行round回合
    • 每一轮回合:
      • 获取玩家出拳并存储至二维数组
      • 获取电脑出拳并存储至二维数组
      • 获取输赢情况并存储至二维数组
      • 对每一局情况进行输出
    • 所有回合结束:对二维遍历输出,并输出获胜的回合数

反思

  • 我主要用一维数组 + 当前回合 + 循环

    这就需要把游戏放在Customer类里去,感觉逻辑上有些漏洞按理来说应该是:主类实现游戏流程,Customer类实现两个用户(Tom和电脑)的出拳信息

    还有就是Customer类中有两个属性是数组类型的,用起来不是很方便,每次都需要传参当前回合数。

  • 老师用的是二维数组 + 循环
    逻辑上是没问题的,有两个地方做了修改,使代码更完善:

    1. 老师用的int型二维数组不能存储输赢情况。
      -> 改为直接采取string型二维数组,一次性存储完毕。只是得把int型的tom、com数据改为string
    2. 原代码局数固定为3局。
      -> 改为键盘输入要玩的回合数。

实现的细节

  • 产生随机数的方法:
Random r = new Random();
int num = r.nextInt(3); //返回0-2的整数随机数(0、1、2)

具体实现

  • 老师写的
public class MoraGame02 {
    public static void main(String[] args) {
        //修正:局数由玩家设定
        System.out.println("请输入你要玩的回合数:");
        Scanner scanner = new Scanner(System.in);
        int round = scanner.nextInt();

        //修正:用String型二维数组,每一局一行,每行3个信息:Tom出拳情况、电脑出拳情况以及输赢情况
        String[][] arr = new String[3][round];
        int i = 0, j = 0;
        
        //创建一个玩家对象
        Player player = new Player();
        for (i = 0; i < round; i++) {
            //获取玩家出拳
            player.setTom();
            int tom = player.getTom();
            arr[i][j] = tom + "";

            //获取电脑出拳
            int com = player.getCom();
            arr[i][j+1] = com + "";

            //获取输赢情况
            String isWin = player.judge();
            arr[i][j+2] = isWin;

            //对每一局情况进行输出
            System.out.println("=======本局情况=======");
            System.out.println("==0:石头 1:剪刀 2:布==");
            System.out.println("Tom\t\t电脑\t\t输赢情况\t\t");
            System.out.println(tom + "\t\t" + com + "\t\t" + isWin);
        }
        //对最终情况输出
        System.out.println("\n\n=======回合一览=======");
        System.out.println("==0:石头 1:剪刀 2:布==");
        System.out.println("Tom\t\t电脑\t\t输赢情况\t\t");
        for (i = 0; i < arr.length; i++) {
            for (j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "\t\t");
            }
            System.out.println();
        }
        System.out.println("=====你总共赢了"+ player.winCount + "局=====");
    }
}


class Player {
    int tom;      		//tom出拳类型
    int com;      		//电脑出拳类型
    int winCount = 0; 	//玩家赢的次数

    //电脑随机出拳
    public int getCom() {
        Random r = new Random();
        com = r.nextInt(3);  //返回0-2的随机数
        return com;
    }
    //设置tom的出拳
    public void setTom() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("\n请出拳(0-石头,1-剪刀,2-布):");
        tom = scanner.nextInt();

        if(tom > 2 || tom < 0){
            //抛出一个异常
            throw new IllegalArgumentException("数字输入错误");
        } else {
            this.tom = tom;
        }
    }
    public int getTom() {
        return tom;
    }

    //比较猜拳的结果
    public String judge() {
        if(tom == 0 && com == 1){
            winCount++;
            return "你赢了";
        } else if(tom == 1 && com == 2) {
            winCount++;
            return "你赢了";
        } else if(tom == 2 && com == 0) {
            winCount++;
            return "你赢了";
        } else if(tom == com) {
            return "你俩平局";
        } else {
            return "电脑赢了";
        }
    }
}
  • 我写的
package com.rxli.chapter07;
import java.util.Scanner;

public class MoraGame {
    public static void main(String[] args) {
        System.out.println("请输入你要玩的回合数:");
        Scanner scanner = new Scanner(System.in);
        //初始化参数
        int round = scanner.nextInt();
        int[] tom = new int[round];
        int[] com = new int[round];
        String[] resultArr = new String[round];
        //创建一个玩家对象
        Customer customer = new Customer(round,tom,com,resultArr);
        //开始游戏
        customer.game();
    }
}

class Customer {
    int round;
    private int[] tom; //Tom出拳信息
    private int[] com; //电脑出拳信息
    private String[] resultArr; //包含所有出拳情况的数组
    int winCount = 0;//记录输赢次数
    //初始化局数和数组
    public Customer(int round, int[] tom, int[] com, String[] resultArr) {
        this.round = round;
        this.tom = tom;
        this.com = com;
        this.resultArr = resultArr;
    }
    //第i+1局Tom出拳记录
    public void setTom(int i){
        int res;
        System.out.println("\n请出拳(0-石头,1-剪刀,2-布):");
        Scanner scanner = new Scanner(System.in);
        while(true){
            res = scanner.nextInt();
            if(res >=0 && res <= 2){
                this.tom[i] = res;
                break;
            } else {
                System.out.println("程序错误:必须输入0、1、2这三者中其中一个数\n请重新输入:");
            }
        }
    }
    //第i+1局电脑出拳记录
    public void setCom(int i){
        com[i] = (int)(Math.random() * 3); //Math.random范围:[0,1),乘以2不能取到2
    }
    //输赢判断
    public void judge(int i){ //i:currentRound
            if(tom[i] == com[i]){ //简写了,如果详细写的话,有9种情况
            System.out.println(tom[i] + "\t\t" + com[i] + "\t\t你俩平局");
            resultArr[i] = tom[i] + "\t\t" + com[i] + "\t\t你俩平局";
        } else if((tom[i] == 0 && com[i] == 1) ||
                  (tom[i] == 2 && com[i] == 0) ||
                  (tom[i] == 1 && com[i] == 2)  ){
            System.out.println(tom[i] + "\t\t" + com[i] + "\t\t你赢了");
            resultArr[i] = tom[i] + "\t\t" + com[i] + "\t\t你赢了";
            winCount++;
        } else {
            System.out.println(tom[i] + "\t\t" + com[i] + "\t\t电脑赢了");
            resultArr[i] = tom[i] + "\t\t" + com[i] + "\t\t电脑赢了";
        }
    }
    //游戏流程
    public void game(){
        //游戏中
        for (int i = 0; i < round; i++) { //进行第i+1轮游戏
            //Tom出拳
            setTom(i);
            //电脑出拳
            setCom(i);
            //本局情况
            System.out.println("=======本局情况=======");
            System.out.println("==0:石头 1:剪刀 2:布==");
            System.out.println("Tom\t\t电脑\t\t输赢\t\t");
            //输赢判断
            judge(i);
        }
        //结束游戏,输出总情况
        System.out.println("\n\n=======回合一览=======");
        System.out.println("==0:石头 1:剪刀 2:布==");
        System.out.println("Tom\t\t电脑\t\t输赢\t\t");
        for(int i = 0;i < round ; i++){
            System.out.println(resultArr[i]);
        }
        System.out.println("=====你总共赢了"+ winCount + "局=====");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值