05 Java代码实现一个小游戏(剪刀石头布)和一个简易的万年历

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 05 Java代码实现一个小游戏(剪刀石头布)和一个简易的万年历

石头剪刀布游戏仅仅使用switch语句

万年历-仅仅使用方法调用和for循环

一个小游戏和一个简单的万年历的代码实现

5.1 一个简单的剪刀石头布小游戏
5.1.1 需求:实现以下界面
************************************************************
欢迎XXX进入猜拳游戏
1.石头 2.剪刀 3.布 0.退出
************************************************************
请输入数字:
/*
此时等待用户输入数字,每个数字代表不同的效果,整个程序只有当用户输入0时才可以退出 否则不允许停止程
序,当用户输入
1-3之间某个数字的时候,需要和电脑系统AI进行猜拳对比,并对用户输出反馈效果
查看如果做 1~3之间数据获取操作
*/
************************************************************
欢迎XXX进入猜拳游戏
1.石头 2.剪刀 3.布 0.退出
************************************************************
请输入数字:
1
如果赢了 提示 恭喜你赢了
如果输了 提示 你输了
如果平局 提示 平局再来
//输入提示语句之后 需要再次显示 以下界面
************************************************************
欢迎XXX进入猜拳游戏
1.石头 2.剪刀 3.布 0.退出
************************************************************
请输入数字:
/*
当用户输入0是,猜拳游戏结束,输出以下界面,需要打印谁玩的,完了多少局,赢了多少场,胜率是多少
*/
排行榜
******************************************************************
姓名 总局数 赢场 胜率
XXX 0 0 xx%
5.1.2 代码实现
  1. 提供程序必要的一些信息(记录游戏总局数,胜场数,储存玩家输入的数据,储存电脑输入的数据)
  2. 编写游戏核心(输出游戏界面,接受玩家输入数据,判断输赢)
  3. 注意输赢条件判断
package Case.Java;

import java.util.Scanner;

/**
 * @author yinying
 * @date 2023/1/8 13:49
 */
public class RockPaperScissors {
    public static void main(String[] args) {
        //1.提供程序必要的一些信息
        Scanner input = new Scanner(System.in);
        int STotal = 0;// 记录游戏的总局数
        int SVictory = 0;//记录胜场
        int player_choose = 0;//存储玩家输入的数据
        int computer_choose = 0;//存储电脑输入的数据
        //2.编写游戏核心
        while (true){
            //打印输出的游戏界面
            System.out.println(" ************************************************************");
            System.out.println("欢迎进入猜拳游戏");
            System.out.println("1石头 2.剪刀 3.布 0.退出");
            System.out.println(" ************************************************************");
            System.out.println("请输入数字:");
            //接受用户输入数据
            player_choose = input.nextInt();
            //提供判断操作,因为用户输入0的时候退出程序
            if (player_choose == 0){
                //退出游戏打印排行榜界面
                System.out.println("\t\t\t\t\t\t\t\t\t\t排行榜");
                System.out.println("************************************************************");
                System.out.println("姓名"+"\t\t\t总局数"+"\t\t\t赢场"+"\t\t\t胜率");
                System.out.println("大宝"+"\t\t\t"+STotal+"\t\t\t"+SVictory+"\t\t\t"+ (((((double)SVictory)/((double)STotal)))*100)+"%");
                break;//结束死循环让程序结束
            }
            //如果玩家输入的不是0,证明玩家输入应该是【1,2,3】中间的一个值,所以总局数要+1
            STotal++;
            /*
            模拟电脑出拳  使用1,2,3 代表 石头、剪刀和布,模拟电脑出拳也应该是【1,2,3】之间的一个值
            Java中提供一个操作---随机数---工具类Math这个类中提供了一个方法random
            random这个方法可以得到一个随机数据,但是这个随机数的初始范围是[0,1) 左闭右开区间 包括0,但是不包括1
            [0,3)+1-->[0+1,3+1)--->[1,4) -->范围 得到1~3之间但是不包含4
             */
            computer_choose = ((int)Math.random()*3+1);
            //
            switch (computer_choose){
                case 1:
                    System.out.println("电脑出拳是:石头");
                    break;
                case 2:
                    System.out.println("电脑出拳是:剪刀");
                    break;
                case 3:
                    System.out.println("电脑出拳是:布");
                    break;
            }
            /*
            如何判断输赢?
            明确:玩家使用数字代表 石头、剪刀和布 【每一个出拳都是一个数字】
            胜利条件 石头> 剪刀 剪刀>布 布> 石头
            又因为输入都是数字,所以使用玩家输入数字与电脑所产生数据计算差值
                    1-2 = -1 2-3 = -1 3-1 = 2
            只要计算差值得到-1和2就可以得到胜利
            平局条件 石头 == 石头 剪刀 == 剪刀 布 == 布
            又因为输入都是数字,所以使用玩家输入数字与电脑所产生数据计算差值
                    1-1 =0 2-2 =0 3-3 =0
            只要计算差值得到0就是平局
            现在胜利条件也出现,平局条件也出现,剩余条件就是失败
             */
            int win = player_choose-computer_choose;
            switch (win){
                case - 1:
                case 2:
                    System.out.println("恭喜,你赢了!!! (#^.^#)");
                    System.out.println("");//没有特殊意义就是好看
                    //胜场+1
                    SVictory++;
                    break;
                case 0:
                    System.out.println("平局,再来啊!!!!(*^▽^*)");
                    System.out.println();
                    break;
                default:
                    System.out.println("你输了,还敢再来吗?O(∩_∩)O哈哈~");
                    System.out.println();
                    break;
            }
        }
    }

}

