この記事の例では、参考のために実物大のゲームを実現するためのPythonの特定のコードを共有しています。具体的な内容は次のとおりです。
# インポートモジュール
import pygame
from pygame.locals import*import sys,random,time,math
classGameWindow(object):'''ゲームウィンドウクラスを作成する'''
def __init__(self,*args,**kw):
self.window_length =600
self.window_wide =500
# ゲームウィンドウを描画し、ウィンドウサイズを設定します
self.game_window = pygame.display.set_mode((self.window_length,self.window_wide))
# ゲームウィンドウのタイトルを設定する
pygame.display.set_caption("CatchBallGame")
# ゲームウィンドウの背景色パラメータを定義します
self.window_color =(135,206,250)
def backgroud(self):
# ゲームウィンドウの背景色を描画します
self.game_window.fill(self.window_color)classBall(object):'''ボールを作成する'''
def __init__(self,*args,**kw):
# ボールの半径、色、移動速度のパラメータを設定します
self.ball_color =(255,215,0)
self.move_x =1
self.move_y =1
self.radius =10
def ballready(self):
# ボールの初期位置を設定し、
self.ball_x = self.mouse_x
self.ball_y = self.window_wide-self.rect_wide-self.radius
# ボールを引き、バウンストリガー条件を設定します
pygame.draw.circle(self.game_window,self.ball_color,(self.ball_x,self.ball_y),self.radius)
def ballmove(self):
# ボールを引き、バウンストリガー条件を設定します
pygame.draw.circle(self.game_window,self.ball_color,(self.ball_x,self.ball_y),self.radius)
self.ball_x += self.move_x
self.ball_y -= self.move_y
# 衝突検出機能を呼び出す
self.ball_window()
self.ball_rect()
# ボールの速度は、ボールを受け取る5回ごとに2倍になります
if self.distance < self.radius:
self.frequency +=1if self.frequency ==5:
self.frequency =0
self.move_x += self.move_x
self.move_y += self.move_y
self.point += self.point
# ゲームの失敗条件を設定する
if self.ball_y 520:
self.gameover = self.over_font.render("Game Over",False,(0,0,0))
self.game_window.blit(self.gameover,(100,130))
self.over_sign =1classRect(object):'''ラケットクラスを作成する'''
def __init__(self,*args,**kw):
# ラケットの色パラメータを設定します
self.rect_color =(255,0,0)
self.rect_length =100
self.rect_wide =10
def rectmove(self):
# マウスの位置パラメータを取得する
self.mouse_x,self.mouse_y = pygame.mouse.get_pos()
# ラケットを描き、水平方向の境界を定義します
if self.mouse_x = self.window_length-self.rect_length//2:
self.mouse_x = self.window_length-self.rect_length//2if self.mouse_x <= self.rect_length//2:
self.mouse_x = self.rect_length//2
pygame.draw.rect(self.game_window,self.rect_color,((self.mouse_x-self.rect_length//2),(self.window_wide-self.rect_wide),self.rect_length,self.rect_wide))classBrick(object):
def __init__(self,*args,**kw):
# レンガの色パラメータを設定する
self.brick_color =(139,126,102)
self.brick_list =[[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]
self.brick_length =80
self.brick_wide =20
def brickarrange(self):for i inrange(5):for j inrange(6):
self.brick_x = j*(self.brick_length+24)
self.brick_y = i*(self.brick_wide+20)+40if self.brick_list[i][j]==1:
# レンガを描く
pygame.draw.rect(self.game_window,self.brick_color,(self.brick_x,self.brick_y,self.brick_length,self.brick_wide))
# 衝突検出機能を呼び出す
self.ball_brick()if self.distanceb < self.radius:
self.brick_list[i][j]=0
self.score += self.point
# ゲームの勝利条件を設定する
if self.brick_list ==[[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]:
self.win = self.win_font.render("You Win",False,(0,0,0))
self.game_window.blit(self.win,(100,130))
self.win_sign =1classScore(object):'''スコアクラスを作成する'''
def __init__(self,*args,**kw):
# 初期スコアを設定する
self.score =0
# フラクションフォントを設定する
self.score_font = pygame.font.SysFont('arial',20)
# 初期ボーナスポイントを設定する
self.point =1
# キャッチの初期数を設定します
self.frequency =0
def countscore(self):
# プレーヤーのスコアをプロットする
my_score = self.score_font.render(str(self.score),False,(255,255,255))
self.game_window.blit(my_score,(555,15))classGameOver(object):'''クラスでゲームを作成する'''
def __init__(self,*args,**kw):
# ゲームオーバーフォントを設定する
self.over_font = pygame.font.SysFont('arial',80)
# GameOverロゴを定義する
self.over_sign =0classWin(object):'''ゲーム勝利クラスを作成する'''
def __init__(self,*args,**kw):
# Set YouWinフォント
self.win_font = pygame.font.SysFont('arial',80)
# Winロゴを定義する
self.win_sign =0classCollision(object):'''衝突検出クラス'''
# ボールとウィンドウフレーム間の衝突検出
def ball_window(self):if self.ball_x <= self.radius or self.ball_x =(self.window_length-self.radius):
self.move_x =-self.move_x
if self.ball_y <= self.radius:
self.move_y =-self.move_y
# ボールとラケットの衝突検出
def ball_rect(self):
# 衝突マーカーを定義する
self.collision_sign_x =0
self.collision_sign_y =0if self.ball_x <(self.mouse_x-self.rect_length//2):
self.closestpoint_x = self.mouse_x-self.rect_length//2
self.collision_sign_x =1
elif self.ball_x(self.mouse_x+self.rect_length//2):
self.closestpoint_x = self.mouse_x+self.rect_length//2
self.collision_sign_x =2else:
self.closestpoint_x = self.ball_x
self.collision_sign_x =3if self.ball_y <(self.window_wide-self.rect_wide):
self.closestpoint_y =(self.window_wide-self.rect_wide)
self.collision_sign_y =1
elif self.ball_y self.window_wide:
self.closestpoint_y = self.window_wide
self.collision_sign_y =2else:
self.closestpoint_y = self.ball_y
self.collision_sign_y =3
# ラケットの円の中心に最も近い点と円の中心との間の距離を定義します
self.distance = math.sqrt(math.pow(self.closestpoint_x-self.ball_x,2)+math.pow(self.closestpoint_y-self.ball_y,2))
# 左、上中央、右上の3つの状況でのラケット上のボールの衝突検出
if self.distance < self.radius and self.collision_sign_y ==1and(self.collision_sign_x ==1 or self.collision_sign_x ==2):if self.collision_sign_x ==1 and self.move_x 0:
self.move_x =- self.move_x
self.move_y =- self.move_y
if self.collision_sign_x ==1 and self.move_x <0:
self.move_y =- self.move_y
if self.collision_sign_x ==2 and self.move_x <0:
self.move_x =- self.move_x
self.move_y =- self.move_y
if self.collision_sign_x ==2 and self.move_x 0:
self.move_y =- self.move_y
if self.distance < self.radius and self.collision_sign_y ==1 and self.collision_sign_x ==3:
self.move_y =- self.move_y
# ラケットの左側と右側の中央でのボールの衝突検出
if self.distance < self.radius and self.collision_sign_y ==3:
self.move_x =- self.move_x
# ボールとレンガの衝突検出
def ball_brick(self):
# 衝突マーカーを定義する
self.collision_sign_bx =0
self.collision_sign_by =0if self.ball_x < self.brick_x:
self.closestpoint_bx = self.brick_x
self.collision_sign_bx =1
elif self.ball_x self.brick_x+self.brick_length:
self.closestpoint_bx = self.brick_x+self.brick_length
self.collision_sign_bx =2else:
self.closestpoint_bx = self.ball_x
self.collision_sign_bx =3if self.ball_y < self.brick_y:
self.closestpoint_by = self.brick_y
self.collision_sign_by =1
elif self.ball_y self.brick_y+self.brick_wide:
self.closestpoint_by = self.brick_y+self.brick_wide
self.collision_sign_by =2else:
self.closestpoint_by = self.ball_y
self.collision_sign_by =3
# レンガの最も近い点から円の中心までの距離と円の中心との間の距離を定義します
self.distanceb = math.sqrt(math.pow(self.closestpoint_bx-self.ball_x,2)+math.pow(self.closestpoint_by-self.ball_y,2))
# 左、上中央、右上の3つの状況でのレンガ上のボールの衝突検出
if self.distanceb < self.radius and self.collision_sign_by ==1and(self.collision_sign_bx ==1 or self.collision_sign_bx ==2):if self.collision_sign_bx ==1 and self.move_x 0:
self.move_x =- self.move_x
self.move_y =- self.move_y
if self.collision_sign_bx ==1 and self.move_x <0:
self.move_y =- self.move_y
if self.collision_sign_bx ==2 and self.move_x <0:
self.move_x =- self.move_x
self.move_y =- self.move_y
if self.collision_sign_bx ==2 and self.move_x 0:
self.move_y =- self.move_y
if self.distanceb < self.radius and self.collision_sign_by ==1 and self.collision_sign_bx ==3:
self.move_y =- self.move_y
# レンガの左下、中央下、右下のボールの衝突検出
if self.distanceb < self.radius and self.collision_sign_by ==2and(self.collision_sign_bx ==1 or self.collision_sign_bx ==2):if self.collision_sign_bx ==1 and self.move_x 0:
self.move_x =- self.move_x
self.move_y =- self.move_y
if self.collision_sign_bx ==1 and self.move_x <0:
self.move_y =- self.move_y
if self.collision_sign_bx ==2 and self.move_x <0:
self.move_x =- self.move_x
self.move_y =- self.move_y
if self.collision_sign_bx ==2 and self.move_x 0:
self.move_y =- self.move_y
if self.distanceb < self.radius and self.collision_sign_by ==2 and self.collision_sign_bx ==3:
self.move_y =- self.move_y
# レンガの左側と右側の中央でのボールの衝突検出
if self.distanceb < self.radius and self.collision_sign_by ==3:
self.move_x =- self.move_x
classMain(GameWindow,Rect,Ball,Brick,Collision,Score,Win,GameOver):'''メインプログラムクラスを作成する'''
def __init__(self,*args,**kw):super(Main,self).__init__(*args,**kw)super(GameWindow,self).__init__(*args,**kw)super(Rect,self).__init__(*args,**kw)super(Ball,self).__init__(*args,**kw)super(Brick,self).__init__(*args,**kw)super(Collision,self).__init__(*args,**kw)super(Score,self).__init__(*args,**kw)super(Win,self).__init__(*args,**kw)
# ゲーム開始フラグを定義する
start_sign =0while True:
self.backgroud()
self.rectmove()
self.countscore()if self.over_sign ==1 or self.win_sign ==1:break
# ゲームウィンドウの状態を取得する
for event in pygame.event.get():if event.type == pygame.QUIT:
sys.exit()if event.type == MOUSEBUTTONDOWN:
pressed_array = pygame.mouse.get_pressed()if pressed_array[0]:
start_sign =1if start_sign ==0:
self.ballready()else:
self.ballmove()
self.brickarrange()
# ゲームウィンドウを更新する
pygame.display.update()
# ゲームウィンドウの更新速度を制御する
time.sleep(0.010)if __name__ =='__main__':
pygame.init()
pygame.font.init()
catchball =Main()
以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。
Recommended Posts