Android 实现 Slots 游戏旋转效果

news2024/11/29 16:38:59

文章目录

  • 前言
  • 一、效果展示
  • 二、代码实现
    • 1.UI布局
    • 2.SlotAdapter
    • 2.SlotsActivity
  • 总结


前言

slots游戏:

Slots游戏是一种极具流行度的赌博和娱乐形式,通常被称为老虎机或水果机。它们在赌场、线上游戏平台和手机应用中广泛存在。一般这类游戏都使用Unity和Cocos2d-x两个常见的游戏引擎去开发的,下面介绍下 Android 原生代码实现Slots 旋转动画。


一、效果展示

在这里插入图片描述

二、代码实现

1.UI布局

先考虑如何让控件达到滑动旋转的效果,Android 中有许多具备滑动效果的控件,其中一些常见的包括:RecyclerViewListViewGridViewViewPagerScrollView等都具备滑动效果。
Slots游戏滑动的效果我选择使用RecyclerView来实现这个滑动动画效果。

创建SlotsActivity的xml布局activity_slots,最外层LinearLayout里面上半部分是五个RecyclerView组成,下半部分是两个按钮Button,一个点击执行单次滑动,另一个则是连续滑动的按钮。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingDefaultResource">

    <data>

    </data>

    <LinearLayout
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:orientation="horizontal"
                android:layout_weight="1"
                android:layout_height="0dp">

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_1"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_2"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_3"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_4"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler_5"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent" />
            </LinearLayout>

            <CheckBox
                android:id="@+id/is_check"
                android:text="是否向上滑动"
                android:layout_marginTop="10dp"
                android:layout_marginStart="10dp"
                android:textSize="20sp"
                android:visibility="gone"
                android:layout_width="wrap_content"
                android:layout_height="50dp" />

            <LinearLayout
                android:orientation="horizontal"
                android:gravity="center"
                android:layout_marginTop="20dp"
                android:layout_marginBottom="30dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <Button
                    android:id="@+id/startButton_down"
                    android:layout_marginStart="10dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:textAllCaps="false"
                    android:text="@string/single_slide" />

                <Button
                    android:id="@+id/startButton_up"
                    android:layout_marginStart="50dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:textAllCaps="false"
                    android:text="@string/continuous_slide" />
            </LinearLayout>

        </LinearLayout>

</layout>

在这里插入图片描述

创建一个名为layout_recycler_item的xml文件,用作RecyclerView的xml布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_marginTop="20dp"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_height="80dp">
    <ImageView
          android:id="@+id/image"
          android:layout_marginStart="20dp"
          android:layout_marginEnd="20dp"
          android:src="@mipmap/icon_orange"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>
</LinearLayout>

2.SlotAdapter

先创建文件RecyclerView的适配器SlotAdapterlist 列表存放的是五个icon素材。这里适配器是继承了BaseRecyclerViewAdapterHelper(高效的使用RecyclerView应对项目中的常见需求的Adapter),在onBindViewHolder方法中获取到ImageView控件的id后直接利用随机数获取list 素材进行设置。同时getItemCount方法我们需要设置无限大Int.MAX_VALUE,确保列表中的数据能够一直滑动。

class SlotAdapter : BaseQuickAdapter<SlotBean, ViewHolder>(){
    private var list = arrayListOf(
        R.mipmap.icon_peach,
        R.mipmap.icon_cherrie,
        R.mipmap.icon_seven,
        R.mipmap.icon_lemon,
        R.mipmap.icon_orange
    )
    override fun onBindViewHolder(holder: ViewHolder, position: Int, item: SlotBean?) {
        val image = holder.itemView.findViewById<ImageView>(R.id.image)
        val randomNumber = Random.nextInt(5) // 生成0到5之间的随机整数
        item?.type = randomNumber
        val id = list[randomNumber]
        image.setImageResource(id)
    }

    override fun getItemCount(items: List<SlotBean>): Int {
        return  Int.MAX_VALUE
    }

    override fun onCreateViewHolder(
        context: Context,
        parent: ViewGroup,
        viewType: Int
    ): ViewHolder {
        return QuickViewHolder(R.layout.layout_recycler_item, parent)
    }
}

