アフィリエイト広告を利用しています

広告

posted by fanblog

2020年05月24日

pygame 途中ですがブロックゲーム

壁PingPongの次は、
ブロックゲームでしょ。

どうしてもcontainersが馴染めず、
group.addにこだわりました。

とりあえず、ここまで出来ました。
画像をダウンロードして、プログラムをコピーすれば動きます。

racket.png
bar_B.png
gold.png
platinium.png
ruby.png
silver.png
ball.png
output2.gif

#!usr/bin/env python
#coding:utf-8
import pygame
from pygame.locals import*
import sys
import random

START,PLAY,GAMEOVER,GAMECLEAR=(0,1,2,3)
SCR_RECT=Rect(0,0,480,640)
RACKET_MOVE_RECT=Rect(0,320,480,320)

class WallPingPong():
def __init__(self):
self.counter=0
self.score=0
pygame.init()
self.screen=pygame.display.set_mode(SCR_RECT.size)
pygame.display.set_caption(u"壁ピンポン!!")
self.load_images()
self.init_game()
clock=pygame.time.Clock()
while True:
clock.tick(60)
self.update()
self.draw(self.screen)
pygame.display.update()
self.key_handler()
else:
self.game_state=PLAY

def init_game(self):
self.game_state=START
self.racket=Racket()
self.enemy=Enemy()
self.ball_list=[Ball(10,10,self.racket,self.enemy),
Ball(3,4,self.racket,self.enemy),
Ball(-2,5,self.racket,self.enemy),
Ball(-6,8,self.racket,self.enemy)]
self.map_data=[[0,0,0,0,0,0,0,0,0],
[1,1,0,2,3,2,1,1,1],
[0,1,1,4,1,1,0,1,1],
[1,3,0,2,2,2,1,1,1],
[0,1,1,4,1,1,4,1,1],
[0,3,1,4,1,1,0,1,1],
[1,1,0,2,2,2,1,1,1],
[0,0,0,0,3,0,0,0,0]]
self.block_list=[]
for x in range(9):
for y in range(8):
if self.map_data[y][x]==1:
self.block_list.append(Block_Gold(x,y,self.ball_list))
elif self.map_data[y][x]==2:
self.block_list.append(Block_Platinium(x,y,self.ball_list))
elif self.map_data[y][x]==3:
self.block_list.append(Block_Ruby(x,y,self.ball_list))
elif self.map_data[y][x]==4:
self.block_list.append(Block_Silver(x,y,self.ball_list))
self.group1=pygame.sprite.RenderUpdates()
self.group2=pygame.sprite.RenderUpdates()
self.group3=pygame.sprite.RenderUpdates()
self.group1.add(self.racket,self.enemy)
self.group2.add(self.ball_list)
self.group3.add(self.block_list[0:random.randint(1,47)])
self.balls=pygame.sprite.Group(self.group2)
self.blocks=pygame.sprite.Group(self.group3)

def update(self):
if self.game_state==PLAY:
self.counter+=1
self.group1.update()
self.group2.update()
self.group3.update()
if len(self.balls.sprites())==0:
self.game_state=GAMEOVER
if pygame.sprite.groupcollide(self.group2,self.group3,False,False):
self.score+=10
if len(self.blocks.sprites())==0:
self.game_state=GAMECLEAR

