Java-猜拳游戏

本文介绍了Java中基本数据类型与引用数据类型在使用`==`和`equals()`方法时的区别,并展示了如何从用户输入转换整数。接着,提供了一个猜拳游戏的实现,包括游戏逻辑和结果判断,以及Boolean类型的真值转换规则。文章通过实例代码加深了对Java编程和条件判断的理解。
摘要由CSDN通过智能技术生成

猜拳游戏

抛砖引玉

我们先来掌握一个知识点

Java中 == 和 equalse()的区别

  1. Java中数据类型有两种:基本数据类型和引用数据类型

基本数据类型的值存储在内存的栈中;引用数据类型栈中存储的是对象的地址,该地址指向的堆中内存空间存储的才是我们需要的内容,比如对象存储在内存的堆中。

  1. 关于==:

比较的是内存地址。当比较的是基本数据类型变量时,判断它们是否来自同一个内存地址,由于基本类型变量值是存储在栈里面的,当两个变量有同一个值时,其实它们只用到了一个内存空间,所以比较的结果是true。
比较的是引用数据类型变量时,判断的也是内存地址,如果两个引用的地址信息相同,指向的就是同一个对象,得到的结果就是true。
例如:
例子1:
String s1 = “123”;
String s2 = “123”;
s1s2 值为true
例子2:
String s1 = “123”;
String s2 = new String(“123”);
s1
s2 的结果是false

例子1中:java中有字符串缓冲池的概念,通俗的说,就是程序在运行的时候会创建一个字符串缓冲池,里面放了字符串对象,在声明String变量的时候,程序首先会在这个String缓冲池中寻找相同的对象,如果有相同对象,就将已有的地址赋值给引用;如果没有就创建新的内存地址,因此缓冲池里原来有的字符串的那个变量和新申请的变量,其实指向的是同一个内存空间。因此例子1里面s1和s2用到的都是同一个内存空间的“123”。所以此时==的结果是true。
例子2中:由于s2用new 关键字重写申请了空间,没有用到缓冲池里的原有的变量,所以它们内存地址不相同,所以结果为false。

  1. 关于equalse()

equalse()方法是Object类的基本方法之一,在Object类中的equalse()方法是对两个对象的地址值进行比较的,但是当String、Math、Integer等封装类在使用equalse()方法是已经覆盖了Object类的equalse()方法,所以每个类都有自己的equalse()方法,是比较两个对象的内容是否一样。所以上面的例子如果换成是equalse()比较的话,结果都true。

我们在来掌握一个知识点

将用户输入的数字与随机生成的数字进行比较

我的任务是创建一个随机生成的数字,要求用户输入一个数字,然后比较两者并显示一个消息框,告诉他们是否匹配。到目前为止,这是我的代码…

import javax.swing.*; //GUI 组件

public class RandomGuessMatch
{
public static void main(String[] args)
{
Integer random = (1 + (int)(Math.random() * 5)),userNum;

    // 获取输入
    userNum = JOptionPane.showInputDialog("输入一个数字 1 - 5.");

    // 检查数字是否匹配
    boolean matches = (random == userNum);
    JOptionPane.showMessageDialog(null, "这个随机数是 " + random + ". " + "它匹配吗? " + matches);
}

}

我遇到的唯一错误是当我试图获取用户输入时。 “无法从String转换为Integer”。但是,我无法弄清楚如何获取用户的号码并将其与“userNum”相关联,以便我可以将其与“随机”进行比较。

1.可以通过解析将字符串转换为整数。
int x = Integer.parseInt(“1”);
请注意,如果String为NaN
,则会抛出异常
2.
JOptionPane的showInputDialog方法返回String。你可以做的是使用结果字符串作为Integer类的构造函数中的参数:
userNum = new Integer(JOptionPane.showInputDialog(“Enter a number 1 - 5.”));
此外,由于您使用的是Integer对象,因此必须使用equals方法对它们进行比较:
boolean matches = random.equals(userNum);
3.
需要使用
将字符串响应强制转换为整数
Integer.parseInt(userChoice)
4.
可以通过这种方式获得输入:
userNum = Integer.getInteger(JOptionPane.showInputDialog(“Enter a number 1 - 5.”));
稍后您可以进行一些输入验证以防止非整数输入。
5.
ShowInputDialog will return a String。因此,您将其值放入的变量也必须具有String类型。
尝试创建一个名为" userInput"的变量。并将用户输入的值放在那里。然后你可以说
userNum = Integer.valueOf(userInput);
从那里,使用" userNum.equals(随机)"比较两个整数。 double equals运算符只适用于int类型,而不是Integers。
6.
如果您读取用户输入它是一个String,那么您必须将userNum声明为String而不是Integer。
String userNum;
下一步是将随机数与字符串进行比较。要做到这一点,你需要Integer.valueOf(String s)方法,因此它们都是Integer值:
boolean matches = (random == Integer.valueOf(userNum));

我们可以用第二条(已过期)解决当前问题

import javax.swing.*; //GUI components组件

public class RandomGuessMatch
{
public static void main(String[] args)
{
Integer random = (1 + (int) (Math.random() * 5)),userNum;

    // 获取匹配
    userNum = new Integer(JOptionPane.showInputDialog("输入一个数字 1 - 5."));

    // 检查数字是否匹配
    // boolean matches = (random == userNum);
    boolean matches = random.equals(userNum);
    JOptionPane.showMessageDialog(null, "这个随机数是 " + random + ". " + "它匹配吗? " + matches);
}

}