2.SlotsActivity

SlotsActivity中初始化RecyclerView以及点击事件监听,

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_slots)
        init()
    }

    private fun init() {
        mDataBinding.startButtonDown.setOnClickListener {
            startSlide(0)
        }
        mDataBinding.startButtonUp.setOnClickListener {
            if (mDataBinding.startButtonUp.text.equals(resources.getString(R.string.continuous_slide))){
                continuous = true
                mDataBinding.startButtonUp.text = resources.getString(R.string.continuous_slide_stop)
                startSlide(0)
            }else{
                mDataBinding.startButtonUp.text = resources.getString(R.string.continuous_slide)
                continuous = false
            }
        }
        initRecycler()
    }

在初始化initRecycler()方法中创建适配器进行关联,并且设置RecyclerView禁止用户手动触摸滑动事件,同时将RecyclerView的初始位置都设置在中间位置。isScrolling变量则用来控制当前是否处于滑动状态,代码可以看见关于滑动监听我只监听了最后一个RecyclerView的事件,其他四个RecyclerView都没有进行监听设置,因为滑动的顺序案例内我是从左边第一个开始滑动到右边第五个结束。如果是随机滑动顺序的话,则需要监听最后一个开始滑动的RecyclerView的滚动事件来进行下一次的滑动。

 private fun initRecycler() {
        val slotAdapter = SlotAdapter()
        mDataBinding.recycler1.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler1.adapter = slotAdapter
        mDataBinding.recycler1.setOnTouchListener { p0, p1 -> true }//禁止用户手动触摸滑动
        mDataBinding.recycler1.scrollToPosition(Int.MAX_VALUE / 2) // 初始位置

        val slotAdapter2 = SlotAdapter()
        mDataBinding.recycler2.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler2.adapter = slotAdapter2
        mDataBinding.recycler2.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler2.scrollToPosition(Int.MAX_VALUE / 2)

        val slotAdapter3 = SlotAdapter()
        mDataBinding.recycler3.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler3.adapter = slotAdapter3
        mDataBinding.recycler3.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler3.scrollToPosition(Int.MAX_VALUE / 2)

        val slotAdapter4 = SlotAdapter()
        mDataBinding.recycler4.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler4.adapter = slotAdapter4
        mDataBinding.recycler4.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler4.scrollToPosition(Int.MAX_VALUE / 2)

        val slotAdapter5 = SlotAdapter()
        mDataBinding.recycler5.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler5.adapter = slotAdapter5
        mDataBinding.recycler5.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler5.scrollToPosition(Int.MAX_VALUE / 2)

        // 添加滚动监来控制按钮可点击状态
        mDataBinding.recycler5.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                // 检查RecyclerView是否正在滚动
                val isScrolling = newState != RecyclerView.SCROLL_STATE_IDLE
//                startItemAnim(isScrolling,recyclerView)
                if (continuous){
                    if(!isScrolling){//只有滑动停止的时候才进行下一次滑动
                        startSlide(1000)
                    }
                }else{
                    // 单次滑动设置按钮的可点击状态
                    mDataBinding.startButtonDown.isEnabled = !isScrolling
                }
            }
        })
    }

调用startSlide()方法开始滑动,关键的smoothScrollDownwards()方法内,其中calculateSpeedPerPixel 函数用于计算每个像素的滚动速度,而 calculateTimeForScrolling 函数用于计算滚动所需的时间。accelerationFactor则是加速因子,影响着滑动的速度。最后启动平滑滚动。

 fun startSlide(time:Long){
        handler.postDelayed({
            smoothScrollDownwards(mDataBinding.recycler1, 180f)
            smoothScrollDownwards(mDataBinding.recycler2, 210f)
            smoothScrollDownwards(mDataBinding.recycler3, 230f)
            smoothScrollDownwards(mDataBinding.recycler4, 250f)
            smoothScrollDownwards(mDataBinding.recycler5, 270f)
        },time)
    }
  private fun smoothScrollDownwards(recyclerView: RecyclerView, speed: Float) {
        val layoutManager = recyclerView.layoutManager as LinearLayoutManager?

        layoutManager?.let {
            val firstVisiblePosition = it.findFirstVisibleItemPosition()

            val smoothScroller = object : LinearSmoothScroller(recyclerView.context) {
                override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
                    return speed / displayMetrics?.densityDpi!!
                }

                override fun calculateTimeForScrolling(dx: Int): Int {
                    val initialTime = super.calculateTimeForScrolling(dx)
                    return (initialTime / accelerationFactor).toInt()
                }
            }
            val checked = mDataBinding.isCheck.isChecked
            smoothScroller.targetPosition =  if (checked) firstVisiblePosition + number   else firstVisiblePosition- number// 设置滚动的目标位置
            layoutManager.startSmoothScroll(smoothScroller) // 启动平滑滚动
        }
    }

