# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
from machine import Pin,SoftI2C,ADC,Timer
from ssd1306 import SSD1306_I2C
import time
import random
Flage = True
#oled Init
i2c = SoftI2C(scl = Pin(22),sda = Pin(21))
oled = SSD1306_I2C(128,64,i2c)
#adc init
adcx = ADC(Pin(32))
adcy = ADC(Pin(33))
adcx.atten(ADC.ATTN_11DB)
adcy.atten(ADC.ATTN_11DB)
#读取并计算坐标作为初始坐标
x = adcx.read()
y = adcy.read()
x_last = int(x/4095*121)+3
y_last = int(y/4095*49)+11
#障碍物 坐标 滚动位置
X_rect = []
Y_rect = [0,-5,-10,-15,-20,-25,-30,-35,-40]
Y_scoll = 0
barrier_pos = [] #出现在屏幕上的障碍物起始坐标
#小飞机相对于中心的坐标用于判断相撞
plane_place =[[0,-2],[0,-1],[-1,0],[1,0],[-2,-1],[2,-1],[-1,2],[1,2]]
#障碍生成滚动函数
"""
*生成一定数量的障碍物并滚动障碍物
*@pram num 同时出现的障碍物数量
"""
def barrier_create_sroll(num = 1):
#全局变量引用
global Flage
global Y_scoll
global barrier_pos
barrier_pos.clear() #清空列表用于记录
#生成障碍物的坐标列表
if Flage == True:
X_rect.clear()
Y_rect.clear()
for i in range(0,num):
X_rect.append(random.randrange(1,119))
if i == num-1: Flage = False
for i in range(-5*num,1,5):
Y_rect.append(i)
#绘制障碍物
for i,j in zip(X_rect,Y_rect):
if j+8+Y_scoll>8:
barrier_pos.append([i,j+8+Y_scoll]) #记录障碍物坐标
oled.fill_rect(i,j+8+Y_scoll,7,2,1)
#滚动标志位判断
if Y_scoll + min(Y_rect) >= 63:
Y_scoll = 0
Falge = True
"""
* 在坐标(X,Y) 画/擦除 一个小飞机
*@pram X 小飞机的x中心坐标
Y 小飞机的y中心坐标
"""
def draw_plane(x,y,col):
oled.vline(x-1,y,3,col)
oled.vline(x,y-2,3,col)
oled.vline(x+1,y,3,col)
oled.hline(x-2,y+1,5,col)
"""
*碰撞判断函数
"""
def collide_judge(obj_x,obj_y):
for i,j in barrier_pos:
for offset in range(0,7):
if [i-obj_x+offset,j-obj_y] in plane_place:
return True
return False
#定时器回调函数
def handler_timer(timer):
global Y_scoll
Y_scoll += 2
#游戏区域清屏
oled.fill_rect(1,9,126,54,0)
#障碍物绘制及滚动
barrier_create_sroll(15)
#有tm的BUG
tim = Timer(0)
tim.init(period=1000,callback = handler_timer)
#游戏区域绘制
oled.rect(0,8,128,56,1)
while True:
oled.fill_rect(1,9,126,54,0)
Flage = True
X_rect.clear()
Y_rect.clear()
barrier_pos.clear()
Y_scoll = 0
while True:
#记录的ADC值清零
x = 0
y = 0
#读取遥杆ADC值转换成坐标 连续读取10次平均值滤波
for i in range(0,10):
x += adcx.read()
y += adcy.read()
x_now = int(x//10/4095*121)+3
y_now = int(y//10/4095*49)+11
#数据区域清屏
oled.fill_rect(0,0,128,8,0)
oled.text(f'X={x_now-3:3d} Y={y_now-11:2d}',0,0) #当前飞机位置中心坐标
#小飞机位置数据更新 及绘制
if [x_last,y_last] != [x_now,y_now]: draw_plane(x_last,y_last,0) #如果飞机移动位置清除之前的绘制的小飞机
draw_plane(x_now,y_now,1) #新的位置绘制小飞机
#保存上一次的位置
x_last = x_now
y_last = y_now
if collide_judge(x_now,y_now) == True: break
#刷新显示
oled.show()
time.sleep_ms(10)
#游戏结束提示
oled.text("You lose!",28,37,1)
oled.show()
time.sleep(2)
Loading
ssd1306
ssd1306