【雕爷学编程】 MicroPython动手做(35)——体验小游戏

news2024/11/19 13:40:23

知识点:什么是掌控板?
掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED显示屏、RGB灯、加速度计、麦克风、光线传感器、蜂鸣器、按键开关、触摸开关、金手指外部拓展接口,支持图形化及MicroPython代码编程,可实现智能机器人、创客智造作品等智能控制类应用。

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

掌控板硬件特性:
ESP-32主控
处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
主频:高达240MHz的时钟频率
SRAM:520KB
Flash:8MB
Wi-Fi标准:FCC/CE/TELEC/KCC
Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps),A-MPDU和A-MSDU聚合,支持0.4us防护间隔
频率范围:2.4~2.5 GHz
蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
蓝牙音频:CVSD和SBC音频低功耗:10uA
供电方式:Micro USB供电
工作电压:3.3V
最大工作电流:200mA
最大负载电流:1000mA
掌控板载
三轴加速度计MSA300,测量范围:±2/4/8/16G
地磁传感器MMC5983MA,测量范围:±8 Gauss;精度0.4mGz,电子罗盘误差±0.5°
光线传感器
麦克风
3 颗全彩ws2812灯珠
1.3英寸OLED显示屏,支持16*16字符显示,分辨率128x64
无源蜂鸣器
支持2个物理按键(A/B)、6个触摸按键
支持1路鳄鱼夹接口,可方便接入各种阻性传感器
拓展接口
20通道数字I/O, (其中支持12路PWM,6路触摸输入)
5通道12bit模拟输入ADC,P0~P4
1路的外部输入鳄鱼夹接口:EXT/GND
支持I2C、UART、SPI通讯协议

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

小游戏 (体积较小、玩法简单的游戏)
小游戏是一个较模糊的概念,它是相对于体积庞大的单机游戏及网络游戏而言的,泛指所有体积较小、玩法简单的游戏,通常这类游戏以休闲益智类为主,有单机版有网页版,在网页上嵌入的多为FLASH格式。当下小游戏主要是指在线玩的flash版本游戏,统称小游戏,其实小游戏还包含单机游戏,小型游戏机等。一般游戏大小小于10m的游戏都统称为小游戏,一些街机类小游戏。因其游戏安装简便,耐玩性强,无依赖性而广受白领及小朋友的喜爱。

“小游戏”这个词的型含义其实很简单,它不是一些大的游戏,不必花费更多的时间和精力。小游戏是原始的游戏娱乐方式,小游戏本身是为了叫人们在工作,学习后的一种娱乐、休闲的一种方式,不是为了叫玩家为之花费金钱、花费精力,更不是叫玩家为他痴迷。小游戏也可以理解为“Flash游戏”,是以SWF为后缀的游戏的总称.这些游戏是通过Flash软件和 Flash 编程语言 Flash ActionScript 制作而成。由于Flash是矢量软件,所以小游戏放大后几乎不影响画面效果。Flash小游戏是一种新兴起的游戏形式,以游戏简单,操作方便,绿色,无需安装,文件体积小等优点渐渐被广大网友喜爱。

在这里插入图片描述

1、弹球游戏

#MicroPython动手做(35)——体验小游戏
#弹球游戏

from mpython import *
import music
import time

def func():
    global a, b, FMQ, loc, staart_flag, Start, X, Y
    music.pitch(131, 500)
    loc = 44
    a = 2
    b = 2
    staart_flag = False
    Start = True
    Y = 48
    X = 64
    FMQ = False

def a1():
    global a, b, FMQ, loc, staart_flag, Start, X, Y
    if FMQ:
        music.pitch(131, 500)
        FMQ = False

def a3():
    global a, b, FMQ, loc, staart_flag, Start, X, Y
    if Start:
        if button_a.value() == 0:
            staart_flag = True
            loc = loc - 2
            if loc < 0:
                loc = 0
        if button_b.value() == 0:
            staart_flag = True
            loc = loc + 2
            if loc > 88:
                loc = 88

def a2():
    global a, b, FMQ, loc, staart_flag, Start, X, Y
    oled.fill(0)
    oled.fill_rect(loc, 55, 40, 5, 1)
    oled.fill_circle(X, Y, 5, 1)
    oled.show()
    if button_a.value() == 0 and button_b.value() == 0:
        func()
        while button_a.value() == 0 and button_b.value() == 0:
            pass
        time.sleep_ms(100)

