たまこんブログ

学生×プログラミング→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

IllustratorとPhotoshopの違い

 

IllustratorPhotoshopでなぜ使い分けるのか、実際に使ってみて気付いたメリット

デメリットを紹介します。 

 

 

1. Illustrator

f:id:tamakon3:20200426181128p:plain

レイアウトやアイコン作成に使うもので作成したものを拡大縮小してもぼやけないで細かい所の作業に向いてます。

f:id:tamakon3:20200426173405p:plain

左がIllustratorで右がPhotoshop

※画像は800%に拡大したもの

 

Illustratorで作る画像はベクトルでデータが作られているので、拡大縮小してもぼやけません。

また、イラストのような絵を何回も書き直すのに向いています。

 

f:id:tamakon3:20200604105937p:plain



2.Photoshop

f:id:tamakon3:20200426181105p:plain

写真、jpegのようなドット絵を加工、合成したり、水彩画のようなイラストを描くときに向いています。

PhotoshopIllustratorと違い、一度小さくしたものを拡大すると粗さが目立ちます。 

最初にどこで使うか想定して画像サイズを決めると綺麗にできファイルサイズも抑えることができます。

 

 

f:id:tamakon3:20200426180529p:plain

 

tamakon3.hatenablog.com

 この記事で実際に使い方を紹介しています。

 

まとめ


Illustrator  :     レイアウトやアイコン作成

Photoshop  :   写真加工、合成、水彩画のようなイラスト作成 に向いている

 

 

 参考リンク

saruwakakun.com

 おまけ

 

12ヶ月の間はすべてのAdobeアプリケーションが使えます。

 

学生or教職員の方は通常より格段に安く買えます!

 

 

 

 

 

 

 

 

 

IllustratorとPhotoshopでアイコンの色変更

IllustratorPhotoshopでアイコンの色変更をしたので、その手順を紹介します。

 

色変更の手順

アイコンファイルを開きます

Illustratorファイルを開きます。

f:id:tamakon3:20200425143759p:plain

 

アイコンが大きいので縮小します

サイズを50%にします。

f:id:tamakon3:20200425144243p:plain

 

縮小できました。

f:id:tamakon3:20200425144321p:plain

 グループ化

アイコンのオブジェクトをグループ化します。

f:id:tamakon3:20200425144530p:plain

アイコンを複製

アイコンをコピーして適当に並べます。

f:id:tamakon3:20200425144639p:plain

 アイコンを整列させる

整列コマンドをつかって左右中央揃えにします。

f:id:tamakon3:20200425144651p:plain

 

整列コマンドで上下間隔を均等揃えにします。

f:id:tamakon3:20200425144701p:plain

 

重なっているので一個ずらします。

f:id:tamakon3:20200425144716p:plain

 

再度、上下間隔を均等にします。上下の間隔が均等になりました。

f:id:tamakon3:20200425145347p:plain

 アイコンの色を変える

この白い矢印に変えます。

理由としては、グループ化されたオブジェクトを直接変更するためです。

f:id:tamakon3:20200425145640p:plain

 

アイコンの水色の背景を選択して変えたい色をカラーピッカーから選択します。

f:id:tamakon3:20200425145730p:plain

 

色がかわりました。

f:id:tamakon3:20200425145914p:plain

 

同様に他の色も変えていきます。

f:id:tamakon3:20200425145953p:plain

 

画像ファイルを作成する

新規ファイルを作成し、単独のファイルにします。

f:id:tamakon3:20200425150947p:plain

Photoshopにを立ち上げ、Illustratorでつくった先程のファイルを開きます。

f:id:tamakon3:20200425151108p:plain

 

ファイルサイズの幅と高さを100pixelにします

f:id:tamakon3:20200425151231p:plain

 

Pythonで使えるようにするため、pngにファイル書き出しをします。

f:id:tamakon3:20200425151411p:plain

 

 

完成

 

これで完成です。

f:id:tamakon3:20200425151703p:plain

まとめ


Illustratorファイルのままでは、Pythonで使えないのでPhotoshop

pngファイルに書き換える必要があります。

 

f:id:tamakon3:20200425153047p:plain

 

 

 

