""" dog.py """
import math
import pygame
import random
import sys
from pygame.locals import *
pygame.init()
pygame.key.set_repeat(5,5)
SURFACE = pygame.display.set_mode((400,300))
FPSCLOCK = pygame.time.Clock()
pygame.display.set_caption("DOG & BURGERS")
sysfont = pygame.font.SysFont(None, 24)
class Burger:
"""バーガーオブジェクト"""
def __init__(self):
self.x = 0
self.y = 0
self.direction = 0
self.point = 0
self.status = 0
self.speed = 0
self.type = 0
self.image_burger = pygame.image.load("burger.gif")
self.image_golden_burger = pygame.image.load("golden_burger.gif")
#表示オン
def on(self, counter):
self.direction = random.randint(1,2)
self.status = 1
if self.direction == 1:
self.x = -50
elif self.direction == 2:
self.x = 400
self.y = random.randint(0,200) #初期Y座標(ランダム)
if counter > 4000 and random.randint(0,149) == 0: #ゴールデンバーガー出現条件
self.point = 30000
self.speed = 10
self.type = 1
self.image = self.image_golden_burger
else:
self.point = 100
self.speed = random.randint(3,8)
self.type = 0
self.image = self.image_burger
#動作
def move(self, dogx, dogy):
if self.status == 1:
if self.direction == 1:
self.x += self.speed
if self.x > 400:
self.status = 0
elif self.direction == 2:
self.x -= self.speed
if self.x < -50:
self.status = 0
if (self.x - dogx)**2 + (self.y - dogy)**2 * 0.7 < 1000: #衝突判定
self.status = 0
return(self.point, self.x, self.y) #戻り値: 得点と座標
SURFACE.blit(self.image,(self.x, self.y))
return(0, self.x, self.y) #戻り値: 得点(0)と座標
class Snake:
"""蛇オブジェクト"""
def __init__(self):
self.x = 0
self.y = 0
self.direction = 0
self.status = 0
self.speed = 0
self.image = pygame.image.load("snake.gif")
#表示オン
def on(self):
self.direction = random.randint(1,2)
self.status = 1
self.speed = random.randint(2,4)
if self.direction == 1:
self.x = -50
elif self.direction == 2:
self.x = 400
self.y = 250
#動作
def move(self, dogx, dogy):
if self.status == 1:
if self.direction == 1:
self.x += self.speed
if self.x > 400:
self.status = 0
elif self.direction == 2:
self.x -= self.speed
if self.x < -50:
self.status = 0
if ((self.x - dogx)**2 * 1.3) + (self.y - dogy)**2 * 0.7 < 1000: #衝突判定
self.status = 0
SURFACE.blit(self.image,(self.x, self.y))
return(1) #戻り値: ゲームオーバーフラグ
SURFACE.blit(self.image,(self.x, self.y))
return(0) #戻り値: ゲームオーバーフラグ(0)
class Bird(Snake):
"""鳥オブジェクト(蛇クラスから継承)"""
def __init__(self):
super().__init__()
self.image_bird_right = pygame.image.load("bird1.gif")
self.image_bird_left = pygame.image.load("bird2.gif")
#表示オン
def on(self):
self.direction = random.randint(1,2)
self.status = 1
self.speed = random.randint(4,6)
self.dy = random.randint(0,1)*2-1
if self.direction == 1:
self.x = -50
self.image = self.image_bird_right
elif self.direction == 2:
self.x = 400
self.image = self.image_bird_left
self.y = random.randint(0,200)
#動作
def move(self, dogx, dogy):
if self.status == 1:
if self.direction == 1:
self.x += self.speed
if self.x > 400:
self.status = 0
elif self.direction == 2:
self.x -= self.speed
if self.x < -50:
self.status = 0
self.y += self.dy
if self.y > 200:
self.y = 200
self.dy = -self.dy
if self.y < 0:
self.y = 0
self.dy = -self.dy
if ((self.x - dogx)**2 * 1.3) + (self.y - dogy)**2 * 0.7 < 1000: #衝突判定
self.status = 0
SURFACE.blit(self.image,(self.x, self.y))
return(1) #戻り値: ゲームオーバーフラグ
SURFACE.blit(self.image,(self.x, self.y))
return(0) #戻り値: ゲームオーバーフラグ(0)
class Hedgehog(Snake):
"""ハリネズミオブジェクト(蛇クラスから継承)"""
def __init__(self):
super().__init__()
self.image_hedgehog = pygame.image.load("hedgehog.gif")
self.image_hedgehog_jump1 = pygame.image.load("hedgehog_jump1.gif")
self.image_hedgehog_jump2 = pygame.image.load("hedgehog_jump2.gif")
#表示オン
def on(self):
self.direction = random.randint(1,2)
self.status = 1
self.speed = random.randint(4,5)
self.jump_up = 0
if self.direction == 1:
self.x = -50
elif self.direction == 2:
self.x = 400
self.y = 250
self.image = self.image_hedgehog
#動作
def move(self, dogx, dogy):
if self.status > 0:
if self.status < 20:
self.status += 1
if self.status == 20:
self.jump_up += 2
self.image = self.image_hedgehog_jump1
if (self.jump_up >= 8 and random.randint(0,4) == 0) or self.jump_up >= 24:
self.status = 21
if self.status == 21:
if self.direction == 1:
self.x += self.speed
if self.x > 400:
self.status = 0
elif self.direction == 2:
self.x -= self.speed
if self.x < -50:
self.status = 0
self.y -= self.jump_up
self.jump_up -= 1
self.image = self.image_hedgehog_jump2
if self.y > 250:
self.y = 250
self.status = 1
self.image = self.image_hedgehog
if ((self.x - dogx)**2 * 1.3) + (self.y - dogy)**2 * 0.7 < 1000: #衝突判定
self.status = 0
SURFACE.blit(self.image,(self.x, self.y))
return(1) #戻り値: ゲームオーバーフラグ
SURFACE.blit(self.image,(self.x, self.y))
return(0) #戻り値: ゲームオーバーフラグ(0)
class Point:
"""得点表示オブジェクト"""
def __init__(self):
self.x = 0
self.y = 0
self.status = 0
self.point = 0
self.combo = 0
#表示オン
def on(self, x, y, point, combo):
self.x = x
self.y = y + 15
self.status = 20
self.point = point
self.combo = combo
#得点表示
def indication(self):
self.status -= 1
if self.status > 0:
if self.point < 10000:
count_image = sysfont.render(
"{} x {}".format(self.point, self.combo), True, (0,0,255))
SURFACE.blit(count_image, (self.x, self.y))
else:
count_image = sysfont.render(
" {} ".format(self.point), True, (255, 0, 0))
SURFACE.blit(count_image, (self.x, self.y + 20))
#イメージ設定
image_background = pygame.image.load("coast.jpg")
image_title = pygame.image.load("title_small.gif")
image_gameover = pygame.image.load("gameover_small.gif")
image_dog = pygame.image.load("dog.gif")
image_dog_jump1 = pygame.image.load("dog_jump1.gif")
image_dog_jump2 = pygame.image.load("dog_jump2.gif")
def score_indication(score, best_score):
""" スコア表示 """
count_image = sysfont.render(
"Best Score: {}".format(best_score), True, (0,0,0))
SURFACE.blit(count_image, (10,2))
count_image = sysfont.render(
"Your Score: {}".format(score), True, (0,0,0))
SURFACE.blit(count_image, (200,2))
def main():
""" メインルーチン """
#変数初期設定(ループ前)
best_score = 0
score = 0
gameover_flag = 2
#バーガーオブジェクト初期設定
burger = []
for i in range(40):
burger.append(0)
burger[i] = Burger()
#蛇オブジェクト初期設定
snake = []
for i in range(3):
snake.append(0)
snake[i] = Snake()
#鳥オブジェクト初期設定
bird = []
for i in range(3):
bird.append(0)
bird[i] = Bird()
#ハリネズミオブジェクト初期設定
hedgehog = []
for i in range(3):
hedgehog.append(0)
hedgehog[i] = Hedgehog()
#得点表示オブジェクト初期設定
point_ind = []
for i in range(20):
point_ind.append(0)
point_ind[i] = Point()
#効果音
sound_jump = pygame.mixer.Sound("jump.wav")
sound_jump.set_volume(0.5)
sound_eat = pygame.mixer.Sound("eat.wav")
sound_eat.set_volume(1.0)
sound_bonus = pygame.mixer.Sound("bonus.wav")
sound_bonus.set_volume(1.0)
sound_miss = pygame.mixer.Sound("miss.wav")
sound_miss.set_volume(1.0)
#BGM
pygame.mixer.music.load("bgm.wav")
while True:
#変数設定(タイトル)
a = 0
counter = 0
#画面塗りつぶし(背景描写)
SURFACE.blit(image_background,(0,0))
#タイトル表示
SURFACE.blit(image_title,(50,80))
#スコア表示
score_indication(score, best_score)
#説明書き&クレジット表示
count_image = sysfont.render(
"Press Space Key to Start", True, (0,0,0))
SURFACE.blit(count_image, (105,160))
count_image = sysfont.render(
"© 2017 KUNISAN.JP", True, (0,0,0))
SURFACE.blit(count_image, (125,250))
#ループ1 (タイトル画面)
while gameover_flag == 2:
#ウィンドウ閉じるボタン
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#キー入力判定
pressed = pygame.key.get_pressed()
if pressed[K_SPACE]:
a = 1
elif pressed[K_SPACE] == 0 and a == 1:
a = 0
gameover_flag = 0
#画面アップデート
pygame.display.update()
FPSCLOCK.tick(30)
#変数設定(ゲーム)
a = 0
counter = 0
score = 0
burger_point = 0
burger_combo = 0
x = 175
y = 250
jump_up = 0
jump_status = 0
burger_counter = 0
burger_interval = 50
snake_counter = 0
snake_interval = 500
bird_counter = 0
bird_interval = 1700
hedgehog_counter = 0
hedgehog_interval = 3500
point_x = 0
point_y = 0
point_ind_counter = 0
for i in range(len(burger)):
burger[i].status = 0
for i in range(len(snake)):
snake[i].status = 0
for i in range(len(bird)):
bird[i].status = 0
for i in range(len(hedgehog)):
hedgehog[i].status = 0
for i in range(len(point_ind)):
point_ind[i].status = 0
#BGM再生
pygame.mixer.music.play()
#ループ2 (メインループ)
while gameover_flag == 0:
counter += 1
#ウィンドウ閉じるボタン
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#キー入力判定
pressed = pygame.key.get_pressed()
if pressed[K_LEFT] and x > 0:
x -= 5
if pressed[K_RIGHT] and x < 350:
x += 5
if pressed[K_SPACE] and jump_status < 2: #ジャンプ準備
jump_status = 1
jump_up += 2
if jump_up < 8:
jump_up = 8
elif jump_up > 24:
jump_up = 24
if pressed[K_SPACE] == 0 and jump_status == 1: #ジャンプ開始
sound_jump.play()
jump_status = 2
if jump_status == 2: #ジャンプ中
y -= jump_up
jump_up -= 1
if y > 250: #ジャンプ終了
y = 250
jump_status = 0
burger_combo = 0
#画面塗りつぶし(背景描写)
SURFACE.blit(image_background,(0,0))
#犬表示
if jump_status == 0:
SURFACE.blit(image_dog,(x,y))
elif jump_status == 1:
SURFACE.blit(image_dog_jump1,(x,y))
elif jump_status == 2:
SURFACE.blit(image_dog_jump2,(x,y))
#バーガー処理
if counter % burger_interval == 0:
burger[burger_counter].on(counter)
burger_counter += 1
if burger_counter >= len(burger):
burger_counter = 0
if counter % 75 == 0:
burger_interval -= 1
if burger_interval < 5:
burger_interval = 5
#バーガー表示
for i in range(len(burger)):
#バーガー得点&座標取得
(burger_point, point_x, point_y) = burger[i].move(x,y)
if burger_point > 0:
sound_eat.play()
burger_combo += 1
if burger_point < 10000:
score += burger_point * burger_combo
point_ind[point_ind_counter].on(point_x, point_y, burger_point, burger_combo)
else:
sound_bonus.play()
score += burger_point
point_ind[point_ind_counter].on(point_x, point_y, burger_point, 1)
point_ind_counter += 1
if point_ind_counter >= len(point_ind):
point_ind_counter = 0
if burger_combo == 10: #コンボ10でボーナス10000点
sound_bonus.play()
score += 10000
point_ind[point_ind_counter].on(point_x, point_y, 10000, 1)
point_ind_counter += 1
if point_ind_counter >= len(point_ind):
point_ind_counter = 0
#蛇処理
if counter % snake_interval == 0 and snake[snake_counter].status == 0:
snake[snake_counter].on()
snake_counter += 1
if snake_interval > 500:
snake_interval = 299
if snake_counter >= len(snake):
snake_counter = 0
if counter % 501 == 0:
snake_interval -= random.randint(20, 100)
if snake_interval < 10:
snake_interval += random.randint(100, 300)
#蛇表示
for i in range(len(snake)):
#ゲームオーバーフラグ取得
a = snake[i].move(x,y)
if a == 1:
gameover_flag = 1
#鳥処理
if counter % bird_interval == 0 and bird[bird_counter].status == 0:
bird[bird_counter].on()
bird_counter += 1
if bird_interval > 1000:
bird_interval = 299
if bird_counter >= len(bird):
bird_counter = 0
if counter % 501 == 0:
bird_interval -= random.randint(20, 100)
if bird_interval < 50:
bird_interval += random.randint(100, 300)
#鳥表示
for i in range(len(bird)):
#ゲームオーバーフラグ取得
a = bird[i].move(x,y)
if a == 1:
gameover_flag = 1
#ハリネズミ処理
if counter % hedgehog_interval == 0 and hedgehog[hedgehog_counter].status == 0:
hedgehog[hedgehog_counter].on()
if counter > 4500:
hedgehog_counter += 1
if hedgehog_interval > 900:
hedgehog_interval = 299
if hedgehog_counter >= len(hedgehog):
hedgehog_counter = 0
if counter % 501 == 0:
hedgehog_interval -= random.randint(20, 100)
if hedgehog_interval < 200:
hedgehog_interval += random.randint(100, 300)
#ハリネズミ表示
for i in range(len(hedgehog)):
#ゲームオーバーフラグ取得
a = hedgehog[i].move(x,y)
if a == 1:
gameover_flag = 1
#得点表示
for i in range(len(point_ind)):
point_ind[i].indication()
#スコア表示
if score > best_score:
best_score = score
score_indication(score, best_score)
#画面アップデート
pygame.display.update()
FPSCLOCK.tick(30)
#BGM再生確認&リピート
if pygame.mixer.music.get_busy() == 0:
pygame.mixer.music.play()
#変数設定(ゲームオーバー)
a = 0
counter = 0
#BGM停止
pygame.mixer.music.stop()
sound_miss.play()
#ゲームオーバー表示
SURFACE.blit(image_gameover,(75,130))
#ループ3 (ゲームオーバー)
while gameover_flag == 1:
counter += 1
if counter >= 150:
gameover_flag = 2
#ウィンドウ閉じるボタン
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#キー入力判定
pressed = pygame.key.get_pressed()
if pressed[K_SPACE] == 0 and a == 0:
a = 1
elif pressed[K_SPACE] and a == 1:
a = 2
elif pressed[K_SPACE] == 0 and a == 2:
a = 0
gameover_flag = 2
#画面アップデート
pygame.display.update()
FPSCLOCK.tick(30)
if __name__ == '__main__':
main()