def a4():
    global a, b, FMQ, loc, staart_flag, Start, X, Y
    if staart_flag:
        X = X + a
        Y = Y - b
        if X >= 122:
            a = a * -1
        if X <= 5:
            a = a * -1
        if Y <= 5:
            b = b * -1
        if Y >= 48:
            if not (X > loc + 50 or X < loc - 10):
                b = b * -1
            if X > loc + 50 or X < loc - 10:
                staart_flag = False
                Start = False
                FMQ = True


func()
while True:
    a1()
    a2()
    a3()
    a4()

mPython X 实验图形编程

在这里插入图片描述

mPython X 实验图形编程2

在这里插入图片描述

Mind+ 实验图形编程
在这里插入图片描述

弹球游戏(实验视频)

https://v.youku.com/v_show/id_XNDcyNzU1MjkwNA==.html?spm=a2h0c.8166622.PhoneSokuUgc_1.dtitle

添加链接描述在这里插入图片描述

2、简单连连看(shworld)

玩法说明
按A键左移动
按B键右移动
按金手指T或H来选择

#MicroPython动手做(35)——体验小游戏
#简单连连看

from mpython import *
import random

#--------------------------------------------------------
#图片转换参考https://mpython.readthedocs.io/zh/master/tutorials/basics/oled.html#id3
#图片定义
#苹果
apple = bytearray([\
0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X01,0X80,0X00,0X00,0X01,0X80,0X18,0X70,0X01,
0X80,0X00,0X0C,0X01,0X80,0X00,0X03,0X01,0X84,0X01,0XC0,0X81,0X88,0X3F,0XF0,0X61,
0X98,0X3F,0XF8,0X31,0X90,0X3F,0XFC,0X31,0XB0,0X3F,0XFC,0X19,0XB0,0X3F,0XFE,0X19,
0XB0,0X0F,0XF6,0X19,0XB8,0X00,0X80,0X19,0XBC,0X00,0X00,0X19,0XBE,0X00,0X00,0X39,
0XBF,0X80,0X00,0X79,0XBF,0XE0,0X07,0XF9,0X9F,0XFF,0XFF,0XF9,0X9F,0XFF,0XFF,0XF1,
0X8F,0XFF,0XFF,0XF1,0X8F,0XFF,0XFF,0XE1,0X87,0XFF,0XFF,0XE1,0X83,0XFF,0XFF,0XC1,
0X81,0XFF,0XFF,0X81,0X81,0XFF,0XFF,0X01,0X80,0XFF,0XFE,0X01,0X80,0X7F,0XFC,0X01,
0X80,0X3F,0XF0,0X01,0X80,0X00,0X00,0X01,0X80,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,
])

#樱桃
cherry = bytearray([\
0XFF,0XFF,0XFF,0XFF,0X80,0XC0,0X00,0X01,0X81,0XC0,0X00,0X01,0X80,0XC0,0X00,0X01,
0X80,0XC0,0X00,0X01,0X80,0XA0,0X00,0X01,0X80,0X10,0X00,0X01,0X80,0X90,0X00,0X01,
0X80,0X88,0X00,0X01,0X80,0X8C,0X00,0X01,0X80,0X84,0X00,0X01,0X80,0X83,0X00,0X01,
0X80,0X81,0X80,0X01,0X80,0X00,0XCF,0X21,0X80,0X40,0X7F,0X11,0X80,0X79,0XFF,0X19,
0X87,0XFC,0XFF,0XF9,0X8F,0XFC,0X7F,0XF9,0X9F,0XF8,0X7F,0XFD,0XBF,0XF8,0X7F,0XFD,
0XBF,0XF8,0X7F,0XFD,0XBF,0XF8,0X7F,0XFD,0XBF,0XFF,0XFF,0XFD,0XBF,0XFF,0XFF,0XF9,
0XBF,0XFF,0XFF,0XF9,0XBF,0XFF,0XFF,0XF1,0XBF,0XFF,0XFF,0XF1,0X9F,0XFF,0XFF,0XE1,
0X8F,0XFF,0X9F,0X81,0X87,0XFF,0X00,0X01,0X81,0XFC,0X00,0X01,0XFF,0XFF,0XFF,0XFF,
])

