Java实验4

本文介绍三个Java编程实验:利用HashMap实现的网上购物车,模拟30选7彩票程序,以及保皇游戏发牌过程。实验覆盖数据结构应用、随机数生成及游戏逻辑实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验4 容器(4学时)

**二、实验内容
1.用HashMap模拟一个网上购物车。要求:从键盘输入n本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可使用Scanner类】

package unsafe1;
import java.util.*;
public class Main{

    //定义一个类里面的静态方法getSum,传入HashMap带泛型的变量books
    //返回书的总价

    static double getSum(HashMap<Book,Double> books){
        double sum = 0;
        for(double value:books.values())
        {
            sum += value;
        }
        return sum;
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        HashMap<Book,Double> map = new HashMap<>();
        int n = sc.nextInt();

        //输入n种书籍,存入HashMap中
        for(int i = 0;i < n;i++)
        {
            String name = sc.next();
            double price = sc.nextDouble();
            int nums = sc.nextInt();
            double sum = price*nums;
            map.put(new Book(name,price,nums),sum);
        }
        //输出总价
        double S = getSum(map);
        System.out.println(S);
    }
}

//定义书本类,定义构造器,属性有名字,单价,数量
//总价即为:单价*数量
class Book{
    String name;
    double price;
    int nums;

    public Book(String name, double price, int nums) {
        this.name = name;
        this.price = price;
        this.nums = nums;
    }

}

2.写一个彩票的模拟程序:30选7。随机(1~30之间)生成7个随机数,注意不能重复。然后从键盘输入7个数,对比7个数是否与随机数有的。最后显示“中了几个号”。同时,如果中了7个号,显示一等奖;如果中了6个号,显示二等奖;如果中了5个号,显示三等奖。要求:首先在注释中写出程序的实现思想,特别是程序所使用的数据结构,然后写出Java实现代码。【说明:键盘输入可以使用Scanner类】

/**
 * 思路:首先,使用Scanner类获取键盘输入,使用Random类获取随机数
 * 根据题目要求不能去重,所以使用Set容器
 * 如果Random有重复值,那么一直添加元素,直到set容器长度为7
 * 定义一个计数器count,每符合一个元素就++,用if/else语句进行判断,输出相应语句
 */
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int a,count = 0;
        Random rand = new Random();
        Set<Integer> set = new HashSet<>();
        for(int i = 0;i < 7;i++)
        {
            set.add(rand.nextInt(30));
        }

        //保证生产了7个不重复的数添加至set集合中
        while(set.size()<7)
        {
            set.add(rand.nextInt(30));
        }

        System.out.println(set);
        for(int i = 0;i < 7;i++)
        {
            a = sc.nextInt();
            if(set.contains(a))
            {
                count++;
            }
        }
        System.out.println("中了"+count+"个号");
        if(count == 7)
            System.out.println("恭喜您,获得一等奖!");
        else if(count == 6)
            System.out.println("恭喜您,获得二等奖!");
        else if(count == 5)
            System.out.println("恭喜您,获得三等奖!");
        else
            System.out.println("很遗憾,没有获得奖项");

    }
}

3.模拟保皇游戏开始的发牌过程。规则:4副扑克,5个玩家。1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是2、3、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。特殊情况是:1)皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2)皇帝没有满足要求的牌,无法获得侍卫。程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。例如,程序运行后输出如下的结果:
皇帝是:玩家1
皇帝的牌是:[皇上, 小王, 小王, 小王, 小王, 方片2, 黑桃2, 黑桃A, 黑桃A, 红桃A, 方片K, 梅花K, 黑桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 方片J, 方片J, 方片J, 红桃J, 梅花9, 黑桃9, 黑桃9, 方片8, 梅花8, 红桃8, 梅花7, 黑桃7, 黑桃7, 红桃7, 梅花6, 梅花6, 黑桃6, 黑桃6, 方片5, 梅花5, 黑桃5, 黑桃5, 梅花4, 梅花4, 梅花4, 方片3, 红桃3]
侍卫对应的牌是:方片J
侍卫是:玩家2
侍卫的牌是:[方片2, 黑桃2, 红桃2, 方片A, 方片K, 梅花K, 梅花K, 黑桃K, 红桃K, 红桃K, 黑桃Q, 红桃Q, 方片J, 方片10, 黑桃10, 红桃10, 红桃10, 红桃10, 方片9, 红桃9, 方片8, 梅花8, 梅花8, 黑桃8, 黑桃8, 黑桃8, 红桃8, 红桃8, 方片7, 黑桃7, 黑桃7, 方片6, 黑桃6, 黑桃5, 梅花4, 黑桃4, 红桃4, 红桃4, 方片3, 梅花3, 黑桃3, 红桃3, 红桃3]
*

本题思路:
1:卡牌分类:特殊卡牌:大王小王,2,A,K,Q,J. 普通卡牌:10,9-------3.
卡牌分类:根据花色,黑桃红桃,方片梅花,以上可以写一个类:Cards类,提供相应构造方法

2:人物分类:皇帝,侍卫
首先每个人都需要获得牌,因此对于每个人物(Player)定义一个ArrayList 指定泛型Cards,代表玩家手中的牌,根据题目要求需要我们进行排序,排序规则不作详述,代码如下

static void SortCards(player []Player)
	{	player n=new player();
		for(int i=0;i<Player.length;i++)
		{Sortem sc= n.new Sortem();
		Collections.sort(Player[i].players,sc);
		}
	}

根据玩家手中的牌,判断谁是皇帝,谁是相应的侍卫,写出判断函数FindEmperor,FindProtect,具体实现不详述

3:游戏主体
定义一个ArrayList容器,使用Shuffle方法进行随机洗牌
首先进行多层for循环获得卡牌,具体来说,四副卡牌,4种花色,使用for循环获得所有卡牌存入容器ArrayList中,洗牌,发牌(5个玩家,for循环实现)
最后进行判断语句输出,调用Player类中的FindEmperor,FindProtect来判断谁是皇帝,谁是侍卫
输出具体人物,使用迭代器输出各玩家手中的牌。

实验结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值