5.1.2 代码实现
  1. 提供程序必要的一些信息(记录游戏总局数,胜场数,储存玩家输入的数据,储存电脑输入的数据)
  2. 编写游戏核心(输出游戏界面,接受玩家输入数据,判断输赢)
  3. 注意输赢条件判断
package Case.Java;

import java.util.Scanner;

/**
 * @author yinying
 * @date 2023/1/8 13:49
 */
public class RockPaperScissors {
    public static void main(String[] args) {
        //1.提供程序必要的一些信息
        Scanner input = new Scanner(System.in);
        int STotal = 0;// 记录游戏的总局数
        int SVictory = 0;//记录胜场
        int player_choose = 0;//存储玩家输入的数据
        int computer_choose = 0;//存储电脑输入的数据
        //2.编写游戏核心
        while (true){
            //打印输出的游戏界面
            System.out.println(" ************************************************************");
            System.out.println("欢迎进入猜拳游戏");
            System.out.println("1石头 2.剪刀 3.布 0.退出");
            System.out.println(" ************************************************************");
            System.out.println("请输入数字:");
            //接受用户输入数据
            player_choose = input.nextInt();
            //提供判断操作,因为用户输入0的时候退出程序
            if (player_choose == 0){
                //退出游戏打印排行榜界面
                System.out.println("\t\t\t\t\t\t\t\t\t\t排行榜");
                System.out.println("************************************************************");
                System.out.println("姓名"+"\t\t\t总局数"+"\t\t\t赢场"+"\t\t\t胜率");
                System.out.println("大宝"+"\t\t\t"+STotal+"\t\t\t"+SVictory+"\t\t\t"+ (((((double)SVictory)/((double)STotal)))*100)+"%");
                break;//结束死循环让程序结束
            }
            //如果玩家输入的不是0,证明玩家输入应该是【1,2,3】中间的一个值,所以总局数要+1
            STotal++;
            /*
            模拟电脑出拳  使用1,2,3 代表 石头、剪刀和布,模拟电脑出拳也应该是【1,2,3】之间的一个值
            Java中提供一个操作---随机数---工具类Math这个类中提供了一个方法random
            random这个方法可以得到一个随机数据,但是这个随机数的初始范围是[0,1) 左闭右开区间 包括0,但是不包括1
            [0,3)+1-->[0+1,3+1)--->[1,4) -->范围 得到1~3之间但是不包含4
             */
            computer_choose = ((int)Math.random()*3+1);
            //
            switch (computer_choose){
                case 1:
                    System.out.println("电脑出拳是:石头");
                    break;
                case 2:
                    System.out.println("电脑出拳是:剪刀");
                    break;
                case 3:
                    System.out.println("电脑出拳是:布");
                    break;
            }
            /*
            如何判断输赢?
            明确:玩家使用数字代表 石头、剪刀和布 【每一个出拳都是一个数字】
            胜利条件 石头> 剪刀 剪刀>布 布> 石头
            又因为输入都是数字,所以使用玩家输入数字与电脑所产生数据计算差值
                    1-2 = -1 2-3 = -1 3-1 = 2
            只要计算差值得到-1和2就可以得到胜利
            平局条件 石头 == 石头 剪刀 == 剪刀 布 == 布
            又因为输入都是数字,所以使用玩家输入数字与电脑所产生数据计算差值
                    1-1 =0 2-2 =0 3-3 =0
            只要计算差值得到0就是平局
            现在胜利条件也出现,平局条件也出现,剩余条件就是失败
             */
            int win = player_choose-computer_choose;
            switch (win){
                case - 1:
                case 2:
                    System.out.println("恭喜,你赢了!!! (#^.^#)");
                    System.out.println("");//没有特殊意义就是好看
                    //胜场+1
                    SVictory++;
                    break;
                case 0:
                    System.out.println("平局,再来啊!!!!(*^▽^*)");
                    System.out.println();
                    break;
                default:
                    System.out.println("你输了,还敢再来吗?O(∩_∩)O哈哈~");
                    System.out.println();
                    break;
            }
        }
    }

}