#桑葚
mulberry = bytearray([\
0XFF,0XFF,0XFF,0XFF,0X80,0X21,0X00,0X01,0X80,0X10,0X00,0X01,0X81,0X08,0X80,0X01,
0X82,0X38,0X80,0X01,0X82,0X3F,0X80,0X01,0X82,0X3F,0XE0,0X01,0X86,0X3F,0XF0,0X01,
0X86,0X3F,0XF8,0X01,0X83,0XFF,0XFC,0X01,0X83,0XFF,0XFE,0X01,0X87,0XFF,0XFF,0X01,
0X8F,0XFF,0XFF,0X01,0X8F,0XFF,0XFF,0X01,0X8F,0XFF,0XFF,0X81,0X8F,0XFF,0XFF,0X81,
0X8F,0XFF,0XFF,0X81,0X8F,0XFF,0XFF,0X81,0X8F,0XFF,0XFF,0X81,0X87,0XFF,0XFF,0X81,
0X87,0XFF,0XFF,0X81,0X83,0XFF,0XFF,0XC1,0X81,0XFF,0XFF,0XC1,0X80,0XFF,0XFF,0XC1,
0X80,0XFF,0XFF,0XC1,0X80,0X7F,0XFF,0XC1,0X80,0X3F,0XFF,0X81,0X80,0X1F,0XFF,0X81,
0X80,0X0F,0XFF,0X81,0X80,0X03,0XFF,0X01,0X80,0X01,0XFC,0X01,0XFF,0XFF,0XFF,0XFF,
])

#草莓
strawberry = bytearray([\
0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X01,0X80,0X00,0X00,0X01,0X80,0X00,0X00,0X01,
0X80,0X00,0X00,0X01,0X80,0X00,0XC0,0X01,0X80,0X03,0XE8,0X01,0X80,0X0D,0XE4,0X01,
0X80,0X1F,0XFE,0X01,0X80,0X3F,0XFF,0X01,0X80,0X7F,0XFF,0X01,0X80,0XFF,0XDF,0X81,
0X81,0XFF,0XFF,0XF9,0X83,0XFF,0XFF,0XC1,0X83,0XFF,0XFF,0XC1,0X87,0XFF,0XFF,0XC1,
0X8F,0XFF,0XFF,0XE1,0X9F,0X7F,0XFF,0XE1,0XBF,0XFF,0XFF,0XE1,0XBF,0XFF,0XFF,0XE1,
0XBF,0XFE,0XFF,0XE1,0XBF,0XDF,0XFF,0XE1,0XBF,0XFF,0XFF,0XC1,0X9F,0XFF,0XFE,0XC1,
0X9F,0XFF,0XBF,0X81,0X8F,0XFF,0XFF,0X01,0X81,0XFF,0XFC,0X01,0X80,0X07,0XF0,0X01,
0X80,0X00,0X00,0X01,0X80,0X00,0X00,0X01,0X80,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,
])

#打勾
tick = bytearray([\
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X03,0XC0,0X00,0X00,0X03,
0XC0,0X00,0X00,0X03,0XC0,0X00,0X00,0X63,0XC0,0X00,0X00,0XE3,0XC0,0X00,0X01,0XE3,
0XC0,0X00,0X03,0XE3,0XC0,0X00,0X07,0XE3,0XC0,0X00,0X0F,0XE3,0XC0,0X00,0X1F,0XE3,
0XC0,0X00,0X1F,0XF3,0XC0,0X00,0X3F,0XF3,0XC0,0X00,0X7F,0XC3,0XC0,0X00,0X7F,0X83,
0XC0,0XC0,0XFF,0X03,0XC1,0XE0,0XFE,0X03,0XC7,0XE1,0XFC,0X03,0XCF,0XF1,0XF8,0X03,
0XCF,0XF3,0XF0,0X03,0XC3,0XFB,0XE0,0X03,0XC1,0XFF,0XC0,0X03,0XC0,0X7F,0X80,0X03,
0XC0,0X3F,0X80,0X03,0XC0,0X1F,0X00,0X03,0XC0,0X0E,0X00,0X03,0XC0,0X06,0X00,0X03,
0XC0,0X04,0X00,0X03,0XC0,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
])