整个核心代码的实现到这里就已经完全ok了,下面附上SlotsActivity的完整代码参考:

package com.example.demo.activity

import android.annotation.SuppressLint
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.DisplayMetrics
import android.util.Log
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView
import com.example.demo.R
import com.example.demo.adapter.SlotAdapter
import com.example.demo.databinding.ActivitySlotsBinding
import com.example.demo.utils.AnimationUtil


/**
 * @ClassName SlotsActivity
 * @Description Slots Game
 * @Author lmf
 * @Date 2023/9/20 16:32
 * @Version 1.0
 */
class SlotsActivity:AppCompatActivity() {
    private final val TAG = "SlotsActivity"
    private  lateinit var  mDataBinding:ActivitySlotsBinding

    private val number = 20//列表每次滑动的数量

    private val accelerationFactor = 2f //滑动加速因子

    private var continuous = false //是否持续滚动

    private val handler = Handler(Looper.getMainLooper())

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_slots)
        init()
    }

    private fun init() {
        mDataBinding.startButtonDown.setOnClickListener {
            startSlide(0)
        }
        mDataBinding.startButtonUp.setOnClickListener {
            if (mDataBinding.startButtonUp.text.equals(resources.getString(R.string.continuous_slide))){
                continuous = true
                mDataBinding.startButtonUp.text = resources.getString(R.string.continuous_slide_stop)
                startSlide(0)
            }else{
                mDataBinding.startButtonUp.text = resources.getString(R.string.continuous_slide)
                continuous = false
            }
        }
        initRecycler()
    }

    /**
     *
     * @param recyclerView
     * @param speed 滚动速度(每像素毫秒)
     */
    private fun smoothScrollDownwards(recyclerView: RecyclerView, speed: Float) {
        val layoutManager = recyclerView.layoutManager as LinearLayoutManager?

        layoutManager?.let {
            val firstVisiblePosition = it.findFirstVisibleItemPosition()

            val smoothScroller = object : LinearSmoothScroller(recyclerView.context) {
                override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
                    return speed / displayMetrics?.densityDpi!!
                }

                override fun calculateTimeForScrolling(dx: Int): Int {
                    val initialTime = super.calculateTimeForScrolling(dx)
                    return (initialTime / accelerationFactor).toInt()
                }
            }
            val checked = mDataBinding.isCheck.isChecked
            smoothScroller.targetPosition =  if (checked) firstVisiblePosition + number   else firstVisiblePosition- number// 设置滚动的目标位置
            layoutManager.startSmoothScroll(smoothScroller) // 启动平滑滚动
        }
    }

    //初始化列表
    @SuppressLint("ClickableViewAccessibility")
    private fun initRecycler() {
        val slotAdapter = SlotAdapter()
        mDataBinding.recycler1.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler1.adapter = slotAdapter
        mDataBinding.recycler1.setOnTouchListener { p0, p1 -> true }//禁止用户手动触摸滑动
        mDataBinding.recycler1.scrollToPosition(Int.MAX_VALUE / 2) // 初始位置

        val slotAdapter2 = SlotAdapter()
        mDataBinding.recycler2.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler2.adapter = slotAdapter2
        mDataBinding.recycler2.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler2.scrollToPosition(Int.MAX_VALUE / 2)

        val slotAdapter3 = SlotAdapter()
        mDataBinding.recycler3.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler3.adapter = slotAdapter3
        mDataBinding.recycler3.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler3.scrollToPosition(Int.MAX_VALUE / 2)

        val slotAdapter4 = SlotAdapter()
        mDataBinding.recycler4.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler4.adapter = slotAdapter4
        mDataBinding.recycler4.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler4.scrollToPosition(Int.MAX_VALUE / 2)

        val slotAdapter5 = SlotAdapter()
        mDataBinding.recycler5.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        mDataBinding.recycler5.adapter = slotAdapter5
        mDataBinding.recycler5.setOnTouchListener { p0, p1 -> true }
        mDataBinding.recycler5.scrollToPosition(Int.MAX_VALUE / 2)

        // 添加滚动监来控制按钮可点击状态
        mDataBinding.recycler5.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                // 检查RecyclerView是否正在滚动
                val isScrolling = newState != RecyclerView.SCROLL_STATE_IDLE
//                startItemAnim(isScrolling,recyclerView)
                if (continuous){
                    if(!isScrolling){//只有滑动停止的时候才进行下一次滑动
                        startSlide(1000)
                    }
                }else{
                    // 单次滑动设置按钮的可点击状态
                    mDataBinding.startButtonDown.isEnabled = !isScrolling
                }
            }
        })
    }

    //调用开始滑动动画
    fun startSlide(time:Long){
        handler.postDelayed({
            smoothScrollDownwards(mDataBinding.recycler1, 180f)
            smoothScrollDownwards(mDataBinding.recycler2, 210f)
            smoothScrollDownwards(mDataBinding.recycler3, 230f)
            smoothScrollDownwards(mDataBinding.recycler4, 250f)
            smoothScrollDownwards(mDataBinding.recycler5, 270f)
        },time)
    }
}

