魔术小游戏

news2024/9/25 17:21:33

魔术游戏

    • 一、问题描述
    • 二、基本流程
    • 三、具体步骤
      • 1.在集合中随机生成起始牌
      • 2.菜单栏
      • 3.找到包含[选中牌]的一组牌在大集合中的索引
      • 4.洗牌
      • 5.发牌
    • 四、完整代码
    • 五、效果展示

一、问题描述

这是一个魔术游戏,将15张牌分为三组,每组5张,让玩家从中任选一张牌并记下,将这张牌记为[选中牌]。

1.依次询问玩家这三组牌里是否包含[选中牌],将包含这张牌的一组牌放在两组中间。
2.发牌,重新将15张牌分为三组。
3.重复上述步骤,将包含[选中牌]的一组牌放到中间。
4.重复上述步骤3次(完成发牌和将[选中牌]放在中间为一次)。

二、基本流程

一开始随机生成15张牌,[1,5]在第一个小集合中,[6,10]在第二个小集合中,[11,15]在第三个小集合中。
使用集合嵌套,将每一组牌放在一个小集合中。

三、具体步骤

1.在集合中随机生成起始牌

    public static List<ArrayList<Integer>> list1 = new ArrayList<>();
    public static List<Integer> list1_1 = new ArrayList<>();
    public static List<Integer> list1_2 = new ArrayList<>();
    public static List<Integer> list1_3 = new ArrayList<>();

    public static List<ArrayList<Integer>> list2 = new ArrayList<>();
    public static List<Integer> list2_1 = new ArrayList<>();
    public static List<Integer> list2_2 = new ArrayList<>();
    public static List<Integer> list2_3 = new ArrayList<>();

    static {
        Integer[] list_1_arr = {0, 0, 0, 0, 0};
        Integer[] list_2_arr = {0, 0, 0, 0, 0};
        Integer[] list_3_arr = {0, 0, 0, 0, 0};
        addNumInArr(list_1_arr, 1);
        addNumInArr(list_2_arr, 6);
        addNumInArr(list_3_arr, 11);
        list1_1.addAll(Arrays.asList(list_1_arr));
        list1_2.addAll(Arrays.asList(list_2_arr));
        list1_3.addAll(Arrays.asList(list_3_arr));
        list1.add((ArrayList<Integer>) list1_1);
        list1.add((ArrayList<Integer>) list1_2);
        list1.add((ArrayList<Integer>) list1_3);
        list2.add((ArrayList<Integer>) list2_1);
        list2.add((ArrayList<Integer>) list2_2);
        list2.add((ArrayList<Integer>) list2_3);
    }

    /**
     * 向数组添加不重复元素
     *
     * @param list_1_arr
     * @param n2         生成随机值的偏移量
     */
    private static void addNumInArr(Integer[] list_1_arr, int n2) {
        Random ran = new Random();
        int count = 0;
        while (true) {
            for (int i = 0; i < 5; i++) {
                while (true) {
                    boolean flag = true;
                    boolean flag2 = false;
                    int num = ran.nextInt(5) + n2;
                    for (int j = 0; j < 5; j++) {
                        if (num == list_1_arr[j]) {
                            flag = false;
                            break;
                        }
                    }
                    if (flag) {
                        list_1_arr[i] = num;
                        count++;
                        flag2 = true;
                    }
                    if (flag2)
                        break;
                }
            }
            if (count == 5)
                break;
        }

2.菜单栏

    /**
     * 菜单栏
     */
    private static void menu() {
        System.out.println("-------------------------------------------------------");
        System.out.println("魔术,随机让玩家记住一张牌,通过游戏规则变换三次后即可猜出那张牌");
        System.out.println("洗牌:将带有输入数字的一组牌放到中间位置");
        System.out.println("发牌:按照洗牌后的顺序发牌");
        System.out.println("-------------------------------------------------------");
        System.out.println("#######################################################");
        System.out.println("游戏规则:");
        System.out.println("1:让玩家从15张牌中随机选出一张记下【选中牌】");
        System.out.println("2:将15张牌按照顺序发牌,分为3组,每组5张");
        System.out.println("3:依次询问每组牌是否包含【选中牌】");
        System.out.println("4:将包含【选中牌】的那组放到中间,另外两组随意");
        System.out.println("5:重复步骤2,3,4,保证洗牌次数大于等于3后,即可在中间那组的第3张找到【选中牌】");
        System.out.println("#######################################################");
        System.out.println("请输入1——15之间的一个数字:");
    }

3.找到包含[选中牌]的一组牌在大集合中的索引

    /**
     * 查找指定元素在大集合中的索引(0 1 2)
     *
     * @param list1
     * @param n
     * @return
     */
    private static int getNumInList(List<ArrayList<Integer>> list1, int n) {
        int flag = 0;
        for (int i = 0; i < list1.size(); i++) {
            for (int j = 0; j < list1.get(i).size(); j++) {
                if (n == list1.get(i).get(j)) {
                    flag = i;
                    break;
                }
            }
        }
        return flag;
    }
}