#--------------------------------------------------------
#函数定义
#生成8个随机水果下标
#默认数组[0,1,2,3],循环2次,就有个8了,如何避免每次生成重复的呢,下面请看
def getFruitRand():
    fruitsIndex=[0,1,2,3]
    fruitsIndex_random=[]
    for i in range(2):                                 #对[0,1,2,3]循环2次加入到fruitsIndex_random中
        fruitsIndex_=fruitsIndex.copy()                #这里不直接用fruitsIndex,因为下面有del删除,我们拷贝一份副本
        for j in range(4):                             #循环4次
            rand=random.randint(0,len(fruitsIndex_)-1) #随机0-3,因j从0开始最大为3,而len(fruitsIndex)返回的是4,所以-1
            randIndex=fruitsIndex_[rand]               #取随机下标,范围在0-3中, fruitsIndex=[0,1,2,3]               
            fruitsIndex_random.append(randIndex)       #添加到fruitsIndex_random中
            del(fruitsIndex_[rand])                    #这里核心,添加完成后删除掉fruitsIndex中的内容                     
                                                       #删除掉后,随机就肯定不会出现重复的了
                                                       #比如每次都随机删除最后一个
                                                       #循环第一次fruitsIndex_长度为[0,1,2,3]
                                                       #循环第二次fruitsIndex_长度为[0,1,2]
                                                       #循环第三次fruitsIndex_长度为[0,1]
                                                       #循环第四次fruitsIndex_长度为[0]
                                                       #这样随机肯定不会重复
    #返回得到的8位随机水果下标fruitsIndex_random    
    return fruitsIndex_random
            
 

#显示8个水果图片
#isShow主要控制是否最后oled.show(),因为我可能会再show()之前插入一些文字
#fruitsIndex传输的8位随机水果下标,如[2,1,3,0,2,0,1,3]
def showFruit(fruitsIndex,isShow=True):
    i=0
    for index in fruitsIndex:                           #遍历fruitsIndex下标,i计次,从0开始
        if i<4:                                         #控制一行显示4个
            if index==-1:                               #下标为何出现-1,在其他函数中连连看完成会置下标-1
                oled.Bitmap(32*i, 0, tick, 32, 32, 1)   #显示打勾图片(x每次递增32,因为每张图32*32,屏宽128)
            else:                                       #否则显示水果图
                oled.Bitmap(32*i, 0, fruits[index], 32, 32, 1)  
        if i>=4:                                        #如果显示第5个图了,换行显示,y坐标变成32
            if index==-1:                               #以此类题,显示打勾图片
                oled.Bitmap(32*(i-4), 32, tick, 32, 32, 1)
            else:
                oled.Bitmap(32*(i-4), 32, fruits[index], 32, 32, 1)
        i=i+1                                           #i递增
    
    #是否显示输出
    if isShow:
        oled.show()

#按键A触发事件,向左移动判断
def on_button_a_down(_):
    global cursor_X,cursor_Y,chose1XY,isFinish  #引用全局变量
    time.sleep_ms(10)                           #防抖,可以不写 
    if button_a.value() == 1: return            #按钮按下状态
    if isFinish==True:                          #如果全部连完了,重新开始游戏
        start()
        return
    oled.fill(0)                                #清空屏幕显示        
    showFruit(fruitsIndex,False)                #显示水果,传入随机的8个水果下标
    cursor_X=cursor_X-32                        #全局光标坐标-32(因图片宽高为32)  
    if cursor_X<0 and cursor_Y==8:              #如果光标在第一行且X到最左端了,那么换到第二行最右侧
        cursor_X=100                            #换到第二行最右侧
        cursor_Y=40
    if cursor_X<4 and cursor_Y==40:             #如果光标在第二行且X在最左端了,那么换到第一行最右侧
        cursor_X=100
        cursor_Y=8
        
    if chose1XY:                                         #如果第1个位置已经选中状态
        oled.DispChar('选中', chose1XY[0], chose1XY[1])  #显示那个"光标"的文字位置
    oled.DispChar('光标', cursor_X, cursor_Y)            #否则显示"光标"文字
    oled.show()                                          #显示生效

    
