プレイ方法

1.下記のURLからPythonをダウンロードする。

 

2.IDLEというソフトを開きFile>>New Fileと選択し開いたページに下記のコードをペーストする。

3.IDLEのFile>>Saveを選択し適当に名前を付ける。

4.コードをペーストしたページを選択しRun>>Run Moduleを選択を選択するとプレイできます。

ゲーム操作方法

方向キー左右で移動しスペースを押す度に玉が出ます。敵を倒すと20点敵を逃すと減点敵と当たるとゲームオーバーです。

 

コード

import pygame
import random
import sys
import math

pygame.init()

WIDTH=800
HEIGHT=600
screen=pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Pygameシューティング! 撃ちまくっれ!")

BLACK=(0,0,0)
WHITE=(255,255,255)
BLUE=(50,150,255)
RED=(255,50,50)
YELLOW=(255,255,0)
GREEN=(50,200,50)
PURPLE=(150,50,200)

font_large=pygame.font.SysFont("malgungothic",50,bold=True)
font_small=pygame.font.SysFont("malgungothic",30)
font_score=pygame.font.SysFont("malgungothic",24)

clock=pygame.time.Clock()

class Bullet:
    def __init__(self,x,y,speed=10):
        self.x=x
        self.y=y
        self.speed=speed
        self.size=5
        self.color=YELLOW

    def update(self):
        self.y-=self.speed

    def draw(self,screen):
        pygame.draw.circle(screen,self.color,(int(self.x),int(self.y)),self.size)

class Enemy:
    def __init__(self):
        self.x=random.randint(0,WIDTH-40)
        self.y=-50
        self.width=40
        self.height=40
        self.speed=random.randint(2,5)
        self.color=RED

    def update(self):
        self.y+=self.speed
        self.x+=math.sin(self.y*0.02)*2

    def draw(self,screen):
        pygame.draw.rect(screen,self.color,(self.x,self.y,self.width,self.height))
        pygame.draw.circle(screen,WHITE,(int(self.x+8),int(self.y+10)),4)
        pygame.draw.circle(screen,WHITE,(int(self.x+28),int(self.y+10)),4)

class Player:
    def __init__(self):
        self.x=WIDTH//2-25
        self.y=HEIGHT-80
        self.width=50
        self.height=50
        self.speed=7
        self.color=BLUE
        self.shoot_delay=0
        self.max_delay=10

    def update(self,keys):
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.x-=self.speed
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.x+=self.speed
        self.x=max(0,min(WIDTH-self.width,self.x))

        if self.shoot_delay>0:
            self.shoot_delay-=1

    def shoot(self):
        if self.shoot_delay==0:
            bullets.append(Bullet(self.x+self.width//2,self.y))
            self.shoot_delay=self.max_delay
            return True
        return False

    def draw(self,screen):
        pygame.draw.rect(screen,self.color,(self.x,self.y,self.width,self.height))
        pygame.draw.polygon(screen,GREEN,[(self.x-10,self.y+20),(self.x,self.y+10),(self.x,self.y+30)])
        pygame.draw.polygon(screen,GREEN,[(self.x+self.width+10,self.y+20),(self.x+self.width,self.y+10),(self.x+self.width,self.y+30)])

player=Player()
bullets=[]
enemies=[]
score=0
spawn_timer=0
game_over=False
running=True

while running:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_r and game_over:
                player=Player()
                bullets=[]
                enemies=[]
                score=0
                spawn_timer=0
                game_over=False
            if event.key==pygame.K_SPACE and not game_over:
                player.shoot()

        if not game_over:
            keys=pygame.key.get_pressed()
            player.update(keys)

        spawn_timer+=1
        if spawn_timer>max(30,120-score//100):
            spawn_timer=0
            enemies.append(Enemy())

        for bullet in bullets[:]:
            bullet.update()
            if bullet.y<0:
                bullets.remove(bullet)

        for enemy in enemies[:]:
            enemy.update()
            if enemy.y>HEIGHT:
                enemies.remove(enemy)
                score-=5

            if (player.x<enemy.x+enemy.width and player.x+player.width>enemy.x and player.y<enemy.y+enemy.height and player.y+player.height>enemy.y):
                game_over=True

            for bullet in bullets[:]:
                if (bullet.x-bullet.size<enemy.x+enemy.width and bullet.x+bullet.size>enemy.x and bullet.y-bullet.size<enemy.y+enemy.height and bullet.y+bullet.size>enemy.y):
                    enemies.remove(enemy)
                    bullets.remove(bullet)
                    score+=20
                    break

    screen.fill((20,100,200))

    for _ in range(50):
        x=random.randint(0,WIDTH)
        y=random.randint(0,HEIGHT)
        pygame.draw.circle(screen,WHITE,(x,y),1)

    if not game_over:
        player.draw(screen)
        for bullet in bullets:
            bullet.draw(screen)
        for enemy in enemies:
            enemy.draw(screen)

        score_text=font_score.render(f"スコア:{score}",True,WHITE)
        screen.blit(score_text,(20,20))
        
    else:
        over_text=font_large.render("ゲームオーバー",True,RED)
        restart_text=font_small.render("Rキーでリスタート",True,WHITE)
        final_score=font_small.render(f"最終スコア:{score}",True,WHITE)
        screen.blit(over_text,(WIDTH//2-over_text.get_width()//2,HEIGHT//2-60))
        screen.blit(final_score,(WIDTH//2-final_score.get_width()//2,HEIGHT//2))
        screen.blit(restart_text,(WIDTH//2-restart_text.get_width()//2,HEIGHT//2+60))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()