总结

以上就是Android 实现 Slots 的游戏旋转效果的全部内容了,本文仅仅简单介绍了仿Slots游戏的旋转效果,真正的Slots 游戏涉及到每次滑动的得分情况处理以及更加复杂的动画特效展示。

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

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

相关文章

重温MySQL之索引那些事

文章目录 前言一、概念1.1 索引作用1.2 索引类型1.3 B树索引结构1.4 B树索引源码分析 二、查询计划2.1 explain2.2 id2.3 select_type2.4 table2.5 partitions2.6 type2.7 possible_keys2.8 key2.9 key_len2.10 ref2.11 rows2.12 filtered2.13 Extra 三、索引优化3.1 索引失效3…

【2023年终总结】 | 时光之舟:乘载着回忆与希望穿越2023,抵达2024

文章目录 1 回忆2 希望 1 回忆 2023年对我来说是非常梦幻的一年&#xff0c;我在2023年初的时候确认去做AI方向&#xff0c;在这之前我尝试了前端开发&#xff0c;移动App开发&#xff0c;云FPGA等方向&#xff0c;但是感觉自己都不是很喜欢&#xff0c;然后就开始尝试新的方向…

idea如何设置自动换行

idea设置自动换行其实很简单&#xff0c;只需要进行一步操作就可以了。   看下图&#xff1a;我们只需要在相应的位置加上文件的类型就可以了&#xff0c;比如我们写的类都是.java文件&#xff0c;那么我们只需要加上 *.java就可以实现自动换行了。

基于Springboot实现天天生鲜销售电商平台

SSM毕设分享 基于Springboot实现天天生鲜销售电商平台 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 …

HarmonyOS4.0系统性深入开发11通过message事件刷新卡片内容

通过message事件刷新卡片内容 在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility&#xff0c;然后由FormExtensionAbility刷新卡片内容&#xff0c;下面是这种刷新方式的简单示例。 在卡片页面通过注册Button的onClick点击事件回调&#xff0c;…

【大数据面试知识点】Spark中的累加器

Spark累加器 累加器用来把Executor端变量信息聚合到Driver端&#xff0c;在driver程序中定义的变量&#xff0c;在Executor端的每个task都会得到这个变量的一份新的副本&#xff0c;每个task更新这些副本的值后&#xff0c;传回driver端进行merge。 累加器一般是放在行动算子…

