适合Java初学者练手的几个Java小程序(完整可运行)

数字炸弹小游戏

都玩过的,想一个数字,比如0-100以内,别人去猜,然后说大了还是小了。

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

public class NumberBombGame {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入数字范围
        System.out.println("请输入数字范围:");
        int rangeStart = scanner.nextInt(); // 范围开始
        int rangeEnd = scanner.nextInt(); // 范围结束

        // 输入玩家名称和数量
        System.out.println("请输入玩家数量:");
        int playerNum = scanner.nextInt();
        scanner.nextLine(); // 需要在nextInt()之后使用nextLine()换行符才能读取正常名称

        // 初始化玩家分数
        Map<String, Integer> playerScores = new HashMap<>();
        for (int i = 1; i <= playerNum; i++) {
            System.out.println("请输入玩家" + i + "的名称:");
            String playerName = scanner.nextLine();
            playerScores.put(playerName, 0);
        }

        // 随机生成一个数字
        Random random = new Random();
        int targetNum = random.nextInt(rangeEnd - rangeStart + 1) + rangeStart;

        // 循环让每个玩家循环输入猜测的数字
        boolean isGameEnded = false;
        while (!isGameEnded) {
            for (String playerName : playerScores.keySet()) {
                System.out.println(playerName + ",请猜测一个数字:");
                int guessNum = scanner.nextInt(); // 玩家猜测的数字

                if (guessNum == targetNum) { // 如果猜对了,该玩家得分加 1,游戏结束
                    playerScores.put(playerName, playerScores.get(playerName) + 1);
                    isGameEnded = true;
                    break; // 跳出循环
                } else { // 猜错了,输出提示信息
                    String hint = guessNum < targetNum ? "小了" : "大了";
                    System.out.println("猜错了," + hint + "!");
                }
            }
        }

        // 输出每个玩家的分数
        System.out.println("游戏结束!");
        for (String playerName : playerScores.keySet()) {
            System.out.println(playerName + "得分:" + playerScores.get(playerName));
        }
    }
}

测试运行情况

请输入数字范围:
0 20
请输入玩家数量:
2
请输入玩家1的名称:
老王
请输入玩家2的名称:
老李
老李,请猜测一个数字:
10
猜错了,大了!
老王,请猜测一个数字:
5
猜错了,大了!
老李,请猜测一个数字:
1
猜错了,小了!
老王,请猜测一个数字:
3
游戏结束!
老李得分:0
老王得分:1

通过以上代码,我们可以学到以下知识点:

  1. 如何使用 Scanner 类从控制台读取输入,包括基本数据类型和字符串类型。
  2. 如何使用 Random 类产生随机数。
  3. 如何使用 Map 类来保存玩家的得分。
  4. 如何使用 while 循环和 break 语句实现循环猜测和游戏结束的判断。
  5. 如何使用条件语句来实现猜错了的提示和猜对了的得分计算。
  6. 如何使用循环来读取多个玩家的输入。
  7. 如何在程序中进行基本的输入输出处理。

掷骰子游戏

游戏规则

  1. 三个六面骰子,每个骰子点数为:1,2,3,4,5,6;
  2. 三个骰子数加起来,1-10为小,11-18为大;
  3. 大和小分值1分
  4. 如果三个骰子的数值一样,就称为豹子,豹子18分
  5. 猜对了就加分,猜错了就扣分
import java.util.Random;
import java.util.Scanner;

public class DiceGame {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int maxRound = 3; // 最大游戏轮数
        int totalScore = 0; // 总得分
        Random random = new Random();

        // 游戏开始
        System.out.println("欢迎来到掷骰子游戏!");