かつらキャッチpart2 (落ちゲー)

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



tamakon3.hatenablog.com


Pythonで作るゲーム開発入門講座

  • 目次

実行結果

f:id:tamakon3:20200423215024g:plain

プログラム解説

import tkinter
import tkinter.messagebox
key=""
def key_down(e):    #キーが押された時に行う処理
    global key
    key=e.keysym    #keysymには押されたキーの情報が入る
def key_up(e):      #キーが離された時に行う処理
    global key
    key=""          #キーが離された時、キーの情報を空にする
x=400   #アイコンのx座標の初期位置
y=280   #アイコンのy座標の初期位置

katuraX=600  #かつらのx座標の初期位置
katuraY=5   #かつらのy座標の初期位置

def mainA():
    global x,y

    if key=="Left":
        x=x-20
    if key=="Right":
        x=x+20
    canvas.coords("MYCHR",x,y)
    root.after(100,mainA)

def KATURA():
    global katuraX,katuraY
   
    if katuraY==265:  #かつらのy座標が265で
        if x==280 :   #アイコンのx座標が280ならば
            canvas.update()
            tkinter.messagebox.showinfo("おめでとう!","でかした!")   #メッセージを表示
   

    katuraY=katuraY+20
    if katuraY > 400:      #かつらのy座標が画面からはずれたら
        katuraY=5  
       
    katuraX=280
    
    canvas.coords("katuraCHR",katuraX,katuraY)
    root.after(100,KATURA)


    

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="lightgreen")
canvas .pack()
img=tkinter.PhotoImage(file="kk_100.png")   #画像の読み込み
katuraimg=tkinter.PhotoImage(file="katura.png") #画像の読み込み

canvas.create_image(x,y,image=img,tag="MYCHR")
canvas.create_image(katuraX,katuraY,image=katuraimg,tag="katuraCHR")
mainA()
KATURA()


    

感想

これをもっと改良して、よりおもしろくしていきます!

簡単でおもしろいゲームを作る

この本から得たことをもとに、クソゲーをつくりました。
内容としては、自分のアイコンにかつらをはめます。


Pythonで作るゲーム開発入門講座

  • 目次

実行結果

f:id:tamakon3:20200423084347g:plain

プログラム解説(一部のみ抜粋)

import tkinter
import tkinter.messagebox
key=""
def key_down(e):    #キーが押された時に行う処理
    global key
    key=e.keysym    #keysymには押されたキーの情報が入る
def key_up(e):      #キーが離された時に行う処理
    global key
    key=""          #キーが離された時、キーの情報を空にする
x=400   #アイコンのx座標の初期位置
y=295   #アイコンのy座標の初期位置

katuraX=600-5   #かつらのx座標の初期位置
katuraY=100      #かつらのy座標の初期位置

def mainA():
    global x,y

    if key=="Up":   #upのキーが押されたら
        y=y-20      #キャラクターのy座標を-20
    if key=="Down":
        y=y+20
    if key=="Left":
        x=x-20
    if key=="Right":
        x=x+20
    canvas.coords("MYCHR",x,y)
    root.after(100,mainA)

def KATURA():
    global katuraX,katuraY
   
    if katuraX==x:  #かつらとアイコンのx座標が一致したならば
        if katuraY==100 and y==115: #かつらのy座標が100で尚且アイコンのy座標が115ならば
            canvas.update()
            tkinter.messagebox.showinfo("おめでとう!","でかした!")   #メッセージを表示
    katuraX=katuraX-20      #かつらのx座標を常に-20する
    if katuraX < -200:      #かつらのx座標が画面からはずれたら
        katuraX=600       #かつらのx座標を600-5にもどす
    katuraY=100
    canvas.coords("katuraCHR",katuraX,katuraY)
    root.after(100,KATURA)




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="lightgreen")
canvas .pack()
img=tkinter.PhotoImage(file="kk_100.png")   #画像の読み込み
katuraimg=tkinter.PhotoImage(file="katura.png") #画像の読み込み

canvas.create_image(x,y,image=img,tag="MYCHR")
canvas.create_image(katuraX,katuraY,image=katuraimg,tag="katuraCHR")
mainA()
KATURA()