#按键B触发事件,向右移动判断
def on_button_b_down(_):
    global cursor_X,cursor_Y,chose1XY,isFinish   #按键B与按键A没有区别,就是到极端时换行不同
    time.sleep_ms(10)
    if button_b.value() == 1: return
    if isFinish==True:
        start()
        return
    oled.fill(0)   
    showFruit(fruitsIndex,False)
    cursor_X=cursor_X+32
    if cursor_X>128 and cursor_Y==40:
        cursor_X=4
        cursor_Y=8
    if cursor_X>128 and cursor_Y==8:
        cursor_X=4
        cursor_Y=40
    
    if chose1XY :
        oled.DispChar('选中', chose1XY[0], chose1XY[1])
    oled.DispChar('光标', cursor_X, cursor_Y)
    oled.show()


#验证是否完成8个水果的连连看
def checkIsFinish():
    global isFinish                             #引用全局变量
    i=0                                         #初始化i变量
    for index in fruitsIndex:                   #遍历fruitsIndex下标情况
        if index==-1:                           #如果为-1,i递增(在其他函数中连连看完成会置下标-1)
            i=i+1
    if i>=8:                                    #如果i等于8说明8个连连看都完成了
        isFinish=True                           #置全局变量
        oled.fill(0)                            #清空屏幕显示
        oled.DispChar('恭喜您,通关了!', 28, 15) #填充文字
        oled.DispChar('按A或B重新开始', 22, 30) #填充文字
        oled.show()                             #显示生效
        
#通过金手指T和H来选择水果       
def choseFruit(cursor_X,cursor_Y):
    global fruitsIndex,chose1Index,chose2Index,chose1XY,chose2XY
    i=0
    for x,y in fruitXY:                         #遍历8张图的预定义坐标
        if cursor_X==x and cursor_Y==y:         #如果当前光标位置=预定义坐标位置,即可得到水果下标
            if fruitsIndex[i]==-1:              #如果光标位置下标为-1,说明已是打勾状态,不重复选中
                return                          #返回
            if chose1XY:                        #如果第1个位置已经选中状态             
                chose2XY=[x,y]                  #把光标位置赋给第2个选择位置
                chose2Index=fruitsIndex[i]      #同时得到水果下标
            else:
                chose1XY=[x,y]                  #否则赋值第1个选择位置
                chose1Index=fruitsIndex[i]      #同时得到水果下标
        i=i+1                                   #i递增         
    showFruit(fruitsIndex,False)                #显示水果,不立即显示生效
    
    if chose2XY:                                                             #如果第2个位置选中了,此时可进行匹配
        if chose1Index==chose2Index and chose1XY!=chose2XY:                  #如果位置1和位置2的下标相同且坐标不相同(否则连自身就匹配成功了)
            oled.line(chose1XY[0], chose1XY[1], chose2XY[0], chose2XY[1], 1) #画线,位置1到位置2
            oled.DispChar('成功', cursor_X, cursor_Y)                        #填充文字
            for i in range(len(fruitsIndex)):                                #遍历全局fruitsIndex,把该水果的下标置-1
                if fruitsIndex[i]==chose2Index:
                    fruitsIndex[i]=-1
            chose1XY=[]                                                      #清空位置1坐标
            chose2XY=[]                                                      #清空位置2坐标
            oled.show()                                                      #显示生效
            checkIsFinish()                                                  #检测是否全部匹配完成
    else:
        oled.DispChar('选中', cursor_X, cursor_Y)                            #否则继续显示"选中"文字
        oled.show()                                                          #显示生效
    
#开始游戏
def start():
    #引用全局变量并初始化默认值,因为重新开始游戏时必须初始化
    global fruitsIndex,cursor_X,cursor_Y,chose1XY,chose1Index,chose2XY,chose2Index,fruitsIndex,isFinish
    
    #初始化变量
    chose1XY=[]
    chose1Index=''
    chose2XY=[]
    chose2Index=''
    fruitsIndex=[]
    cursor_X=4
    cursor_Y=8
    isFinish=False
    
    oled.fill(0)                   #清空屏幕显示
    fruitsIndex=getFruitRand()     #获取随机的8个水果下标
    showFruit(fruitsIndex,False)   #第一次开始游戏先显示水果,传入8个随机水果下标
    oled.DispChar('光标', cursor_X, cursor_Y)   #第一次开始游戏,光标出现在默认的x,y4,8位置
    oled.show()                    #显示生效




#--------------------------------------------------------
#变量定义
fruits=[apple,cherry,mulberry,strawberry] #4个图片的bitmap数组
fruitsIndex=[]                            #水果的下标数组,用来存放随机的8个水果
fruitXY=[[4,8],[36,8],[68,8],[100,8],[4,40],[36,40],[68,40],[100,40]]  #8张图的预定义坐标,从左到右,从上到下