        // 循环猜测,最多进行三轮游戏
        for (int round = 1; round <= maxRound; round++) {
            System.out.println("第" + round + "轮游戏开始!");

            // 玩家选择猜测的类别
            System.out.println("请选择猜测的类别:1.小(1-10) 2.大(11-18) 3.豹子");
            int category = scanner.nextInt();
            while (category < 1 || category > 3) {
                System.out.println("输入错误,请重新选择猜测的类别:1.小(1-10) 2.大(11-18) 3.豹子");
                category = scanner.nextInt();
            }

            // 投掷骰子
            int dice1 = random.nextInt(6) + 1;
            int dice2 = random.nextInt(6) + 1;
            int dice3 = random.nextInt(6) + 1;
            int sum = dice1 + dice2 + dice3;
            System.out.println("三个骰子的点数分别为:" + dice1 + "," + dice2 + "," + dice3);

            // 判断猜测是否正确
            int roundScore = 0; // 本轮得分
            if (category == 1 && sum >= 1 && sum <= 10) { // 猜小
                System.out.println("猜小!");
                roundScore = 1;
            } else if (category == 2 && sum >= 11 && sum <= 18) { // 猜大
                System.out.println("猜大!");
                roundScore = 1;
            } else if (category == 3 && dice1 == dice2 && dice2 == dice3) { // 豹子
                System.out.println("猜中豹子,恭喜获得18分!");
                roundScore = 18;
            } else {
                System.out.println("猜错了!");
                if (category == 3) { // 豹子猜错扣18分
                    roundScore = -18;
                } else {
                    roundScore = -1; // 其他猜错扣1分
                }
            }

            // 累加本轮得分和总得分
            totalScore += roundScore;

            // 输出本轮得分和总得分
            System.out.println("本轮得分为:" + roundScore);
            System.out.println("总得分为:" + totalScore);

            // 询问是否继续游戏
            if (round == maxRound) {
                break;
            }
            System.out.println("是否继续游戏?(1.是 / 2.否)");
            int reply;
            do {
                reply = scanner.nextInt();
            } while (reply != 1 && reply != 2);
            if (reply == 2) {
                break;
            }
        }

        // 输出最终得分
        System.out.println("游戏结束!你的最终得分总计为:" + totalScore);
    }
}

测试运行结果

欢迎来到掷骰子游戏!
第1轮游戏开始!
请选择猜测的类别:1.小(1-10) 2.大(11-18) 3.豹子
1
三个骰子的点数分别为:6,4,1
猜错了!
本轮得分为:-1
总得分为:-1
是否继续游戏?(1.是 / 2.否)
1
第2轮游戏开始!
请选择猜测的类别:1.小(1-10) 2.大(11-18) 3.豹子
1
三个骰子的点数分别为:5,5,1
猜错了!
本轮得分为:-1
总得分为:-2
是否继续游戏?(1.是 / 2.否)
1
第3轮游戏开始!
请选择猜测的类别:1.小(1-10) 2.大(11-18) 3.豹子
3
三个骰子的点数分别为:3,6,1
猜错了!
本轮得分为:-18
总得分为:-20
游戏结束!你的最终得分总计为:-20

通过以上代码,可以学到以下知识:

  • 循环结构:使用for循环来实现游戏的多轮进行,以及使用while循环来保证玩家输入正确的猜测类别。

  • 条件分支结构:使用if-else分支结构来根据玩家的猜测类别和投掷骰子的结果来判断是否猜中,从而奖励或扣除相应的分数。

  • 随机数生成:使用Java的Random类来生成随机数,以实现掷骰子的效果。

  • 输入输出:使用Java的Scanner类来进行输入、使用System.out.println()方法来进行输出。

  • 数值类型:将投掷骰子得到的点数以及玩家的得分定义为int类型,以存储整数数值。

简单记账程序

一个很简单的记账程序,包括以下功能:

  • 输入 1 可以输入金额,并记录日期。
  • 输入 2 可以显示所有记录,包括日期和金额。
  • 输入 3 可以按照金额从大到小排序,并显示所有记录,包括日期和金额。
  • 输入 4 可以显示所有金额之和。
  • 输入 q 可以退出程序。
import java.math.BigDecimal;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * 记账程序
 */
public class AccountingProgram {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<AccountingRecord> records = new ArrayList<>();