4.洗牌

将包含[选中牌]的一组牌放到中间

    /**
     * 查找指定元素在大集合中的索引(0 1 2)
     *
     * @param list1
     * @param n
     * @return
     */
    private static int getNumInList(List<ArrayList<Integer>> list1, int n) {
        int flag = 0;
        for (int i = 0; i < list1.size(); i++) {
            for (int j = 0; j < list1.get(i).size(); j++) {
                if (n == list1.get(i).get(j)) {
                    flag = i;
                    break;
                }
            }
        }
        return flag;
    }
}

5.发牌

先将15个元素转化为数组

    /**
     * 元素转为数组
     *
     * @param list11
     * @return
     */
    private static int[] card_toArr(List<ArrayList<Integer>> list11) {
        int[] arr = new int[15];
        int k = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                arr[k] = list11.get(i).get(j);
                k++;
            }
        }
        return arr;
    }


发牌

    /**
     * 发牌
     *
     * @param list2
     * @param list1
     */
    private static void deal(List<ArrayList<Integer>> list1, List<ArrayList<Integer>> list2) {
        int[] card_arr = card_toArr(list1);
        int j = 0;
        int count = 0;
        for (int i = 0; i < 15; i++) {
            int num = card_arr[i];
            int index = i % 3;
            list2.get(index).set(j, num);
            count++;
            if (count % 3 == 0)
                j++;
        }
    }

四、完整代码

import java.util.*;

public class Main {
    public static List<ArrayList<Integer>> list1 = new ArrayList<>();
    public static List<Integer> list1_1 = new ArrayList<>();
    public static List<Integer> list1_2 = new ArrayList<>();
    public static List<Integer> list1_3 = new ArrayList<>();

    public static List<ArrayList<Integer>> list2 = new ArrayList<>();
    public static List<Integer> list2_1 = new ArrayList<>();
    public static List<Integer> list2_2 = new ArrayList<>();
    public static List<Integer> list2_3 = new ArrayList<>();

    static {
        Integer[] list_1_arr = {0, 0, 0, 0, 0};
        Integer[] list_2_arr = {0, 0, 0, 0, 0};
        Integer[] list_3_arr = {0, 0, 0, 0, 0};
        addNumInArr(list_1_arr, 1);
        addNumInArr(list_2_arr, 6);
        addNumInArr(list_3_arr, 11);
        list1_1.addAll(Arrays.asList(list_1_arr));
        list1_2.addAll(Arrays.asList(list_2_arr));
        list1_3.addAll(Arrays.asList(list_3_arr));
        list1.add((ArrayList<Integer>) list1_1);
        list1.add((ArrayList<Integer>) list1_2);
        list1.add((ArrayList<Integer>) list1_3);
        list2.add((ArrayList<Integer>) list2_1);
        list2.add((ArrayList<Integer>) list2_2);
        list2.add((ArrayList<Integer>) list2_3);
    }