5.2 万年历
5.2.1 需求 输入年份和月份,输出简单的万年历日历,如下
输入2022年1月
输出:

星期⽇ 星期⼀ 星期⼆ 星期三 星期四 星期五 星期六   
1   2   3   4   5   6   7   
8   9   10    11    12    13    14    
15    16    17    18    19    20    21    
22    23    24    25    26    27    28    
29    30    31  
5.2.2 代码实现
  1. 输出提示语句,并接受⽤户输⼊的年,⽉
  2. 计算总天数
  3. 计算星期
  4. 格式化日历输出
  • 打印格式表头
  • 输出年份(需要注意是否是闰年)、月份、天数
package Case.Java;

import java.util.Scanner;

/**
 * @author:yinying
 * @date 2023/1/8 17:22
 */
public class PerpetualCalendar {
    public static void main(String[] args) {
        //1.先输出提示语句,并接受⽤户输⼊的年,⽉
        Scanner input = new Scanner(System.in);
        System.out.println("请输⼊年:");
        int year = input.nextInt();
        System.out.println("请输⼊⽉:");
        int month = input.nextInt();
        //2.计算总天数
        int totalDaysY = getFormNowYearTo1900TotalDays(year);
        int totalDaysM = getNowYearToDays(year, month);
        //3.计算星期(对7求余 得到的记过就是0~6 0就是星期⽇ 1-6分别对应星期⼀到星期六)
        int week = (totalDaysM+totalDaysY+1)%7;
        //4.格式化打印⽇历
        FormatCalendar(week, year, month);
    }
    /**
     * 格式化日历输出
     * @param week 星期数
     * @param year 年份
     * @param month ⽉份
     */
    public static void FormatCalendar(int week,int year,int month) {
        //计数统计
        int cut = 0;
        //打印表头
        System.out.println("星期⽇\t星期⼀\t星期⼆\t星期三\t星期四\t星期五\t星期六\t\t");
        //计算⽉份第⼀天是星期⼏(空格的位置)
        for(int i = 1 ;i<=week;i++) {
            System.out.print("\t\t");
            cut++;//计数
        }
        //通过获取⽉份对应天数,计算打印出⽇历表中天数
        for(int i =1;i<=getNowMonthDays(year, month);i++) {
            //输出天数结果
            System.out.print(i+"\t\t");
            cut++;//计数
            //这个计数的作⽤就在这⾥了,根据给的图⽚可以发现每⼀⾏打印的内容是7个,也就是逢7换⾏,所以只要能整除开7就换⾏
            if(cut%7 == 0) {
                System.out.println();
            }
        }
    }
    /**
     *  判断是否是润年
     *  @param year 年份
     *  @return true 是闰年 false 那不是闰年
     */
    public static boolean isLeapYear(int year) {
        return (year%4==0 && year%100!=0)||(year%400==0);
    }
    /**
     *  根据⽤户输⼊的⽉份来判断对应⽉份的天数
     *  @param year 年份
     *  @param month ⽉份
     *  @return 返回对应的天数
     */
    public static int getNowMonthDays(int year,int month) {
        switch(month) {
            case 2:
                return isLeapYear(year) ? 29 : 28;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
            default:
                return 31;
        }
    }
    /**
     * 计算距离1900年1⽉1⽇的总天数
     * @param year 年份
     * @return 总天数
     */
    public static int getFormNowYearTo1900TotalDays(int year) {
        //定义变量存储总天数
        int sum = 0;
        for(int i = 1900 ;i<year;i++) {
            sum += isLeapYear(i) ? 366 : 365;
        }
        return sum;
    }
    /**
     * 计算输⼊⽉份到当前年份1⽉1⽇的总天数
     * @param year 年份
     * @param month ⽉份
     * @return 距离当前年份1⽉1⽇的总天数
     */
    public static int getNowYearToDays(int year,int month) {
        //定义变量存储总天数
        int totalDays = 0;
        //计算距离1⽉1⽇的总天数
        for(int i = 1; i<month;i++) {
            totalDays += getNowMonthDays(year, i);
        }
        return totalDays;
    }
}