        while (true) {
            // 打印选项菜单
            System.out.println("\n请选择操作(输入选项前的数字):");
            System.out.println("1. 输入金额");
            System.out.println("2. 显示所有记录");
            System.out.println("3. 按照金额排序显示");
            System.out.println("4. 显示金额之和");
            System.out.println("q. 退出程序");

            String input = scanner.nextLine();

            if (input.equals("1")) {
                System.out.println("请输入金额(小数点后最多两位):");
                BigDecimal amount = scanner.nextBigDecimal();
                scanner.nextLine();
                AccountingRecord record = new AccountingRecord(amount, LocalTime.now());
                records.add(record);

                // 打印成功消息
                System.out.println("记录已添加!");
            } else if (input.equals("2")) {
                if (records.isEmpty()) {
                    // 打印无记录提示
                    System.out.println("无记录!");
                } else {
                    // 打印所有记录
                    System.out.println("所有记录:");
                    for (AccountingRecord record : records) {
                        System.out.println(record.formatToString());
                    }
                }
            } else if (input.equals("3")) {
                if (records.isEmpty()) {
                    // 打印无记录提示
                    System.out.println("无记录!");
                } else {
                    // 将记录按照金额排序
                    Collections.sort(records, Comparator.comparing(AccountingRecord::getAmount).reversed());

                    // 打印排序后的所有记录
                    System.out.println("所有记录(按照金额排序):");
                    for (AccountingRecord record : records) {
                        System.out.println(record.formatToString());
                    }
                }
            } else if (input.equals("4")) {
                if (records.isEmpty()) {
                    // 打印无记录提示
                    System.out.println("无记录!");
                } else {
                    // 计算所有金额之和
                    BigDecimal sum = BigDecimal.ZERO;
                    for (AccountingRecord record : records) {
                        sum = sum.add(record.getAmount());
                    }

                    // 打印金额之和
                    System.out.println("金额之和为:" + sum.setScale(2, BigDecimal.ROUND_HALF_UP));
                }
            } else if (input.equalsIgnoreCase("q")) {
                // 退出程序
                break;
            } else {
                // 打印无效输入提示
                System.out.println("无效的输入,请重新输入!");
            }
        }

        // 打印退出程序消息
        System.out.println("程序已退出!");
    }
}

/**
 * 记录类
 */
class AccountingRecord {
    private BigDecimal amount; // 金额
    private LocalTime time; // 记录时间

    public AccountingRecord(BigDecimal amount, LocalTime time) {
        this.amount = amount;
        this.time = time;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public LocalTime getTime() {
        return time;
    }

    /**
     * 格式化为字符串
     */
    public String formatToString() {
        String formattedTime = time.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
        String formattedAmount = amount.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
        return String.format("时间:%s,金额:%s", formattedTime, formattedAmount);
    }
}

运行打印结果

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
请输入金额(小数点后最多两位):
1
记录已添加!

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
2
所有记录:
时间:10:34:05,金额:1.00

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
1
请输入金额(小数点后最多两位):
200
记录已添加!

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
3
所有记录(按照金额排序):
时间:10:34:22,金额:200.00
时间:10:34:05,金额:1.00

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
1
请输入金额(小数点后最多两位):
20
记录已添加!

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
3
所有记录(按照金额排序):
时间:10:34:22,金额:200.00
时间:10:50:33,金额:20.00
时间:10:34:05,金额:1.00

请选择操作(输入选项前的数字):
1. 输入金额
2. 显示所有记录
3. 按照金额排序显示
4. 显示金额之和
q. 退出程序
4
金额之和为:221.00

通过这个记账程序可以学到以下知识点:

  1. Java 的面向对象编程思想。程序中使用了面向对象的设计方式,将记录(AccountingRecord)和计算器程序(AccountingProgram)分别封装在不同的类中,有助于代码的复用和维护。
  2. 控制流程语句的使用。程序中使用了循环语句(while)和条件分支语句(if/else)来控制程序的执行流程和实现不同的功能。
  3. 集合类的基本使用。程序中使用 ArrayList 来存储所有的记录,并使用 Collections.sort() 方法对它们进行排序。
  4. Java 8 中处理日期时间的类库。程序中使用了 LocalDate 和 LocalTime 类来记录日期和时间信息,而 DateTimeFormatter 类则用于格式化日期时间信息。
  5. 输入输出流(I/O)。程序中使用了 Scanner 类获取用户输入,并使用 System.out.println() 方法打印输出信息。

关注微信公众号:小虎哥的技术博客

  • 24
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小虎哥的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值