我们看效果:
在这里插入图片描述

在这里插入图片描述

我们继续掌握一个知识点

Boolean数据类型以及判断true和false

Boolean数据类型

有两个值:true和false
Boolean()函数可以将任何数据类型转化为boolean类型
boolean数据类型

转化为true  true
转化为false  false

String数据类型

转化为true  任何非空字符串
转化为false  “ ”(非空字符串)

Number数据类型

转化为true  任何非0数字
转化为false  0和NaN

Object数据类型

转化为true  任何对象
转化为false  null

undefined数据类型

转化为true 无
转化为false  undefined

在做if判断的时候的 真 和 假

假(6):false、空字符串、0、null、undefined、NaN
在做运算判断时

在这里插入图片描述
运算符 + - * / %


import java.util.Random;
import java.util.Scanner;

/*
    请编写一个猜拳游戏

    有个人 Tom 设计他的成员变量,成员方法,可以电脑猜拳
    电脑每次都会随机生成 0,1,2
    0 —— 石头
    1 —— 剪刀
    2 —— 布

    并要可以显示 Tom 的输赢次数
*/
public class MoraGame 
{
    //测试
    public static void main(String[] args) 
    {
        // 创建一个玩家对象
        Tom t = new Tom();

        // 用来记录最后的输赢次数
        byte isWinCount = 0;

        // 创建二维数组,用来接收局数,Tom 出拳情况以及电脑出拳情况
        byte[][] arrone = new byte[3][3];
        byte j = 0;

        // 创建一个一维数组,用来接收输赢情况
        String[] arrtwo = new String[3];

        Scanner scanner = new Scanner(System.in);
        for(byte i=0;i<3;i++)
        {
            // 获取玩家出的拳
            System.out.println("请输出你要出的拳  0 —— 石头   1 —— 剪刀   2 —— 布");
            byte num = (byte)scanner.nextInt();  // 接收客户端从键盘的输入
            t.setTomGuessNum(num);  // 调用 Tom 类中的方法及传参
            byte tomGuess = t.getTomGuessNum();    // 调用 Tom 类中的方法以及接收当前客户端在键盘的输入
            arrone[i][j + 1] = tomGuess;

            // 获取电脑出拳
            byte comGuess = (byte)t.computerNum();
            arrone[i][j + 2] = comGuess;

            // 将玩家猜的拳与电脑做比较
            String isWin = t.vsComString();
            arrtwo[i] = isWin;
            arrone[i][j] = t.count;

            // 对每一局的情况进行输出
            System.out.println("============================");
            System.out.println("局数\t玩家的出拳\t电脑的出拳\t输赢情况");
            System.out.println(t.count + "\t" + tomGuess + "\t\t" + comGuess + "\t\t" + arrtwo[i]);
            System.out.println("============================");
            System.out.println("\n\n");
            isWinCount = t.winCount(isWin);
        }
        
        // 对游戏的最终结果进行输出
        System.out.println("局数\t    玩家的出拳\t    电脑的出拳\t\t输赢情况");
        for(byte a=0;a<arrone.length;a++)
        {
            for (byte b = 0; b < arrone[a].length; b++) 
            {
                System.out.print(" "+arrone[a][b] + "\t\t");
            }
            System.out.println(arrtwo[a]);
            // System.out.println();
        }
        System.out.println("您赢了" + isWinCount + "次");
    }
}

// Tom 类
class Tom   // 核心代码
{
    // 玩家出拳的类型
    byte tomGuessNum;

    // 电脑出拳的类型
    byte comGuessNum;

    // 玩家赢的次数
    byte winCountNum;

    // 比赛的次数
    byte count = 1;

    public void showInfo()
    {
        // ...
    }
    
    /*
     * 电脑随机生成猜拳定数字方法
     * @return
     */

    public int computerNum()
    {
        Random r = new Random();
        comGuessNum = (byte) r.nextInt(3); // 方法  返回 0-2 的随机数
        // System.out.println("电脑的随机"+comGuessNum);
        return comGuessNum;
    }
    
    /*
     * 设置玩家猜拳的数字方法
     * @param tomGuessNum
     */
    public void setTomGuessNum(byte tomGuessNum)
    {
        if(tomGuessNum>2||tomGuessNum<0)
        {
            // 抛出一个异常 未处理
            // throw new IllegalArgumentException("数字输入错误");
            System.out.println("数字输入错误");
        }
        this.tomGuessNum = tomGuessNum;
    }
    
    public byte getTomGuessNum()
    {
        return tomGuessNum;
    }

    /**
     * 比较猜拳定结果
     * @return 玩家赢返回true,否则返回 false 
     */

    public String vsComString()
    {
        // 比较巧
        if(tomGuessNum==0&&comGuessNum==1)
        {
            return "您赢了";
        }
        else if(tomGuessNum==1&&comGuessNum==2)
        {
            return "您赢了";
        }
        else if(tomGuessNum==2&&comGuessNum==0)
        {
            return "您赢了";
        }
        else if(tomGuessNum==comGuessNum)
        {
            return "平手";
        }
        else 
        {
            return "您输了";
        }
    }
    
    /*
     * 记录玩家赢的次数
     * @return
     */

    public byte winCount(String s)
    {
        count++;
        if(s.equals("您赢了"))
        {
            winCountNum++;
        }
        return winCountNum;
    }
}

看效果:

在这里插入图片描述
达到预期

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值