    /**
     * 向数组添加不重复元素
     *
     * @param list_1_arr
     * @param n2         生成随机值的偏移量
     */
    private static void addNumInArr(Integer[] list_1_arr, int n2) {
        Random ran = new Random();
        int count = 0;
        while (true) {
            for (int i = 0; i < 5; i++) {
                while (true) {
                    boolean flag = true;
                    boolean flag2 = false;
                    int num = ran.nextInt(5) + n2;
                    for (int j = 0; j < 5; j++) {
                        if (num == list_1_arr[j]) {
                            flag = false;
                            break;
                        }
                    }
                    if (flag) {
                        list_1_arr[i] = num;
                        count++;
                        flag2 = true;
                    }
                    if (flag2)
                        break;
                }
            }
            if (count == 5)
                break;
        }
    }

    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        menu();
        int n = sca.nextInt();
        System.out.println("初始牌:");
        System.out.println(list1);
        System.out.println("第一次洗牌后:");
        riffle(list1, list2, n);//洗牌
        System.out.println(list2);
        System.out.println("发牌后:");
        deal(list2, list1);//发牌
        System.out.println(list1);
        System.out.println("第二次洗牌后:");
        riffle(list1, list2, n);//洗牌
        System.out.println(list2);
        System.out.println("发牌后:");
        deal(list2, list1);//发牌
        System.out.println(list1);
        System.out.println("第三次洗牌后:");
        riffle(list1, list2, n);//洗牌
        System.out.println(list2);
        System.out.println("------------------------------------------------------------");
        System.out.println("----------------------------第四次---------------------------");
        System.out.println("------------------------------------------------------------");
        System.out.println("发牌后:");
        deal(list2, list1);//发牌
        System.out.println(list1);
        System.out.println("第四次洗牌后:");
        riffle(list1, list2, n);//洗牌
        System.out.println(list2);
        System.out.println("------------------------------------------------------------");
        System.out.println("----------------------------第五次---------------------------");
        System.out.println("------------------------------------------------------------");
        System.out.println("发牌后:");
        deal(list2, list1);//发牌
        System.out.println(list1);
        System.out.println("第五次洗牌后:");
        riffle(list1, list2, n);//洗牌
        System.out.println(list2);
        System.out.println("------------------------------------------------------------");
    }

    /**
     * 菜单栏
     */
    private static void menu() {
        System.out.println("-------------------------------------------------------");
        System.out.println("魔术,随机让玩家记住一张牌,通过游戏规则变换三次后即可猜出那张牌");
        System.out.println("洗牌:将带有输入数字的一组牌放到中间位置");
        System.out.println("发牌:按照洗牌后的顺序发牌");
        System.out.println("-------------------------------------------------------");
        System.out.println("#######################################################");
        System.out.println("游戏规则:");
        System.out.println("1:让玩家从15张牌中随机选出一张记下【选中牌】");
        System.out.println("2:将15张牌按照顺序发牌,分为3组,每组5张");
        System.out.println("3:依次询问每组牌是否包含【选中牌】");
        System.out.println("4:将包含【选中牌】的那组放到中间,另外两组随意");
        System.out.println("5:重复步骤2,3,4,保证洗牌次数大于等于3后,即可在中间那组的第3张找到【选中牌】");
        System.out.println("#######################################################");
        System.out.println("请输入1——15之间的一个数字:");
    }

    /**
     * 发牌
     *
     * @param list2
     * @param list1
     */
    private static void deal(List<ArrayList<Integer>> list1, List<ArrayList<Integer>> list2) {
        int[] card_arr = card_toArr(list1);
        int j = 0;
        int count = 0;
        for (int i = 0; i < 15; i++) {
            int num = card_arr[i];
            int index = i % 3;
            list2.get(index).set(j, num);
            count++;
            if (count % 3 == 0)
                j++;
        }
    }

    /**
     * 元素转为数组
     *
     * @param list11
     * @return
     */
    private static int[] card_toArr(List<ArrayList<Integer>> list11) {
        int[] arr = new int[15];
        int k = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                arr[k] = list11.get(i).get(j);
                k++;
            }
        }
        return arr;
    }


    /**
     * 洗牌
     *
     * @param list1
     * @param list2
     * @param n     选定的数字
     */
    private static void riffle(List<ArrayList<Integer>> list1, List<ArrayList<Integer>> list2, int n) {
        int index = getNumInList(list1, n);
        list2.set(1, list1.get(index));
        Random ran = new Random();
        int a = 0;
        if (a != index) {
            list2.set(0, list1.get(a));
        } else {
            while (true) {
                a = ran.nextInt(3);
                if (a != index) {
                    list2.set(0, list1.get(a));
                    break;
                }
            }
        }
        int b = 0;
        while (true) {
            b = ran.nextInt(3);
            if (b != index && b != a) {
                list2.set(2, list1.get(b));
                break;
            }
        }
    }

    /**
     * 查找指定元素在大集合中的索引(0 1 2)
     *
     * @param list1
     * @param n
     * @return
     */
    private static int getNumInList(List<ArrayList<Integer>> list1, int n) {
        int flag = 0;
        for (int i = 0; i < list1.size(); i++) {
            for (int j = 0; j < list1.get(i).size(); j++) {
                if (n == list1.get(i).get(j)) {
                    flag = i;
                    break;
                }
            }
        }
        return flag;
    }
}

