from time import sleep
from ili934xnew import ILI9341, color565
#from ili93412 import Display as ILI9341, color565
from machine import Pin, SPI
from utime import ticks_ms, sleep_ms
import framebuf
class Game:
def __init__(self):
# === Display Setup ===
self.spi = SPI(0, baudrate=40000000, sck=Pin(6), mosi=Pin(7), miso=Pin(16))
self.oled = ILI9341(self.spi, dc=Pin(15), cs=Pin(13), rst=Pin(14), w=320, h=240, r=0)
#self.oled = ILI9341(self.spi, cs=Pin(13), dc=Pin(15), rst=Pin(14))
#self.oled.fill_rectangle(0, 0, 240, 320, color565(255,128,128))
for x in range(255):
self.oled.fill_rectangle(128, x-16, 16, 16, color565(0,0,x))
self.oled.fill_rectangle(128, x, 16, 16, color565(0,0,x))
self.oled.reset()
# === Input Pins ===
self.up = Pin(18, Pin.IN, Pin.PULL_UP)
self.right = Pin(19, Pin.IN, Pin.PULL_UP)
self.left = Pin(20, Pin.IN, Pin.PULL_UP)
self.down = Pin(21, Pin.IN, Pin.PULL_UP)
# === Game State ===
self.xp = 0
self.yp = 16
self.x = 0
self.y = 0
self.score = 0
self.animation_counter = 0
self.cu = self.cd = self.cl = self.cr = 0
# === Sprites ===
self.g1 = bytearray([
0b00000000,
0b10101111,
0b11001111,
0b11101111,
0b00000000,
0b11111010,
0b11111100,
0b11111110
])
self.en2 = bytearray([
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00111100,
0b01011010,
0b01111110,
0b00110110
])
self.poud = [
bytearray([
0b00000000,
0b00000000,
0b00000000,
0b00011000,
0b00010000,
0b00011000,
0b00111100,
0b00011000
]),
bytearray([
0b00000000,
0b00000000,
0b00000000,
0b00011000,
0b00010000,
0b00011000,
0b00111100,
0b00001000
]),
bytearray([
0b00000000,
0b00000000,
0b00000000,
0b00011000,
0b00010000,
0b00011000,
0b00111100,
0b00010000
]),
bytearray([
0b00000000,
0b00000000,
0b00000000,
0b00011000,
0b00001000,
0b00011000,
0b00111100,
0b00011000
])
]
bk = [0x00, 0x00] # Black
bn = [0xCC, 0x00] # Brown
rd = [0xFF, 0x00] # Red
pe = [0x66, 0x00] # Purple
gy = [0x44, 0x00] # Gray
be = [0x44, 0x00] # Blue
yw = [0x11, 0x00] # yellow
self.p1 = bytearray(
bk + bk + bk + bk + bk + rd + rd + rd + rd + rd + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + rd + rd + rd + rd + rd + rd + rd + rd + bk + bk + bk + bk +
bk + bk + bk + bk + bn + bn + bn + pe + pe + bk + pe + bk + bk + bk + bk + bk +
bk + bk + bk + bn + pe + bn + bn + pe + pe + bk + pe + pe + pe + bk + bk + bk +
bk + bk + bk + bn + pe + bn + bn + bn + pe + pe + bk + pe + pe + pe + bk + bk +
bk + bk + bk + bn + bn + pe + pe + pe + pe + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + pe + pe + pe + pe + pe + pe + pe + bk + bk + bk + bk +
bk + bk + bk + bk + rd + rd + be + rd + rd + rd + rd + bk + bk + bk + bk + bk +
bk + bk + bk + rd + rd + rd + be + rd + rd + be + rd + rd + rd + bk + bk + bk +
bk + bk + rd + rd + rd + rd + be + be + be + be + rd + rd + rd + rd + bk + bk +
bk + bk + bk + bk + bk + bk + yw + be + be + yw + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + rd + rd + rd + bk + bk + bk + bk + rd + rd + rd + bk + bk + bk
)
self.gr = bytearray(
bk + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + bk +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
bk + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + bk
)
self.en = bytearray(
bk + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + bk +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + be + be + be + bk + bk + bk + bk + be + be + be + bk + bk + rd +
rd + bk + bk + be + be + be + bk + bk + bk + bk + be + be + be + bk + bk + rd +
rd + bk + bk + be + be + be + bk + bk + bk + bk + be + be + be + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
rd + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + bk + rd +
bk + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + bk
)
self.p = [
bytearray(
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + rd + rd + bk + bk + bk +
bk + bk + bk + pe + bk + bk + bk + bk +
bk + bk + bk + be + be + bk + bk + bk +
bk + bk + be + rd + rd + be + bk + bk +
bk + bk + bk + be + be + bk + bk + bk
),
bytearray(
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + rd + rd + bk + bk + bk +
bk + bk + bk + pe + bk + bk + bk + bk +
bk + bk + bk + be + be + bk + bk + bk +
bk + bk + be + rd + rd + be + bk + bk +
bk + bk + bk + bk + be + bk + bk + bk
),
bytearray(
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + rd + rd + bk + bk + bk +
bk + bk + bk + pe + bk + bk + bk + bk +
bk + bk + bk + be + be + bk + bk + bk +
bk + bk + be + rd + rd + be + bk + bk +
bk + bk + bk + be + bk + bk + bk + bk
),
bytearray(
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + bk + bk + bk + bk + bk +
bk + bk + bk + rd + rd + bk + bk + bk +
bk + bk + bk + bk + pe + bk + bk + bk +
bk + bk + bk + be + be + bk + bk + bk +
bk + bk + be + rd + rd + be + bk + bk +
bk + bk + bk + be + be + bk + bk + bk
),
]
# === Level ===
self.level = [
[""] * 30,
[""] * 30,
[""] * 30,
[""] * 30,
[""] * 30,
[""] * 30,
[""] * 30,
[self.gr] * 30
]
#[self.gr, self.gr, self.gr, self.gr, "", "", self.gr, self.gr, self.gr, self.gr, self.gr, self.gr, "", "", "", "", "", "", ""],
#[self.gr, self.gr, self.gr, self.gr, "", "", "", self.gr, "", self.gr, self.gr, self.gr, "", "", "", "", "", "", ""],
#[self.gr, self.gr, self.gr, self.gr, "", "", "", self.gr, self.gr, self.gr, self.gr, self.gr, "", "", "", "", "", "", ""]
#]
#["", "", "", "", "", "", self.gr, "", "", "", "", "", self.gr, "", "", "", "", "", ""],
self.enemies = [[0, 4], [2, 4]]
def get_tile(self, x, y):
if 0 <= y < len(self.level) and 0 <= x < len(self.level[y]):
return self.level[y][x]
return "out"
def update_input(self):
ux = round(-self.xp / 16) + 16
uy = round(-self.yp / 16) + 10
self.cur_bl = self.get_tile(ux, uy)
self.nxt_bl_u = self.get_tile(ux, uy - 1)
self.nxt_bl_d = self.get_tile(ux, uy + 1)
self.nxt_bl_l = self.get_tile(ux - 1, uy)
self.nxt_bl_r = self.get_tile(ux + 1, uy)
if self.cd == 0 and self.nxt_bl_d == "" and self.cu == 0:
self.y = -16
self.cd = 1
if self.cl == 0 and self.nxt_bl_l == "" and not self.left.value():
self.x = 16
self.cl = 1
if self.cr == 0 and self.nxt_bl_r == "" and not self.right.value():
self.x = -16
self.cr = 1
if self.cu == 0 and self.cd == 0 and self.nxt_bl_u == "" and not self.up.value():
self.y = 32
self.cu = 1
def move_player(self):
self.xp += self.x
self.yp += self.y
if self.cl > 0: self.cl -= 1
if self.cr > 0: self.cr -= 1
if self.cu > 0: self.cu -= 1
if self.cd > 0: self.cd -= 1
if self.cl == 0 and self.cr == 0 and self.xp % 16 == 0:
self.x = 0
if self.cu == 0 and self.cd == 0 and self.yp % 16 == 0:
self.y = 0
if self.cd > 0 and self.nxt_bl_d != "" and self.yp % 16 == 0:
self.cd = 0
self.y = 0
if self.cur_bl != "":
self.yp += 16
def check_enemy_collision(self):
ux = round(-self.xp / 16) + 16
uy = round(-self.yp / 16) + 10
for enemy in self.enemies[:]:
if enemy[0] == ux and enemy[1] == uy:
self.enemies.remove(enemy)
self.score += 1
def draw(self):
#self.oled.reset()
#self.oled.draw_text8x8(0, 0, str(self.score), color565(255, 0, 0))
#self.oled.chars(str(self.score), 0, 0)
for row_idx, row in enumerate(self.level):
for col_idx, sprite in enumerate(row):
xa = self.xp + (col_idx * 16)
ya = self.yp + (row_idx * 16) - 16
if sprite != "":
#self.oled.blit(framebuf.FrameBuffer(sprite, 16, 16, framebuf.RGB565), xa, ya, 16, 16)
self.oled.fill_rectangle(xa, ya, 16, 16, color565(0,255,0))
for enemy in self.enemies:
if col_idx == enemy[0] and row_idx == enemy[1]:
self.oled.fill_rectangle(xa, ya, 16, 16, color565(255,0,0))
#self.oled.blit(framebuf.FrameBuffer(self.en, 16, 16, framebuf.RGB565), xa, ya, 16, 16)
#buf = bytearray(240 * 320 * 1) # 128 bytes
#self.oled.blit(framebuf.FrameBuffer(buf, 240, 320, framebuf.MONO_HLSB), 0, 0, 240, 320)
#self.oled.fill_rectangle(0, 0, 240, 320, color=1)
#self.oled.erase()
#self.oled.blit(framebuf.FrameBuffer(self.p1, 16, 16, framebuf.RGB565), 64, 24, 16, 16)
self.oled.fill_rectangle(128, 48, 16, 16, color565(0,0,255))
#self.oled.blit(framebuf.FrameBuffer(self.p[self.animation_counter], 8, 8, framebuf.RGB565), 64, 32, 8, 8)
#self.oled.reset()
def run(self):
FPS = 60
FRAME_TIME = 1000 // FPS
while True:
start = ticks_ms()
self.update_input()
self.move_player()
self.check_enemy_collision()
self.animation_counter = (self.animation_counter + 1) % 4
#self.oled.fill_rectangle(0, 0, 240, 320, color565(255,128,128))
self.oled.erase()
self.draw()
# Frame limiting
#elapsed = ticks_ms() - start
#if elapsed < FRAME_TIME:
#sleep_ms(FRAME_TIME - elapsed)
# === Run Game ===
game = Game()
game.run()