ゲーム作成
誕生月占い
自分の名前と誕生月を入力すると、性格を占ってくれるもの
【ソースコード】
name=input("名前を教えてください")
month=int(input("何月生まれですか?"))
if month==1:
print(name,"さんは優しく温かい性格ですね")
if month==2:
print(name,"積極的で活発な性格ですね")
if month==3:
print(name,"さんは人当たりが良くて社交性抜群ですね")
if month==4:
print(name,"さんは自分に厳しく他人に優しい性格ですね")
if month==5:
print(name,"さんは情熱的で抜群の行動力がある人ですね")
if month==6:
print(name,"さんは強い好奇心と行動力がある人ですね")
if month==7:
print(name,"さんは思いやりがあって優しいひとですね")
if month==8:
print(name,"さんは華やかな性格で新しいもの好きですね")
if month==9:
print(name,"さんは完璧主義で繊細な心を持っていますね")
if month==10:
print(name,"さんは責任感があって真面目な性格ですね")
if month==11:
print(name,"さんはマニアックな気質を持っていますね")
if month==12:
print(name,"さんは素直でマイペースですね")
else:
print(name,"さん、正しい誕生月を入力してください")
インベーダーゲーム
誕生月占いでは新しい知識を身に着けることが出来なかったため、動画に従いながらインベーダーゲームを作成した
【遊び方】
プレイを始めるとランダムな位置にに敵が表示され、プレイヤーの方へやってくる
プレイヤーは左右の矢印ボタンで動かし、スペースキーで玉を打つ
玉が敵に当たればスコアが1プラスされ、敵はスタート位置に戻る
敵が玉を避けてプレイヤーのところまで来たら終了
【使用した動画】
【Pygame超入門】50分でゲーム開発(Python)の基礎をマスター
【ソースコード】
from email import message
import os
from pkgutil import extend_path
from tkinter import EXTENDED, Y
import pygame
from pygame import mixer
from sqlalchemy import false #ミキサーをインポート
import random
import math
pygame.init()
screen = pygame.display.set_mode((800,600))
#screen.fill((150,150,150))
pygame.display.set_caption('Invaders Game')
# Player
playerimg = pygame.image.load('player.png')
playerX , playerY= 370, 480 #座標を変数に入れた
playerX_change = 0 #playerの位置
# Enemy
enemyImg = pygame.image.load('enemy.png')
enemyX = random.randint(0, 736)
enemyY = random.randint(50, 150)
enemyX_change, enemyY_change = 4, 40
# Bullet
bulletImg = pygame.image.load('bullet.png')
bulletX, bulletY = 0, 480 #Xはプレイヤーと同じ位置
bulletX_change, bulletY_change = 0, 3
bullet_state = 'ready'
# Score
score_value = 0
def player(x,y):
screen.blit(playerimg,(x, y))
def enemy(x,y):
screen.blit(enemyImg,(x, y))
def fire_bullet(x, y):
global bullet_state
bullet_state = 'fire'
screen.blit(bulletImg, (x + 16, y + 10)) #玉を表示
def isCollision(enemyX, enemyY, bulletX, bulletY): #玉とぶつかったかどうか
distance = math.sqrt(math.pow(enemyX - bulletX, 2) + math.pow(enemyY - bulletY, 2))
if distance < 27:
return True
else:
return False
running = True
while running:
screen.fill((0,0,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -1
if event.key == pygame.K_RIGHT:
playerX_change = 1
if event.key == pygame.K_SPACE:
if bullet_state is 'ready':
bulletX = playerX #プレイヤーの場所
fire_bullet(bulletX, bulletY) #表示
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
# Player
playerX += playerX_change
if playerX <= 0:
playerX = 0
elif playerX >= 736:
playerX = 736 #プレイヤーの制限
# Enemy
if enemyY > 440:
break #敵が画面下まできたらブレイク
enemyX += enemyX_change
if enemyX <= 0: #左端に来たら
enemyX_change = 0.3 #プラスされる
enemyY += enemyY_change #下に移している
elif enemyX >=736: #右端に来たら
enemyX_change = -0.3 #マイナスされる
enemyY += enemyY_change
collision = isCollision(enemyX, enemyY, bulletX, bulletY)
if collision: #衝突した場合
bulletY = 480
bullet_state = 'ready'
score_value += 1
enemyX = random.randint(0, 736) #新たな敵の出現
enemyY = random.randint(50, 150)
# Bullet Movement
if bulletY <=0: #玉が当たらなかった場合
bulletY = 480
bullet_state = 'ready'
if bullet_state is 'fire':
fire_bullet(bulletX, bulletY) #玉を表示
bulletY -= bulletY_change #値をマイナスにしている
# Score
font = pygame.font.SysFont(None, 32) # フォントの作成 Noneはデフォルトのfreesansbold.ttf
score = font.render(f"Score : {str(score_value)}", True, (255,255,255)) # テキストを描画したSurfaceの作成
screen.blit(score, (20,50))
player(playerX, playerY)
enemy(enemyX, enemyY)
pygame.display.update() #書き換え
【苦戦したところ】
インベーダーゲームは動画を真似て作ったものだが、それでも画像の読み込みの仕方が分からず3時間以上かかってしまった。
はじめに、
playerimg = pygame.image.load('player.png')
と入力して下のプレイヤー画像(player.png)を表示したかったのだが、入力して実行すると「No file 'player.png' found in working directory 」となってエラーがでてしまった。
原因1
これは本当に初歩的なミスだが、必要な画像(player.png)をダウンロードしていなかった
この場合、動画の概要欄から用意された画像をダウンロードする必要があった
原因2
画像(player.png)の保存場所が間違っていた
de12フォルダーの中のimagesやpythonのフォルダーに画像を保存したが「file not found」となった
そこで、試しにde12フォルダーのfilesというフォルダーに画像を入れてみたところ、実行することができた
なぜfilesフォルダーに画像を入れる必要があったのかは分からなかった
【改善したいところ】
このゲームを友達に試してもらったところ、「スコアが10になったら終了するプログラムが入れられたらいいね」とアドバイスをもらった。
今のプログラムでは敵がプレイヤーのところまで降りてきたら終了となっており、ゲームが上手い人はずっと終わらないからだ。
【感想】
画像の読み込みにはとても苦戦したが、動画を見ながらやったので楽しんでできた。
この動画を作ってくれた人に感謝したい。
しかし、入力についていくのが必死で内容を理解できていない部分も多い。
今後、改善点は自分でプログラムを考えて入力できるようにしたい。