五、效果展示

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

填鸭表单|2022年度总结功能发布

自从我们在2020年发布了开源版本以来&#xff0c;我们结识了许多社区伙伴。在和这些社区伙伴的接触中&#xff0c;我们深刻地感受到了“做产品的感觉&#xff0c;令人振奋且充满激情”。 我们认为&#xff0c;专注于做一件事情&#xff0c;持续深耕&#xff0c;时间自然会给出…

C#语言实例源码系列-实现对文件进行加密保护

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

jmeter压测使用实践

环境搭建篇见https://blog.csdn.net/weixin_42498050/article/details/12847945 参考Jmter压测使用实践 jmeter压测实战总结 搭建 Apache Jmeter 分布式压测与监控 Jmeter常用断言 1. 添加线程组 测试计划 &#xff08;右键->添加->Threads&#xff08;Users&#x…

做了这么久的自动化测试现在才知道API 接口测试还能...

接口测试作为最常用的集成测试方法的一部分&#xff0c;通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期&#xff0c;有些情况是功能测试无法覆盖的&#xff0c;所以接口测试是非常必要的。首先需要对接口测试的基本信息做一些了解&#…

Linux如何安装BeyondCompare

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录安装yumtar.gz使用示例BeyondCompare是一款广受好评的文本对比工具。本…

文件上传漏洞渗透与攻防(一)

目录 前言 文件上传漏洞原理 Webshell介绍 一句话木马&#xff1a; 小马&#xff1a; 大马&#xff1a; Webshell集合&#xff1a; 网站控制工具 文件上传漏洞危害 文件上传漏洞靶场练习 Pass-01 Pass-02 Pass-03 Pass-04 Pass-06 Pass-07 Pass-08 Pass-09 Pass-10 Pas…

Java并发编程(二)

线程方法 API Thread 类 API&#xff1a; 方法说明public void start()启动一个新线程&#xff0c;Java虚拟机调用此线程的 run 方法public void run()线程启动后调用该方法public void setName(String name)给当前线程取名字public void getName()获取当前线程的名字 线程存…

实战演练 | 使用 Navicat Premium 自动运行数据库复制

与同步&#xff08;使两个数据库的模式和数据同步的一次性过程&#xff09;不同&#xff0c;复制是一个连续&#xff08;自动&#xff09;在两个数据库之间重现数据的过程&#xff08;尽管模式更新也是可能的&#xff09;。复制可以异步完成&#xff0c;因此不需要永久连接两个…

【Lniux】目录的权限,默认权限,粘滞位详细讲解

大家好&#xff0c;今天详细讲解一些关于目录权限的细节 很多细节都是通过问答方式&#xff0c;希望大家可以先自己思考一下答案然后再听我的分析 欢迎指正错误&#xff0c;我们共同成长 目录 1.目录的权限 2.默认权限 3.粘滞位 1.目录的权限 如果我们要进图一个目录只需要…

