【Pygame Zero】簡単なゲーム14:4枚×2段のカードめくりゲーム
こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の
ラッチ先生です


スックです。よろしくね!
BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「rise and shine」 written by 山本リョーマ
効果音提供:魔王魂
https://maou.audio/
・ 「maou_se_onepoint17」: ワンポイント17
・ 「maou_se_onepoint19」: ワンポイント19
・ 「maou_se_onepoint31」: ワンポイント31

基礎プログラムと 画像を入れた
「簡単なゲーム14: ババを 引くな!」zipフォルダを
ダウンロードしてください


今回は、スクリーンの色を “lightyellow” にしたよ
「原色大事典」サイトには、URL:https://www.colordic.org/
pygame zeroで使える色が載っています


このゲームで使用している音声ファイルは、
以下のサイトからお借りしています。
各自でダウンロードして、該当するフォルダに入れてください!
BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「rise and shine」 written by 山本リョーマ
効果音提供:魔王魂
https://maou.audio/
・ 「maou_se_onepoint17」: ワンポイント17
・ 「maou_se_onepoint19」: ワンポイント19
・ 「maou_se_onepoint31」: ワンポイント31

学習の流れ
クリックして めくる
ゲームの結果

スペースキーで リスタート
プログラムを 実行してみよう
プログラミングの仕方を説明します
モジュールを 用意する

今回の「ババを 引くな!」では、
・ マウスで カードをクリックする
・ ババのカードを ランダムに 決める
プログラムがあります。
そこで、2つのモジュールを 用意しました



モジュールとは、
関数やプログラムが書かれているファイルのことだよ

Actor( )クラスが入っている 変数boon には、
オブジェクトを動かす属性(データ)やメソッド(命令)が
あります。


プロパティ(データ)やメソッド(命令)は、
『 . (ドット)』を付ければ、使えるよ
今回のプログラミングのポイント

今回のプログラミングのポイントです

「%」と「//」という演算子を使うよ
クリックして めくる

最初に 8枚のカードを4枚 × 2段に 並べましょう
演算子
・ % : 除算子(割り算の余りを求める)
・ // : 割り算の整数部分だけを 求める
を使うと 簡単に できてしまいます。

変数col は、「column
(列)」の略語
変数row は、行です
プロパティ:num は、「number(番号)」の略語だよ
boon = Actor("boon", (400, 100))
cards = [] #1 空リストcardsを 生成する
for i in range(8): #2 8回繰り返す
col = i % 4 #3 変数colに i % 4の値を 代入する
row = i // 4 #4 変数rowに i // 4の値を 代入する
x = 175 + 150 * col #5 x座標に 175+150×colの値を 代入する
y = 350 + 170 * row #6 y座標に 350+170×rowの値を 代入する
card = Actor("card", (x, y)) #7 カードを 生成する
card.num = i #8 プロパティnumに カウンター変数 iの値を 代入する
cards.append(card) #9 リストcardsに カードを追加するdef draw():
screen.fill("lightyellow")
boon.draw()
for card in cards: #10 カードを取り出す
card.draw() #11 カードを表示する
- キャラクターの量産の仕方

- append( )メソッドとは


カードに 番号を つけたよ

今回のゲームは、スペースキーを押すと リスタートします
game_stars( )関数で、ゲームスタートを 定義します

cards.append(card)
def game_start(): #1 game_start()関数を 定義する
boon.on = True #2 プロパティonを Trueに設定する
boon.baba = random.randint(0, 7) #3 プロパティbabaに 0~7から ランダムに選んだ値を 設定する
game_start() #4 game_start()関数を 実行する- randint( )関数とは


スタートすると ババの番号が 決まるんだ

on_mouse_down(pos)関数で
クリックしたら カードがめくれるプログラムを定義します

game_start()
def on_mouse_down(pos): #1 クリックしたら動く関数を 定義する
if boon.on: #2 プロパティonが Trueだったら
for card in cards: #3 カードを取り出す
if card.collidepoint_pixel(pos): #4 もし クリックされたら
if card.num == boon.baba: #5 もし プロパティnumと プロパティbabaが 同じなら
card.image = "card_baba" #6 カードの画像を card_babaに 設定する
else: #7 その他
card.image = "card_ok" #8 カードの画像を card_okに 設定する
sounds.maou_se_onepoint19.play() #9 効果音を 鳴らす- collidepoint_pixel( )メソッドとは

効果音提供:魔王魂
https://maou.audio/
・ 「maou_se_onepoint19」: ワンポイント19

プロパティbabaの数値のカードが、ババカードになるよ
ゲームの結果


まず、BGMと背景画像が表示する準備をしましょう
def game_start():
boon.on = True
boon.baba = random.randint(0, 7)
music.play("rise_and_shine") #1 BGM流す
boon.bg = None #2 プロパティbgに None(無し)を設定するdef draw():
screen.fill("lightyellow")
if boon.bg: #3 もし プロパティbgに データが入ったら
screen.blit(boon.bg, (0, 0)) #4 背景画像を表示する
boon.draw()BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「rise and shine」 written by 山本リョーマ
- musicモジュールとは

