# 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