JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Raspberry Pi Pico MicroPython スカッシュゲーム

2022-02-23 22:14:21 | Raspberry Pi Pico
 Raspberry Pi Picoに2.2インチTFTを接続し、MicroPythonでプログラミングして、懐かしい「スカッシュゲーム」を作ってみました。
 接続回路図です。



 ブレッドボードです。


 ラケットを操作する左ボタン(L Button)と右ボタン(R Button)は別なブレッドボードに取り付けました。

 ゲーム画面です。上にスコアを表示しています。
 ボールは、10×9ドットで、X方向24、Y方向30ステップで移動します。



 ゲームオーバー画面です。

スクリプトです。main.pyとしてPicoに保存します。
なお、以前にアップしたTFT表示テスト1及びテスト2を参考にして、
Picoに、ili9341.pyとxglcd_font.pyを保存し、
pico内のfontというフォルダにUnispace12x24.cとBroadway17x15.cを保存しておきます。
---------------------------------------------------------------------------------
"""
Raspberry Pi Pico MicroPython
Squash game
2022.2.23
JH7UBC Keiji Hata
"""

from machine import Pin, SPI
import ili9341
from xglcd_font import XglcdFont
import utime
from random import random, seed

#Button設定
Button_L = Pin(4,Pin.IN,Pin.PULL_UP)
Button_R = Pin(5,Pin.IN,Pin.PULL_UP)

#SPI設定
TFT_CLK_PIN = const(6)
TFT_MOSI_PIN = const(7)
TFT_MISO_PIN = const(4)
TFT_CS_PIN = const(13)
TFT_RST_PIN = const(14)
TFT_DC_PIN = const(15)

spiTFT = SPI(0, baudrate=51200000,
                 sck=Pin(TFT_CLK_PIN), mosi=Pin(TFT_MOSI_PIN))
display = ili9341.Display(spiTFT,dc=Pin(TFT_DC_PIN),
             cs=Pin(TFT_CS_PIN), rst=Pin(TFT_RST_PIN),
             width=240, height=320,rotation=0)
#フォントの設定
unispace = XglcdFont('fonts/Unispace12x24.c', 12, 24)
broadway = XglcdFont('fonts/Broadway17x15.c',17,15)

#score枠を描く
def display_score_bar():
     display.fill_hrect(0,0,240,20,ili9341.color565(255,255,255))
     display.draw_text(70,3,'score',broadway,ili9341.color565(0,0,255),
                   background=ili9341.color565(255,255,255))

#score表示
def display_score(s):
     display.fill_hrect(130,0,100,9,ili9341.color565(255,255,255))
     s_text = str(s)
     len_s=len(s_text)
     for i in range(4-len_s):
        s_text='0'+s_text
     display.draw_text(130,3,s_text,broadway,ili9341.color565(0,0,255),
                   background=ili9341.color565(255,255,255))

#ラケットを描く
def display_racket():
     global prev_rx,rx
     display.fill_hrect(prev_rx*10,310,50,9,0)
    display.fill_hrect(rx*10,310,50,9,ili9341.color565(255,255,255))
     prev_rx=rx

#ボールを描く
def display_ball(x,y):
     global prev_x,prev_y
     display.fill_hrect(prev_x*10,prev_y*10,10,10,0)
     display.fill_hrect(x*10,y*10,10,9,ili9341.color565(255,255,0))
     prev_x = x
     prev_y = y

#初期画面表示
start_Flag=0
display.draw_text(60,110,'Squash Game',unispace,ili9341.color565(255,255,0))
display.draw_text(20,150,'Push L or R Button',unispace,ili9341.color565(0,255,255))

#ボールのスピード設定(値を小さくすると速くなる)
speed=50

#メインループ
while True:
     if start_Flag == 0:
         #LまたはRボタンが押されるまで待つ
         while Button_L.value()==1 and Button_R.value()==1:
             pass
         start_Flag = 1
         display.clear()
        display_score_bar()
         score = 0
         display_score(score)
         rx=10
         prev_rx=rx
         display_racket()
         bx=10
         by=10
         #方向をランダムに決める
         direction=int(random()*4)
         if direction == 0:
             dx=1
             dy=1
         elif direction == 1:
             dx=1
             dy=-1
         elif direction == 2:
             dx=-1
             dy=1
         elif direction == 3:
             dx=-1
             dy=-1
         prev_x=bx
         prev_y=by
         display_ball(bx,by)

     else:
         #ボールを動かす
         #X方向に動かす
         bx = bx + dx
         if bx < 0 or bx > 23:#bx<0 またはbx>23なら
             bx = bx -dx#一つ戻す
             dx = -dx#方向を変える
             bx = bx + dx
         #Y方向に動かす
         by = by + dy
         if by<2:
             by = by - dy#一つ戻す
             dy = -dy#方向を変える
             by = by + dy
         if by == 31:
             if bx >= rx and bx <= rx+4:
                by = by - dy#一つ戻す
                dy = -dy#方向を変える
                 by = by + dy
                score = score + 1
                display_score(score)
             else:
                start_Flag=0
                display.draw_text(70,150,'GAME OVER',unispace,ili9341.color565(255,0,0))
                utime.sleep(0.5)
                while Button_L.value()==1 and Button_R.value()==1:
                    pass
         #ラケットを動かす
         if Button_L.value() == 0:
             rx=rx-1
             if rx<=0:
                rx=0
             display_racket()
         if Button_R.value() == 0:
             rx=rx+1
             if rx > 19:
                rx=19
             display_racket()

         display_ball(bx,by)
         utime.sleep_ms(speed)
---------------------------------------------------------------------------------
 とりあえず、ボールが動いてゲームができる状態です。
 音を出したり、スピードをボタンで変えられるようにしたり、改良点はたくさんあります。これを参考にしてオリジナルのゲームを作ってみてください。

 最初、ボールの動きをタイマー割込みを利用して行おうと実験しましたが、ラケットの表示に乱れが出てしまい、断念しました。後でまたチャレンジしてみようと思います。


最新の画像もっと見る

コメントを投稿