chose1XY=[]                               #位置1选择的水果坐标
chose1Index=''                            #位置1选择的水果下标

chose2XY=[]                               #位置2选择的水果坐标
chose2Index=''                            #位置2选择的水果下标

cursor_X=4                                #全局光标坐标,默认为第一个图的位置4,8(居中显示)
cursor_Y=8                               

isFinish=False                            #是否已完成

start()                                   #开始游戏



#--------------------------------------------------------
#按键监听
#按键A/B触发监视
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)

#通过金手指T和H来选择水果
while True:
    if(touchPad_T.read() < 100):
        choseFruit(cursor_X,cursor_Y)
    elif(touchPad_H.read() < 100):
        choseFruit(cursor_X,cursor_Y)

简单连连看

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

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

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

相关文章

《Kali渗透基础》12. 无线渗透(二)

kali渗透 1&#xff1a;无线协议栈1.1&#xff1a;ifconfig1.2&#xff1a;iwconfig1.3&#xff1a;iw1.4&#xff1a;iwlist 2&#xff1a;无线网卡配置2.1&#xff1a;查看无线网卡2.2&#xff1a;查看信道频率2.3&#xff1a;扫描附近 AP2.4&#xff1a;侦听接口添加与删除 …

物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)

文章目录 实验目的了解擒键的工作原理及电原理图 STM32F407中如何读取I/O的输入信号STM32F407对中断的编程方法通过轮询实现按键捕获实验如何利用已有内工程创建新工程通过轮询实现按键捕获代码实现及分析1 代码的流程分析2 代码的实现 Tips:下载错误的解决 实验目的 了解擒键…

Drools用户手册翻译——第四章 Drools规则引擎(十)复杂事件处理(CEP)

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 目录 ​编辑 …

Java课题笔记~ Mybatis注解开发

使用注解开发&#xff0c;可以减少Mapper映射文件的编写。 一、mybatis常用注解 Insert&#xff1a;实现新增 Update&#xff1a;实现更新 Delete&#xff1a;实现删除 Select&#xff1a;实现查询 Result&#xff1a;实现结果集封装 Results&#xff1a;可以与Result 一…

23款奔驰GLB200升级23P智能驾驶辅助系统,提升您的行车安全性

为什么要升级23P驾驶辅助系统呢&#xff1f;23P驾驶辅助系统功能有什么作用呢&#xff1f; 首先23P驾驶辅助系统功能有9个&#xff0c;相互结合让行车更安全&#xff0c;长途开车更轻松。提升驾驶的安全性。 所以选择装这套23P驾驶辅助系统的用户也比较多&#xff0c;现在道路…

屏蔽箱的种类、优点及使用场景介绍

屏蔽箱的用途是非常广泛的&#xff0c;能够屏蔽辐射电磁也可以阻隔电磁进入某一区域&#xff0c;达到屏蔽干扰信号的作用。屏蔽箱的种类是多样的&#xff0c;有着各自的优点。 按照应用领域屏蔽箱可分为以下几种&#xff1a; 1.电磁屏蔽箱&#xff1a;主要应用于电磁波测试和电…

【Jmeter】压测mysql数据库中间件mycat

目录 背景 环境准备 1、下载Jmeter 2、下载mysql数据库的驱动包 3、要进行测试的数据库 Jmeter配置 1、启动Jmeter图形界面 2、加载mysql驱动包 3、新建一个线程组&#xff0c;然后如下图所示添加 JDBC Connection Configuration 4、配置JDBC Connection Configurati…

洛谷P1918 保龄球

思路&#xff1a;要打多少个就在哪里打 比如要打100个&#xff0c;就在a数组中找出一个100&#xff0c;在那里打 所以可以用STL-map。 map大法好&#xff01;&#xff01;&#xff01; 用map存储每种 瓶子个数 最后出现的位置。 就是说&#xff0c;比如样例中&#xff1a;…

[C++项目] Boost文档 站内搜索引擎(2): 文档文本解析模块parser的实现、如何对文档文件去标签、如何获取文档标题...

项目开始的准备工作 在上一篇文章中, 已经从Boost官网获取了Boost库的源码. 相关文章: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍… 接下来就要编写代码了. 不过还需要做一些准备工作. 创建项目目录 所有的项目文件肯定要在一…