【深度解析C++之运算符重载】

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;【深度解析C之this…

【Android Gradle 插件】Android Plugin DSL Reference 离线文档下载 ( GitHub 下载文档 | 查看文档 )

一、Android Plugin DSL Reference 文档下载 二、Android Plugin DSL Reference 文档查看 一、Android Plugin DSL Reference 文档下载 在之前的博客 【Android Gradle 插件】Android Plugin DSL Reference 文档介绍 ( 1.2 ~ 3.4 版本文档地址 | 4.1 ~ 7.1 版本文档地址 ) 中…

【Spring】AOP的AspectJ开发

AOP基础不了解可以阅读&#xff1a;【Spring】AOP原来如此-CSDN博客 AspectJ是一个居于JAVA开发的AOP框架 基于XML的声明式AspectJ 基于XML的声明式AspectJ是通过XML文件来定义切面&#xff0c;切入点及通知&#xff0c;所有的切面、切入点和通知必须定义在内&#xff0c; 元…

Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

NXP实战笔记(二):S32K3xx基于RTD-SDK在S32DS上配置PIT与STM中断并反转IO

目录 1、PIT 1.1、PIT概述 1.2、PIT的配置 1.3、Dio配置 1.4、中断配置 1.5、测试代码 1.6、测试结果 2、STM 2.1、STM概述 2.2、STM的配置 2.3、测试代码 2.4、测试结果 1、PIT 1.1、PIT概述 PIT是一组定时器&#xff0c;可用于引发中断和触发器&#xff0c;包括一…

【AI】人类视觉感知特性与深度学习模型(2/2)

目录 二、人类视觉感知特性对深度学习模型的启发 2.1 视觉关注和掩盖与调节注意力模型的关系 1.视觉关注和掩盖 2. 注意力机制模型 2.2 对比敏感度与U形网络的联系 2.3 非局部约束与点积注意力的联系 续上节 【AI】人类视觉感知特性与深度学习模型&#xff08;1/2&#…

【如何选择Mysql服务器的CPU核数及内存大小】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

python练习2【题解///考点列出///错题改正】

一、单选题 【文件】 *1.【单选题】 ——文件&#xff1a;读取方法 下列哪个选项可以从文件中读取任意字节的内容&#xff1f;&#xff08;C &#xff09;A A.read() B.readline() C.readlines() D.以上全部 A\B\C三种方法都是可以读取文件中任意的字节内容的&#xff0…

emacs:Searching for program: No such file or directory,sml;

首先&#xff0c;编辑一个现有的或新的 SML 文件&#xff08;如果没有其他方便的方法&#xff0c;可尝试C-x C-f test.smlC-x C-f test.sml 创建一个新文件&#xff09;。你会看到 Emacs 窗口底部的模式显示从 "基本"&#xff08;或其他任何模式&#xff09;变成了 S…

【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)

甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…

【c++】使用vector存放键值对时,明明给vector的不同键赋了不同的值,但为什么前面键的值会被后面键的值给覆盖掉?

错误描述 运行程序得到结果如下图所示&#xff08;左边是原始数据&#xff0c;xxml文件中真实数据的样子&#xff0c;右图是程序运行得到的结果结果&#xff09;&#xff1a; 对比以上两图可以发现&#xff0c;右图中两个实例的三个属性值都来自左图中的第二个User实例&#x…

思维训练-怎样设计一个MQ

架构师需要做各种设计&#xff0c;要不断地提高自己的设计能力。这有没有方法可以训练呢&#xff1f;有的&#xff0c;就是看到什么、想到什么&#xff0c;就假设对面坐着产品经理&#xff0c;一起讨论怎么把它设计出来。比如怎样设计一个MQ 我&#xff1a;首先我确认一下需求。…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷①

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第1套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第1套&#xff09; 模块一…

系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和非局部变量]

分类目录&#xff1a;《系统学习Python》总目录 我们在某些情况下可能想要共享全局状态。如果我们真的想要每个函数都有自己的计数器&#xff0c;要么像前面的文章那样使用类&#xff0c;要么使用Python3.X中的闭包函数&#xff08;工厂函数&#xff09;和nonlocal语句。由于这…