from ili9341 import Display
from machine import Pin, SPI, ADC
from maps import mazes
import time
from keypad import Keypad
# Keypad 設定
row_pins = [12, 13, 14, 27]
col_pins = [32, 33, 25, 26]
keys = [
['1', '2', '3', 'A'],
['4', '5', '6', 'B'],
['7', '8', '9', 'C'],
['*', '0', '#', 'D']
]
keypad = Keypad(row_pins, col_pins, keys)
# 螢幕初始化
spi = SPI(2, baudrate=40000000, sck=Pin(18), mosi=Pin(23))
display = Display(spi, dc=Pin(2), cs=Pin(15), rst=Pin(4))
# 顯示密碼畫面
def wait_for_password(correct="1234"):
input_code = ""
display.clear()
display.draw_text8x8(80, 220, "Enter Password:", 0xFFFF, 0x0000, rotate=180)
while True:
key = keypad.scan()
if key:
if key == '#': # 清除
input_code = ""
display.fill_rectangle(40, 200, 200, 20, 0x0000)
elif key == '*': # 確認
if input_code == correct:
display.draw_text8x8(80, 180, "Access Granted", 0x07E0, 0x0000, rotate=180)
time.sleep(1)
return
else:
display.draw_text8x8(80, 180, "Wrong Password", 0xF800, 0x0000, rotate=180)
time.sleep(1)
display.fill_rectangle(40, 180, 200, 40, 0x0000)
input_code = ""
elif len(input_code) < 8:
input_code += key
display.draw_text8x8(160, 200, "*" * len(input_code), 0xFFFF, 0x0000, rotate=180)
time.sleep(0.1)
# 遊戲相關初始化
x_adc = ADC(Pin(34))
y_adc = ADC(Pin(35))
x_adc.atten(ADC.ATTN_11DB)
y_adc.atten(ADC.ATTN_11DB)
CELL_SIZE = 12
player_radius = 3
player_x = 1
player_y = 1
current_level = 0
maze = mazes[current_level]
def draw_maze():
display.clear()
for y, row in enumerate(maze):
for x, val in enumerate(row):
color = 0xFFFF if val == 1 else 0x0000
if val == 2:
color = 0x07E0
display.fill_rectangle(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE, color)
def draw_player(x, y, color):
cx = x * CELL_SIZE + CELL_SIZE // 2
cy = y * CELL_SIZE + CELL_SIZE // 2
display.fill_circle(cx, cy, player_radius, color)
def can_move(x, y):
return 0 <= y < len(maze) and 0 <= x < len(maze[0]) and maze[y][x] != 1
def load_next_level():
global current_level, maze, player_x, player_y
current_level = (current_level + 1) % len(mazes)
maze = mazes[current_level]
player_x, player_y = 1, 1
draw_maze()
draw_player(player_x, player_y, 0xF800)
def load_previous_level():
global current_level, maze, player_x, player_y
current_level = (current_level - 1) % len(mazes)
maze = mazes[current_level]
player_x, player_y = 1, 1
draw_maze()
draw_player(player_x, player_y, 0xF800)
def reset_game():
global current_level, maze, player_x, player_y
current_level = 0
maze = mazes[current_level]
player_x, player_y = 1, 1
draw_maze()
draw_player(player_x, player_y, 0xF800)
def reset_player():
global player_x, player_y
draw_player(player_x, player_y, 0x0000)
player_x, player_y = 1, 1
draw_player(player_x, player_y, 0xF800)
# 輸入正確密碼才能開始
wait_for_password("1234")
# 開始遊戲
draw_maze()
draw_player(player_x, player_y, 0xF800)
last_move_time = time.ticks_ms()
while True:
now = time.ticks_ms()
if time.ticks_diff(now, last_move_time) < 150:
continue
# 檢查鍵盤輸入
key = keypad.scan()
if key:
if key == 'D':
reset_game()
last_move_time = now
time.sleep(0.1)
continue
elif key == 'A':
load_previous_level()
last_move_time = now
time.sleep(0.1)
continue
elif key == 'B':
load_next_level()
last_move_time = now
time.sleep(0.1)
continue
elif key == 'C':
reset_player()
last_move_time = now
time.sleep(0.1)
continue
x_val = x_adc.read()
y_val = y_adc.read()
new_x, new_y = player_x, player_y
if x_val < 1800:
new_x -= 1
elif x_val > 3200:
new_x += 1
elif y_val > 3200:
new_y += 1
elif y_val < 1800:
new_y -= 1
if can_move(new_x, new_y):
draw_player(player_x, player_y, 0x0000)
player_x, player_y = new_x, new_y
draw_player(player_x, player_y, 0xF800)
last_move_time = now
if maze[player_y][player_x] == 2:
time.sleep(0.3)
load_next_level()啟動後等待約10s
輸入密碼(1234)
確認鍵為*
清除鍵為#
地圖刷新後點搖桿 上下左右鍵控制
A(上一張地圖)
B(下一張地圖)
C(回到起始點)
D(遊戲重新開始)