感想

この本には、ゲームをつくる基礎や、プログラミングについて
初心者でもわかりやすいように書いてあるので作りやすかったです!
これをもっと改良して、よりおもしろくしていきます。

言葉での表現が豊かになりそうなおすすめの本まとめ

家にいると誰とも話さなくて陰キャになりそうですが、そんな時にぴったりな本を紹介します。

ハリネズミの願い

主人公のハリネズミは今まで誰も家に招待したことがなかったのに家に招待するために他の動物たちに手紙を書きます。
このハリネズミ、超心配性でむちゃくちゃネガティブ思考で、まさに家にこもってるとこの思考になりそうです。
また、想像力もすごくどんどん考え込んで行きます。ですが、この孤独感がおもしろい&可愛いです。
動物好きな人にはおすすめです!



ルーズヴェルト ゲーム


青島製作所という中堅電子部品メーカーの社会人野球の話で、青島製作所の経営はうまくいっていませんでした。
この経営状況の象徴が青島製作所の野球部で、強豪だった時の栄光はすでに失われていて、対外試合ではほとんど勝ちがない状態まで
落ちいていました。そんなとき、廃部の話が出てきたり、青島製作所も大幅な生産調整と単価切り下げを通告され窮地に立たされます。そんな中でも頑張る姿を描いている物語です。野球のことがあまりわからない方でもわかりやすく書いてあるので
とても読みやすかったです。



DASUTO(ダスト)

f:id:tamakon3:20200422170907p:plain

物語の中の日本はニートと呼ばれる働かない若者たちが増えていてそのニートたちを“世の中のゴミ”として流罪にする法律を制定しました。その法律が特別法第001条DUSTで刑期は500日。ある日突然、孤島に“棄民”された主人公の章弘と五人の若者たちは
絶えず襲いかかる敵の襲撃と飢餓の恐怖。感動や悲しいシーンが多々あり面白かったです!









また、同じ夢をみていた


主人公 小学生の小柳奈ノ花(こやなぎ なのか)。自分は賢く同級生はほとんどの人は馬鹿だと思っており
学校に友達はいません。この子は物語を読むのが好きでとても偉そうなことを言います。ですがその言葉にも共感できる
部分が多く、どんどん見いってしまう小説です。最後の展開は驚きました。







まとめ

「面白い・面白くない」かの判断は、それぞれの好みによって感じ方は違うかもしれません。
ですが、こんな本もあるんだの感覚でみてくれると嬉しいです!

 [Python入門] if文の使い方まとめ

プログラムでは、条件分岐の処理がよく行われます。

「もし何々したら、この処理をする」と、条件によってコンピュータに処理を命じることが条件分岐です。

条件分岐はifという命令を使います。



目次

ifの記述の仕方

ifを使った文をif文といい、次のように記述します。

if A < 0:    
       print ("Aの値は負の数です")

もしAが0より小さかったら、(Aの値は負の数です)を表示させるという処理です。

また、字下げした部分をブロックといい処理のまとまりを表します。

条件が成り立った時に複数の処理を行うなら、それらの処理を全て字下げして記述します。



if~elseを使う

gold=100 #変数goldに100を代入
if gold ==0:    #goldの値がゼロなら
    print("所持金がゼロです")
else: #そうでなければ
    print("買い物をしますか?")

実行結果
f:id:tamakon3:20200420151207p:plain
goldの値が100なので2行目の条件式が成り立たず。else後の処理が実行されます。

if文では、この他にも複数の条件を順に判定する[if~elif~else]という記述の仕方と、複数の条件をまとめて判定するandやor
といった物があります。

条件式について

条件式を記述する際に使う記号を関係演算子といいます。
f:id:tamakon3:20200420151848p:plain

値が等しいか調べるには「==」、等しくないかを調べるときは、「!=」と記述します。
Pythonでは条件式が成り立つ時はTrueという値になり、成り立たない時はFalseという値になります。
条件式が成り立つ時は、字下げして記述した処理を行います。

最後に

if文は様々な形で使われるので、しっかり復習して理解できると良いと思い記事をかいてみました!
慣れれば簡単に使えるようになります!