DTCC2023第十四届中国数据库大会分享:MySQL性能诊断平台:利用eBPF技术实现高效的根因诊断

主题 8月16-18日 DTCC2023第十四届中国数据库大会在北京国际会议中心召开&#xff0c;17日下午在云原生数据库开发与实践分论坛&#xff0c;我将带来分享&#xff1a;《MySQL性能诊断平台&#xff1a;利用eBPF技术实现高效的根因诊断》敬请期待&#xff01; 欢迎大家提前试用我…

深度学习Redis(5):集群

前言 在前面的文章中&#xff0c;已经介绍了Redis的几种高可用技术&#xff1a;持久化、主从复制和哨兵&#xff0c;但这些方案仍有不足&#xff0c;其中最主要的问题是存储能力受单机限制&#xff0c;以及无法实现写操作的负载均衡。 Redis集群解决了上述问题&#xff0c;实…

【积累】安装PLSQL工具遇到的那些问题~

报错提示没有正确安装 解决方案&#xff1a;是需要安装oracle client oracle下载地址&#xff1a;https://www.oracle.com/database/technologies/oracle-database-software-downloads.html 报错提示确认安装了32位的Oracle Client吗&#xff1f; 百度找解决方案&#xff1a…

Execution failed for task ‘:app:uploadCrashlyticsMappingFileRelease

新版本的Firebase crash 库打混淆后的正式环境包会报错&#xff1a; Execution failed for task :app:uploadCrashlyticsMappingFileRelease Caused by: java.lang.IllegalArgumentException: Host name may not be empty 解决方案&#xff1a; 在build.gradle android{}中…

如何编写一个易于维护的考试系统源码

编写一个易于维护的考试系统源码对于开发人员来说非常重要。一个易于维护的系统可以使代码更易于理解、修改和扩展&#xff0c;从而提高开发效率和系统稳定性。 第一步&#xff1a;良好的项目结构 良好的项目结构是一个易于维护的源码的基础。可以按照模块、功能或层次等方式…

uniapp 中过滤获得数组中某个对象里id:1的数据

// 假设studentData是包含多个学生信息的数组 const studentData [{id: 1, name: 小明, age: 18},{id: 2, name: 小红, age: 20},{id: 3, name: 小刚, age: 19},{id: 4, name: 小李, age: 22}, ]; // 过滤获取id为1的学生信息 const result studentData.filter(item > ite…

使用aidegen导入AOSP工程到Clion并配置toolchains

作者&#xff1a;Season3266 一、aidegen介绍 aidegen是AOSP中自带的一个工具&#xff0c;可以将源码中的某个工程导入进IDE&#xff0c;从而可以使用IDE的智能提示&#xff0c;提高编码效率。而源码中的工程并不是独立存在的&#xff0c;还会依赖其他工程中的各种模块&#x…

虚拟机技术

基础知识 虚拟机技术 虚拟机就是通过软件在宿主机上虚拟出一台计算机。虚拟机技术是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实体结构间的不可切割的障碍&#…

随笔--向量数据库的检索算法

文章目录 暴力搜索&#xff08;Flat&#xff09;聚类近似最近邻算法&#xff1a;ANN局部敏感哈希索引&#xff1a;LSH存储优化&#xff1a;&#xff08;量化&#xff09;聚类码本乘积量化索引&#xff1a;PQ层次导航小世界&#xff1a;HNSW 暴力搜索&#xff08;Flat&#xff0…

如何用cpolar创建隧道,实现外网访问内网?

如何用cpolar创建隧道&#xff0c;实现外网访问内网&#xff1f; 文章目录 如何用cpolar创建隧道&#xff0c;实现外网访问内网&#xff1f; 在安装和调试完本地的cpolar后&#xff0c;我们终于可以接触到cpolar的核心功能&#xff1a;建立一条专属于自己的数据通道&#xff0c…

dirsearch Web目录扫描器使用手册-新手入门指南

声明&#xff1a;该系列文章首发于公众号&#xff1a;Y1X1n安全&#xff0c;转载请注明出处&#xff01;本公众号所分享内容仅用于每一个爱好者之间的技术讨论及教育目的&#xff0c;所有渗透及工具的使用都需获取授权&#xff0c;禁止用于违法途径&#xff0c;否则需自行承担&…