ArcGIS基础实验操作100例--实验25统一多分辨率栅格数据

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验25 统一多分辨率栅格数据 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

springboot admin-server的使用

指标监控可视化文档&#xff1a; 用于管理 Spring Boot 应用程序的管理 UI Spring Boot Admin Reference Guide 一、创建项目 就勾选Spring Web项目即可 二、基础设置 (1) 依赖引入 <dependency><groupId>de.codecentric</groupId><artifactId>sp…

Android: Binder: 彻底顿悟Android Binder

Binder机制可谓是Android 知识体系的重中之中&#xff0c;作为偏底层的基础组件&#xff0c;平时我们很少关注它&#xff0c;但是它却无处不在&#xff0c;这也是android面试考察点之一&#xff0c;本篇将从流程上将Binder通信过一遍。 文章目录 1&#xff1a;Binder作用 2&…

STM32F7-Discovery使用ITM作为调试工具

关于代码的调试手段&#xff0c;我在自己的一篇文章(http://bbs.ickey.cn/index.php?appgroup&actopic&id54944链接中的《STM32F030 Nucleo-开发调试的经验USART的重要性.pdf》)中已经详细谈到&#xff0c;为什么在调试中我们通常使用J-Link或ULINK或ST-Link(ST)或Ope…

机器学习——细节补充

1.matplotlib与seaborn的区别 来源&#xff1a;https://geek-docs.com/matplotlib/matplotlib-ask-answer/difference-between-matplotlib-and-seaborn.html 2.%matplotlib inline使图片嵌入notebook&#xff0c;而不需要使用show()方法 3.IPython与python&#xff1a;IPyth…

中小企业如何选择进销存软件?

企业信息化转型趋势的推动&#xff0c;让很多中小企业也开启了转型的探索。对于企业&#xff0c;一款合适的进销存管理软件&#xff0c;绝对是转型之路上的必备工具&#xff0c;可以帮助企业对经营中的采购、库存、销售等环节进行有效管理监督。 目前&#xff0c;市面上的各种…

three.js 的渲染结构

理解three.js 的渲染结构 1 three.js 的渲染 Three.js 封装了场景、灯光、阴影、材质、纹理和三维算法&#xff0c;让你不必再直接用WebGL 开发项目。three.js 在渲染三维场景时&#xff0c;需要创建很多对象&#xff0c;并将它们关联在一起。 下图便是一个基本的three.js 渲…

Python通知Epic白嫖游戏信息

每周都有免费游戏 - Epic Games 近期看到Epic在送游戏&#xff0c;目前每周都会有活动白嫖。 身为白嫖党&#xff0c;肯定要操作一下。 游戏列表&#xff1a;Epic Games Store 每周免费游戏&#xff08;331&#xff09; | indienova GameDB 游戏库 大致思路&#xff1a; 1、…

把teamtalk中的网络库(netlib)拆出来单独测试实现双工通信效果

这篇文章的基础是上一篇对于将teamtalk中的线程池&#xff0c;连接池单独拆出来的讲解 不是说这个网络库会依赖线程池&#xff0c;连接池&#xff0c;而是上一篇文章中讲了一些base目录中的文件&#xff0c;并且这个网络库会依赖一些base目录里的文件&#xff0c; 文末会将所有…

基于fpga的自动售货机(三段式状态机)

目录 1、VL38 自动贩售机1 题目介绍 思路分析 代码实现 仿真文件 2、VL39 自动贩售机2 题目介绍&#xff1a; 题目分析 代码实现 仿真文件 3、状态机基本知识 1、VL38 自动贩售机1 题目介绍 设计一个自动贩售机&#xff0c;输入货币有三种&#xff0c;为0.5/1/2元&…

JS概览 (JS基础 DOM BOM)

目录 JavaScript JS基础 JS数据类型 函数 变量的作用域 作用域链 预解析 DOM DOM树 获取元素的方法 事件高级 注册和解绑事件 DOM事件流 BOM 和DOM的区别 window 对象的常见事件 window.onload JS执行机制 具体的执行流程 例子 JavaScript JS基础 JS数据类…