たまこんブログ

学生×プログラミング→2020年3月ブログ開設!趣味の一環でPythonでつくったゲーム や自分が読んで役に立った 本、知識などを紹介しています!

初心者がPythonで作ったゲームver1 完成!

前回のを改良して、パロディーゲームを作りました!
内容としては、落ちてくる自分のアイコンにかつらをはめます!



tamakon3.hatenablog.com

ゲームルール

  • 10秒の間にかつらをはめてください
  • 3コはめるとタイムが+2秒されます
  • なるべく多くのかつらをはめてください。

ダウンロード

こちらからダウンロードできます
drive.google.com

実行環境

Python 3.7で動きます

実行結果

f:id:tamakon3:20200429225708g:plain

プログラム解説

import tkinter as tk
import tkinter.messagebox
import random
key=""
def key_down(e):    #キーが押された時に行う処理
    global key
    key=e.keysym    #keysymには押されたキーの情報が入る
def key_up(e):      #キーが離された時に行う処理
    global key
    key=""          #キーが離された時、キーの情報を空にする
tmr=100             #ゲームのタイマー=100ミリ秒=10秒
x=400               #アイコンのx座標の初期位置
y=295               #アイコンのy座標の初期位置
maxkatura=5         #降ってくるかつらの最大数
kX=[200,400,100,300,500]
for i in range (0,maxkatura-1):     #かつらの最大数までループさせる
    kX[i]=random.randint(0,55)*10   #各かつらのx座標を乱数できめる
kY=[0,0,0,0,0]                      #かつらのy座標の初期位置
kY_zoubun=[14,7,8,10,5]
score=0


def mainA():                    #キー操作でキャラクターを動かす。
    global x,y      

    if key=="Left":             #左のキーがおされたらキャラのx座標を-10する
        x=x-10          
    if key=="Right":            #右のキーがおされたらキャラのx座標を-10する
        x=x+10          
    canvas.coords("MYCHR",x,y)  #指定された座標にキャラを配置
    root.after(30,mainA)        #30ミリ秒ごとにmainAを呼ぶ

def KATURA():
    global kX,kY,score,tmr      #global変数を定義
    flag_hit=False              #かつらがハマったかどうかの初期判定をfalseにする
    for i in range(0,maxkatura): 
        kY[i]=kY[i]+kY_zoubun[i] #各かつらのy座標を計算
        tagkatura="katura"+str(i) #tagkaturaの名前を生成
        canvas.coords(tagkatura,kX[i],kY[i]) #生成したtagkaturaのx,y座標を指定、表示
        if kY[i]==280:          #かつらのy座標が280ならば
            if x==kX[i]:        #かつらのx座標とキャラのx座標が一致したならば
                score=score+1   #スコア+1する
                if score%2==0:  #2点取るごとに(スコアを2で割った余りが0ならば)
                    if score != 0:  #スコアが0点以外ならば
                        tmr=tmr+20  #+2秒する
                flag_hit=True    #かつらがハマったかどうかの判定をtrueにする
                
        if kY[i]>400:           #かつらのy座標が400より大きくなったら    
            kY[i]=0             #かつらのy座標を0にする
            kX[i]=random.randint(0,55)*10     #次のかつらのx座標を乱数で計算する
    lblscore["text"]= "score: "+str(score)    #スコア表示
    if flag_hit==True:          #かつらがはまったら
        speed=500               #0.5秒待たせる
    else:   
        speed=20                #0.02秒待たせる

    root.after(speed,KATURA)    #指定した時間ごとにKATURAを実行させる    
def RTA():
    global tmr,score
    if tmr == 0:                #timerが0になったら
        
        tkinter.messagebox.showinfo("終了","おわりです") #メッセージを表示
        tmr=100                 #timerを100にして
        score=0                 #スコアを0にする
    tmr=tmr-1                   #timerを減らす
    lbltimer["text"]= "timer: "+str(tmr/10)     #timerを表示
    if tmr < 30 :                               #3秒きったら
        lbltimer["foreground"]="#ff0000"        #文字の色を赤にする
    else:
        lbltimer["foreground"]="#000000"        #文字の色を黒にする
    
    root.after(100,RTA)                         #0.1秒ごとにtimer処理を実行する

root=tkinter.Tk()
root.title("かつら返せ")
root.bind("<KeyPress>",key_down)                                    #keyが押された時に行う処理を指定。
root.bind("<KeyRelease>",key_up)                                    #keyが離された時に行う処理を指定。
canvas=tkinter.Canvas(width=600,height=400,bg="lightblue")
canvas.pack()
img=tkinter.PhotoImage(file="kk_100.png")                           #画像の読み込み
katuraimg=tkinter.PhotoImage(file="katura.png")                     #画像の読み込み
canvas.create_image(x,y,image=img,tag="MYCHR")
for i in range(0,maxkatura):                                        #かつらを表示させる
    tagkatura="katura"+str(i)                                       #tagkaturaの名前を生成
    canvas.create_image(kX[i],kY[i],image=katuraimg,tag=tagkatura)  #生成したtagkaturaのx,y座標を指定、表示
    
lblscore = tk.Label(text="score: "+str(score),font=("",20))         #スコアを表示(fontサイズ20)
lblscore.pack()
lblscore.place(x=30, y=70)                                          #表示位置を指定

lbltimer = tk.Label(text="timer: " +str(tmr),font=("",20))          #timerを表示(fontサイズ20)
lbltimer.pack()
lbltimer.place(x=30, y=100)                                         #表示位置を指定

RTA()       #timerを動かす処理を実行
mainA()     #キャラを動かす処理を実行
KATURA()    #かつらを動かす処理を実行

# 1,2,4,5,7,8,10,14,16,20,28,35,40,56,70,140 #落ちるスピード(280)の約数    

感想

かつらゲームver1が完成しました。結構わからないとこがありましたが
なんとか完成させました。もっと改良していきたいです。

f:id:tamakon3:20200426180529p:plain