def draw(self,screen):
screen.fill((0,0,0))
if self.game_state==START:
title_font=pygame.font.SysFont(None,80)
title=title_font.render("Wall PingPong!!",True,(255,0,0))
screen.blit(title,((SCR_RECT.width-title.get_width())//2,100))
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(255,255,255))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
self.group1.draw(screen)
elif self.game_state==PLAY:
self.group1.draw(screen)
self.group2.draw(screen)
self.group3.draw(screen)
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".\
format(self.score,self.counter),True,(255,0,0))
screen.blit(stat,(0,0))
elif self.game_state==GAMEOVER:
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".\
format(self.score,self.counter),False,(255,0,0))
screen.blit(stat,(0,0))
gameover_font=pygame.font.SysFont(None,80)
gameover=gameover_font.render("GAMEOVER",True,(255,255,255))
screen.blit(gameover,((SCR_RECT.width-gameover.get_width())//2,100))
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(255,255,255))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
cresit_font=pygame.font.SysFont(None,20)
cresit=cresit_font.render("2020 by https://fanblogs.jp/aimyself/",True,(255,255,255))
screen.blit(cresit,((SCR_RECT.width-cresit.get_width())//2,600))
elif self.game_state==GAMECLEAR:
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".\
format(self.score,self.counter),False,(255,0,0))
screen.blit(stat,(0,0))
gameover_font=pygame.font.SysFont(None,80)
gameover=gameover_font.render("GAMECLEAR",True,(255,255,255))
screen.blit(gameover,((SCR_RECT.width-gameover.get_width())//2,100))
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(255,255,255))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
cresit_font=pygame.font.SysFont(None,20)
cresit=cresit_font.render("2020 by https://fanblogs.jp/aimyself/",True,(255,255,255))
screen.blit(cresit,((SCR_RECT.width-cresit.get_width())//2,600))

def key_handler(self):
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN and event.key==K_ESCAPE:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN and event.key==K_SPACE:
if self.game_state==START:
self.game_state=PLAY
elif self.game_state==GAMEOVER:
self.score=0
self.counter=0
self.init_game()
self.game_state=PLAY
elif self.game_state==GAMECLEAR:
self.score=self.score
self.counter=0
self.init_game()
self.game_state=PLAY

def load_images(self):
Racket.image=load_image("racket.png")
Enemy.image=load_image("bar_B.png")
Ball.image=load_image("ball.png")
Block_Gold.image=load_image("gold.png")
Block_Platinium.image=load_image("platinium.png")
Block_Ruby.image=load_image("ruby.png")
Block_Silver.image=load_image("silver.png")

class Racket(pygame.sprite.Sprite):
speed=10
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/2,SCR_RECT.height/5*4)
def update(self):
pressed_keys=pygame.key.get_pressed()
if pressed_keys[K_LEFT]:
self.rect.move_ip(-self.speed,0)
if pressed_keys[K_RIGHT]:
self.rect.move_ip(self.speed,0)
if pressed_keys[K_UP]:
self.rect.move_ip(0,-self.speed)
if pressed_keys[K_DOWN]:
self.rect.move_ip(0,self.speed)
self.rect.clamp_ip(RACKET_MOVE_RECT)

class Enemy(pygame.sprite.Sprite):
speed=10
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/3,SCR_RECT.height/5*4)
def update(self):
self.rect.center=pygame.mouse.get_pos()
self.rect.clamp_ip(RACKET_MOVE_RECT)

class Ball(pygame.sprite.Sprite):
def __init__(self,vx,vy,racket,enemy):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/2,SCR_RECT.height/5*4)
self.vy=vy
self.vx=vx
self.racket=racket
self.enemy=enemy
def update(self):
self.rect.move_ip(self.vx,self.vy)
if self.rect.left<0 or self.rect.right>SCR_RECT.width:
self.vx=-self.vx
if self.rect.top<SCR_RECT.top:
self.vy=-self.vy
if self.rect.colliderect(self.racket.rect) and self.vy>0:
self.vy=-self.vy
if self.rect.colliderect(self.enemy.rect) and self.vy>0:
self.vy=-self.vy
if self.rect.bottom>SCR_RECT.bottom:
self.kill()

class Block_Gold(pygame.sprite.Sprite):
def __init__(self,x,y,ball_list):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.left=SCR_RECT.left+x*self.rect.width+5*(x+1)
self.rect.top=SCR_RECT.top+y*self.rect.height+5*(y+1)
self.ball_list=ball_list
self.hardness=3
def update(self):
for i in range(0,4):
if self.rect.colliderect(self.ball_list[i].rect)>0:
self.ball_list[i].vy=-self.ball_list[i].vy
self.hardness+=-1
if self.hardness<=0:
self.kill()

class Block_Platinium(pygame.sprite.Sprite):
def __init__(self,x,y,ball_list):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.left=SCR_RECT.left+x*self.rect.width+5*(x+1)
self.rect.top=SCR_RECT.top+y*self.rect.height+5*(y+1)
self.ball_list=ball_list
self.hardness=4
def update(self):
for i in range(0,4):
if self.rect.colliderect(self.ball_list[i].rect)>0:
self.ball_list[i].vy=-self.ball_list[i].vy
self.hardness+=-1
if self.hardness<=0:
self.kill()
class Block_Ruby(pygame.sprite.Sprite):
def __init__(self,x,y,ball_list):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.left=SCR_RECT.left+x*self.rect.width+5*(x+1)
self.rect.top=SCR_RECT.top+y*self.rect.height+5*(y+1)
self.ball_list=ball_list
self.hardness=9
def update(self):
for i in range(0,4):
if self.rect.colliderect(self.ball_list[i].rect)>0:
self.ball_list[i].vy=-self.ball_list[i].vy
self.hardness+=-1
if self.hardness<=0:
self.kill()

class Block_Silver(pygame.sprite.Sprite):
def __init__(self,x,y,ball_list):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.left=SCR_RECT.left+x*self.rect.width+5*(x+1)
self.rect.top=SCR_RECT.top+y*self.rect.height+5*(y+1)
self.ball_list=ball_list
self.hardness=2
def update(self):
for i in range(0,4):
if self.rect.colliderect(self.ball_list[i].rect)>0:
self.ball_list[i].vy=-self.ball_list[i].vy
self.hardness+=-1
if self.hardness<=0:
self.kill()

def load_image(filename):
image=pygame.image.load(filename).convert_alpha()
return image

if __name__=="__main__":
WallPingPong()
posted by もう一人の自分 at 17:51| pygame
検索

私が見た動画紹介コーナー

素敵です

プロフィール
もう一人の自分さんの画像
もう一人の自分
好きなことを仕事にしなかった
プロフィール
最新記事
カテゴリーアーカイブ
ファン
写真ギャラリー
×

この広告は30日以上新しい記事の更新がないブログに表示されております。