实现效果如下

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
12天前
|
Kubernetes jenkins 持续交付
从代码到k8s部署应有尽有系列-java源码之String详解
本文详细介绍了一个基于 `gitlab + jenkins + harbor + k8s` 的自动化部署环境搭建流程。其中,`gitlab` 用于代码托管和 CI,`jenkins` 负责 CD 发布,`harbor` 作为镜像仓库,而 `k8s` 则用于运行服务。文章具体介绍了每项工具的部署步骤,并提供了详细的配置信息和示例代码。此外,还特别指出中间件(如 MySQL、Redis 等)应部署在 K8s 之外,以确保服务稳定性和独立性。通过本文,读者可以学习如何在本地环境中搭建一套完整的自动化部署系统。
38 0
|
5天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
29 11
|
3天前
|
并行计算 Java 开发者
探索Java中的Lambda表达式:简化代码,提升效率
Lambda表达式在Java 8中引入,旨在简化集合操作和并行计算。本文将通过浅显易懂的语言,带你了解Lambda表达式的基本概念、语法结构,并通过实例展示如何在Java项目中应用Lambda表达式来优化代码,提高开发效率。我们将一起探讨这一现代编程工具如何改变我们的Java编码方式,并思考它对程序设计哲学的影响。
|
3天前
|
安全 Java 测试技术
掌握Java的并发编程:解锁高效代码的秘密
在Java的世界里,并发编程就像是一场精妙的舞蹈,需要精准的步伐和和谐的节奏。本文将带你走进Java并发的世界,从基础概念到高级技巧,一步步揭示如何编写高效、稳定的并发代码。让我们一起探索线程池的奥秘、同步机制的智慧,以及避免常见陷阱的策略。
|
13天前
|
Java Devops 持续交付
探索Java中的Lambda表达式:简化代码,提升效率DevOps实践:持续集成与部署的自动化之路
【8月更文挑战第30天】本文深入探讨了Java 8中引入的Lambda表达式如何改变了我们编写和管理代码的方式。通过简化代码结构,提高开发效率,Lambda表达式已成为现代Java开发不可或缺的一部分。文章将通过实际例子展示Lambda表达式的强大功能和优雅用法。
|
13天前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
25 5
|
10天前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
10 1
|
13天前
|
Java
java代码和详细的代码应用
代码块分为局部、构造、静态和同步代码块。局部代码块控制变量生命周期,例如 `int a` 只在特定代码块内有效。构造代码块用于创建对象时执行附加功能,避免构造方法中代码重复。静态代码块随类加载执行一次,常用于初始化操作。同步代码块确保多线程环境下方法执行的原子性,通过 `synchronized` 关键字实现。
22 3
|
13天前
|
设计模式 算法 Java
【揭秘】如何巧妙运用Java模板方法模式,让你的代码优雅升级?
【8月更文挑战第30天】模板方法模式是一种行为型设计模式,它定义了算法的骨架并将某些步骤延迟到子类中,使子类能在不改变算法结构的情况下重定义特定步骤。此模式适用于具有共同结构但细节不同的场景,如角色升级系统。通过定义一个抽象类 `Character` 包含模板方法 `levelUp` 和抽象步骤方法,子类如 `Warrior` 和 `Mage` 可以实现具体逻辑。这种方式提供了良好的扩展性,确保算法结构不变,同时保持系统的稳定性和一致性,在数据处理和业务流程管理中广泛应用。
35 2
|
12天前
|
Java
Java中的Lambda表达式:简化代码,提升效率
【8月更文挑战第31天】Lambda表达式在Java 8中引入,旨在使代码更加简洁和易读。本文将探讨Lambda表达式的基本概念、使用场景及如何通过Lambda表达式优化Java代码。我们将通过实际示例来展示Lambda表达式的用法和优势,帮助读者更好地理解和应用这一特性。