- blit( )メソッドとは


つぎは、
ゲームオーバーとクリアのプログラムをまとめた
game_end()関数を 定義します

game_start()
def game_end(bg, sound, costume): #1 game_end()関数を 定義する
boon.on = False #2 プロパティonを Falseに設定する
music.stop() #3 BGMを 止める
boon.bg = bg #4 プロパティbgを 引数bgを代入する
sound.play() #5 効果音を 鳴らす
boon.image = costume #6 プロパティimageに 引数costumeを代入する
game_end()関数を使って、
ババのカードをクリックしたら ゲームオーバーにするよ
def on_mouse_down(pos):
if boon.on:
for card in cards:
if card.collidepoint_pixel(pos):
if card.num == boon.baba:
card.image = "card_baba"
game_end("bg_over",
sounds.maou_se_onepoint31,
"boon_over") #1 game_end()関数を 実行する
あれっ? 最後は、クリアだよね…

そうです。
7枚のカードをクリックできたら クリアにします
そのために、プロパティcountを追加して、
クリックした枚数をカウントしましょう
def game_start():
boon.on = True
boon.baba = random.randint(0, 7)
music.play("rise_and_shine")
boon.bg = None
boon.count = 0 #1 プロパティcountに 0を設定するdef on_mouse_down(pos):
if boon.on:
for card in cards:
if card.collidepoint_pixel(pos):
if card.num == boon.baba:
card.image = "card_baba"
game_end("bg_over",
sounds.maou_se_onepoint31,
"boon_over")
else:
card.image = "card_ok"
boon.count += 1 #2 プロパティcount 1ずつ上げる
if boon.count == 7: #3 もし プロパティcountが 7になったら
game_end("bg_clear",
sounds.maou_se_onepoint17,
"boon_clear") #4 game_end()関数を 実行する
else: #5 その他
sounds.maou_se_onepoint19.play() #6 効果音を 鳴らす
これで、ゲームの結果は 完成だよ
スペースキーで リスタート

それでは、
スペースキーを押して リスタートさせましょう!
on_key_down(key)関数を使って、
game_stars()関数を 実行させれば いいだけだよ

def on_key_down(key): #1 キーが押された時の命令を 定義する
if key == keys.SPACE: #2 もし スペースキーが 押されたら
game_start() #3 game_start()関数を 実行する
def update():
あれぇ! boonの顔と カードが 元に戻らないよ

おぉぉぉ……っと!
忘れてたあ!!
game_stars()関数で
boonとカードを 元の画像にしましょう
def game_start():
boon.on = True
boon.baba = random.randint(0, 7)
music.play("rise_and_shine")
boon.bg = None
boon.count = 0
boon.image = "boon" #1 プロパティimageを "boon"に設定する
for card in cards: #2 リストcardsから cardを取り出す
card.image = "card" #3 プロパティimageを "card"に設定する
今回の学習は、これで 終了! おつかれさま
まとめ

今回は、
4枚 × 2段に配布するカードゲームのプログラムを作りました。
import pgzrun
from pgzhelper import *
import random
WIDTH = 800
HEIGHT = 600
boon = Actor("boon", (400, 100))
cards = []
for i in range(8):
col = i % 4
row = i // 4
x = 175 + 150 * col
y = 350 + 170 * row
card = Actor("card", (x, y))
card.num = i
cards.append(card)
def game_start():
boon.on = True
boon.baba = random.randint(0, 7)
music.play("rise_and_shine")
boon.bg = None
boon.count = 0
boon.image = "boon"
for card in cards:
card.image = "card"
game_start()
def game_end(bg, sound, costume):
boon.on = False
music.stop()
boon.bg = bg
sound.play()
boon.image = costume
def on_mouse_down(pos):
if boon.on:
for card in cards:
if card.collidepoint_pixel(pos):
if card.num == boon.baba:
card.image = "card_baba"
game_end("bg_over",
sounds.maou_se_onepoint31,
"boon_over")
else:
card.image = "card_ok"
boon.count += 1
if boon.count == 7:
game_end("bg_clear",
sounds.maou_se_onepoint17,
"boon_clear")
else:
sounds.maou_se_onepoint19.play()
def on_key_down(key):
if key == keys.SPACE:
game_start()
def update():
pass
def draw():
screen.fill("lightyellow")
if boon.bg:
screen.blit(boon.bg, (0, 0))
boon.draw()
for card in cards:
card.draw()
pgzrun.go()
カードを 横4枚を2段に配置するプログラムに
演算子
・ % : 除算子(割り算の余りを求める)
・ // : 割り算の整数部分だけを 求める
を 使うと 簡単に できちゃいます。覚えておきましょう

カードゲームに 使えるね
みんなも このプログラムを使って、カードを並べてみてね
それじゃあ、またね!






