|
|
'''
|
|
|
深圳市普中科技有限公司(PRECHIN 普中)
|
|
|
技术支持:www.prechin.net
|
|
|
PRECHIN
|
|
|
普中
|
|
|
|
|
|
实验名称:按键控制实验
|
|
|
接线说明:OLED(IIC)液晶模块-->ESP32 IO
|
|
|
VCC --> 5V
|
|
|
GND --> GND
|
|
|
SCL --> 18
|
|
|
SDA --> 23
|
|
|
|
|
|
按键模块-->ESP32 IO
|
|
|
K1 --> 14
|
|
|
|
|
|
实验现象:程序下载成功后,按下K1操作小恐龙的起跳
|
|
|
|
|
|
'''
|
|
|
# 导入
|
|
|
from machine import Pin, SoftI2C
|
|
|
from ssd1306 import SSD1306_I2C
|
|
|
import time, random
|
|
|
|
|
|
# 初始化IIC-OLED显示屏
|
|
|
i2c = SoftI2C(sda=Pin(23),scl=Pin(18))
|
|
|
oled = SSD1306_I2C(128,64,i2c,addr=0x3c)
|
|
|
|
|
|
# 创建按键对象
|
|
|
K1 = Pin(14,Pin.IN,Pin.PULL_UP)
|
|
|
|
|
|
# 创建游戏时间
|
|
|
get_time = time.time()
|
|
|
game_time = time.time()
|
|
|
|
|
|
# 刷新率为40,跳起时每秒加1
|
|
|
jump = 0
|
|
|
jump_num = [0,8,15,21,25,29,32,34,35] # 跳起高度
|
|
|
down = False # 用于判断jump自加还是自减
|
|
|
|
|
|
# 分数
|
|
|
score = 0
|
|
|
|
|
|
# 生命值
|
|
|
life = 3
|
|
|
|
|
|
# 判断游戏结束
|
|
|
game = True
|
|
|
|
|
|
# 距离
|
|
|
far = 0
|
|
|
|
|
|
# 障碍物:方块距离随机生成,30到50像素之间
|
|
|
box1 = random.randint(30,40)
|
|
|
box2 = random.randint(30,40) + box1
|
|
|
box3 = random.randint(30,40) + box2
|
|
|
box4 = random.randint(30,40) + box3
|
|
|
speed = 2 # 速度(障碍物每帧移动的像素点)
|
|
|
|
|
|
# 循环
|
|
|
while True:
|
|
|
if game:
|
|
|
# 触发跳起动作
|
|
|
if K1.value()==0 and jump == 0:
|
|
|
jump = 1
|
|
|
if jump != 0:
|
|
|
jump += 1 if not down else -1
|
|
|
if jump == 0:
|
|
|
down = False
|
|
|
score += 1
|
|
|
if jump == 8:
|
|
|
down = True # 跳到最高点下落
|
|
|
|
|
|
far += speed # 移动的距离按速度累加(实际是障碍物移动的距离)
|
|
|
|
|
|
oled.fill(0) # 清空屏幕显示
|
|
|
oled.line(0,63,128,63,1) # 底线(屏幕最下边游戏线条)
|
|
|
|
|
|
# 显示生命值、分数和时间
|
|
|
oled.text('LF:'+str(life),0,1)
|
|
|
oled.text('SC:'+str(score),45,1)
|
|
|
get_time = 'S:'+str(int(time.time()-game_time))
|
|
|
oled.text(get_time,95,1)
|
|
|
|
|
|
#画小恐龙的外形
|
|
|
for i in range(6):
|
|
|
oled.line(15-i,51-jump_num[jump],15-i,58-jump_num[jump],1)
|
|
|
oled.line(17-i,51-jump_num[jump],17-i,54-jump_num[jump],1)
|
|
|
oled.line(11-i,55-jump_num[jump],11,58-jump_num[jump],1)
|
|
|
oled.line(14,55-jump_num[jump],14,60-jump_num[jump],1)
|
|
|
oled.line(10,55-jump_num[jump],10,60-jump_num[jump],1)
|
|
|
oled.line(14,52-jump_num[jump],14,53-jump_num[jump],0)
|
|
|
oled.line(13,52-jump_num[jump],13,53-jump_num[jump],0)
|
|
|
|
|
|
#画障碍物
|
|
|
for i in range(8):
|
|
|
oled.line(i+box1-far,55,i+box1-far,61,1)
|
|
|
|
|
|
for i in range(8):
|
|
|
oled.line(i+box2-far,55,i+box2-far,61,1)
|
|
|
|
|
|
for i in range(8):
|
|
|
oled.line(i+box3-far,55,i+box3-far,61,1)
|
|
|
|
|
|
for i in range(8):
|
|
|
oled.line(i+box4-far,55,i+box4-far,61,1)
|
|
|
|
|
|
#判断当前障碍物过了屏幕,就把它变最后一个
|
|
|
if box1+8-far <= 0:
|
|
|
box1 = box2
|
|
|
box2 = box3
|
|
|
box3 = box4
|
|
|
box4 = box3 + random.randint(30,40)
|
|
|
|
|
|
#判断是否碰到障碍物
|
|
|
if 14 > box1-far > 2 and 60-jump_num[jump] > 55:
|
|
|
life -= 1
|
|
|
if life:
|
|
|
jump = 0
|
|
|
far = 0
|
|
|
box1 = random.randint(30, 40)
|
|
|
box2 = random.randint(30, 40) + box1
|
|
|
box3 = random.randint(30, 40) + box2
|
|
|
box4 = random.randint(30, 40) + box3
|
|
|
else:
|
|
|
game = False
|
|
|
score = 0
|
|
|
|
|
|
else:
|
|
|
oled.fill_rect(0,1,45,10,0)
|
|
|
oled.text('LF:'+str(life),0,1)
|
|
|
oled.text('SC:'+str(score),45,1)
|
|
|
oled.text('GAME_OVER',128//2-40,30)
|
|
|
# 游戏结束之后,再次按下按键等待两秒钟再重新开始游戏
|
|
|
if K1.value()==0:
|
|
|
time.sleep(2)
|
|
|
game_time = time.time()
|
|
|
game = True
|
|
|
far = 0
|
|
|
life = 3
|
|
|
box1 = random.randint(30,40)
|
|
|
box2 = random.randint(30,40) + box1
|
|
|
box3 = random.randint(30,40) + box2
|
|
|
box4 = random.randint(30,40) + box3
|
|
|
speed = 2
|
|
|
continue
|
|
|
|
|
|
time.sleep(1/40)
|
|
|
oled.show()
|
|
|
|