この記事の例では、参考のために戦車戦を達成するためのpythonの特定のコードを共有しています。具体的な内容は次のとおりです。
このゲームには大量のコードがあります
特定のコードと画像の音源は私のGitHubでダウンロードできます
githubアドレス
見てみましょうそしてパイソンを使ってタンクバトルゲームを作りましょう
弾丸クラスを作成する
import pygame
classBullet(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.bullet_up = pygame.image.load(r"..\image\bullet_up.png")
self.bullet_down = pygame.image.load(r"..\image\bullet_down.png")
self.bullet_left = pygame.image.load(r"..\image\bullet_left.png")
self.bullet_right = pygame.image.load(r"..\image\bullet_right.png")
# 弾丸方向スピードライフグラベル
self.dir_x, self.dir_y =0,0
self.speed =6
self.life = False
self.strong = False
self.bullet = self.bullet_up
self.rect = self.bullet.get_rect()
self.rect.left, self.rect.right =3+12*24,3+24*24
def changeImage(self, dir_x, dir_y):
self.dir_x, self.dir_y = dir_x, dir_y
if self.dir_x ==0 and self.dir_y ==-1:
self.bullet = self.bullet_up
elif self.dir_x ==0 and self.dir_y ==1:
self.bullet = self.bullet_down
elif self.dir_x ==-1 and self.dir_y ==0:
self.bullet = self.bullet_left
elif self.dir_x ==1 and self.dir_y ==0:
self.bullet = self.bullet_right
def move(self):
self.rect = self.rect.move(self.speed * self.dir_x,
self.speed * self.dir_y)
# 衝突マップの端
if self.rect.top <3:
self.life = False
# self.rect.left, self.rect.right =3+12*24,3+24*24if self.rect.bottom 630-3:
self.life = False
# self.rect.left, self.rect.right =3+12*24,3+24*24if self.rect.left <3:
self.life = False
# self.rect.left, self.rect.right =3+12*24,3+24*24if self.rect.right 630-3:
self.life = False
敵の戦車を作成する
import pygame
import random
import bulletClass
classEnemyTank(pygame.sprite.Sprite):
def __init__(self, x = None, kind = None, isred = None):
pygame.sprite.Sprite.__init__(self)
# タンクが現れる前にアニメーションを再生するかどうか
self.flash = False
self.times =90
# パラメータ:タンクタイプ
self.kind = kind
if not kind:
self.kind = random.choice([1,2,3,4])
# 敵の戦車の種類を選択してください
if self.kind ==1:
self.enemy_x_0 = pygame.image.load(r"..\image\enemy_1_0.png").convert_alpha()
self.enemy_x_3 = pygame.image.load(r"..\image\enemy_1_3.png").convert_alpha()if self.kind ==2:
self.enemy_x_0 = pygame.image.load(r"..\image\enemy_2_0.png").convert_alpha()
self.enemy_x_3 = pygame.image.load(r"..\image\enemy_2_3.png").convert_alpha()if self.kind ==3:
self.enemy_x_0 = pygame.image.load(r"..\image\enemy_3_1.png").convert_alpha()
self.enemy_x_3 = pygame.image.load(r"..\image\enemy_3_0.png").convert_alpha()if self.kind ==4:
self.enemy_x_0 = pygame.image.load(r"..\image\enemy_4_0.png").convert_alpha()
self.enemy_x_3 = pygame.image.load(r"..\image\enemy_4_3.png").convert_alpha()
self.enemy_3_0 = pygame.image.load(r"..\image\enemy_3_0.png").convert_alpha()
self.enemy_3_2 = pygame.image.load(r"..\image\enemy_3_2.png").convert_alpha()
# パラメータ:食べ物を持ってくるかどうか
self.isred = isred
if not None:
self.isred = random.choice((True, False, False, False, False))if self.isred:
self.tank = self.enemy_x_3
else:
self.tank = self.enemy_x_0
# パラメータ:タンク位置
self.x = x
if not self.x:
self.x = random.choice([1,2,3])
self.x -=1
# スポーツの2枚の写真
self.tank_R0 = self.tank.subsurface((0,48),(48,48))
self.tank_R1 = self.tank.subsurface((48,48),(48,48))
self.rect = self.tank_R0.get_rect()
self.rect.left, self.rect.top =3+ self.x *12*24,3+0*24
# タンク速度方向寿命弾丸寿命弾丸遅延
self.speed =1
self.dir_x, self.dir_y =0,1
self.life =1
self.bulletNotCooling = True
self.bullet = bulletClass.Bullet()
# 壁にぶつかっても方向を変える
self.dirChange = False
# 各タンクの異なる属性
if self.kind ==2:
self.speed =3if self.kind ==3:
self.life =3
def shoot(self):
# 弾丸に命を吹き込む
self.bullet.life = True
self.bullet.changeImage(self.dir_x, self.dir_y)if self.dir_x ==0 and self.dir_y ==-1:
self.bullet.rect.left = self.rect.left +20
self.bullet.rect.bottom = self.rect.top +1
elif self.dir_x ==0 and self.dir_y ==1:
self.bullet.rect.left = self.rect.left +20
self.bullet.rect.top = self.rect.bottom -1
elif self.dir_x ==-1 and self.dir_y ==0:
self.bullet.rect.right = self.rect.left -1
self.bullet.rect.top = self.rect.top +20
elif self.dir_x ==1 and self.dir_y ==0:
self.bullet.rect.left = self.rect.right +1
self.bullet.rect.top = self.rect.top +20
def move(self, tankGroup, brickGroup, ironGroup):
self.rect = self.rect.move(self.speed * self.dir_x, self.speed * self.dir_y)if self.dir_x ==0 and self.dir_y ==-1:
self.tank_R0 = self.tank.subsurface((0,0),(48,48))
self.tank_R1 = self.tank.subsurface((48,0),(48,48))
elif self.dir_x ==0 and self.dir_y ==1:
self.tank_R0 = self.tank.subsurface((0,48),(48,48))
self.tank_R1 = self.tank.subsurface((48,48),(48,48))
elif self.dir_x ==-1 and self.dir_y ==0:
self.tank_R0 = self.tank.subsurface((0,96),(48,48))
self.tank_R1 = self.tank.subsurface((48,96),(48,48))
elif self.dir_x ==1 and self.dir_y ==0:
self.tank_R0 = self.tank.subsurface((0,144),(48,48))
self.tank_R1 = self.tank.subsurface((48,144),(48,48))
# 衝突マップの端
if self.rect.top <3:
self.rect = self.rect.move(self.speed *0, self.speed *1)
self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))
elif self.rect.bottom 630-3:
self.rect = self.rect.move(self.speed *0, self.speed *-1)
self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))
elif self.rect.left <3:
self.rect = self.rect.move(self.speed *1, self.speed *0)
self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))
elif self.rect.right 630-3:
self.rect = self.rect.move(self.speed *-1, self.speed *0)
self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))
# 衝突壁とタンク
if pygame.sprite.spritecollide(self, brickGroup, False, None) \
or pygame.sprite.spritecollide(self, ironGroup, False, None) \
or pygame.sprite.spritecollide(self, tankGroup, False, None):
self.rect = self.rect.move(self.speed *-self.dir_x, self.speed *-self.dir_y)
self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))
食品カテゴリを作成
import pygame
import random
classFood(pygame.sprite.Sprite):
def __init__(self):
self.food_boom = pygame.image.load(r"..\image\food_boom.png").convert_alpha()
self.food_clock = pygame.image.load(r"..\image\food_clock.png").convert_alpha()
self.food_gun = pygame.image.load(r"..\image\food_gun.png").convert_alpha()
self.food_iron = pygame.image.load(r"..\image\food_iron.png").convert_alpha()
self.food_protect = pygame.image.load(r"..\image\food_protect.png").convert_alpha()
self.food_star = pygame.image.load(r"..\image\food_star.png").convert_alpha()
self.food_tank = pygame.image.load(r"..\image\food_tank.png").convert_alpha()
self.kind = random.choice([1,2,3,4,5,6,7])if self.kind ==1:
self.image = self.food_boom
elif self.kind ==2:
self.image = self.food_clock
elif self.kind ==3:
self.image = self.food_gun
elif self.kind ==4:
self.image = self.food_iron
elif self.kind ==5:
self.image = self.food_protect
elif self.kind ==6:
self.image = self.food_star
elif self.kind ==7:
self.image = self.food_tank
self.rect = self.image.get_rect()
self.rect.left = self.rect.top = random.randint(100,500)
self.life = False
def change(self):
self.kind = random.choice([1,2,3,4,5,6,7])if self.kind ==1:
self.image = self.food_boom
elif self.kind ==2:
self.image = self.food_clock
elif self.kind ==3:
self.image = self.food_gun
elif self.kind ==4:
self.image = self.food_iron
elif self.kind ==5:
self.image = self.food_protect
elif self.kind ==6:
self.image = self.food_star
elif self.kind ==7:
self.image = self.food_tank
self.rect.left = self.rect.top = random.randint(100,500)
self.life = True
タンクを作成
import pygame
import bulletClass
tank_T1_0 = r"..\image\tank_T1_0.png"
tank_T1_1 = r"..\image\tank_T1_1.png"
tank_T1_2 = r"..\image\tank_T1_2.png"
tank_T2_0 = r"..\image\tank_T2_0.png"
tank_T2_1 = r"..\image\tank_T2_1.png"
tank_T2_2 = r"..\image\tank_T2_2.png"classMyTank(pygame.sprite.Sprite):
def __init__(self, playerNumber):
pygame.sprite.Sprite.__init__(self)
self.life = True
if playerNumber ==1:
self.tank_L0_image = pygame.image.load(tank_T1_0).convert_alpha()
self.tank_L1_image = pygame.image.load(tank_T1_1).convert_alpha()
self.tank_L2_image = pygame.image.load(tank_T1_2).convert_alpha()if playerNumber ==2:
self.tank_L0_image = pygame.image.load(tank_T2_0).convert_alpha()
self.tank_L1_image = pygame.image.load(tank_T2_1).convert_alpha()
self.tank_L2_image = pygame.image.load(tank_T2_2).convert_alpha()
self.level =0
self.tank = self.tank_L0_image
self.tank_R0 = self.tank.subsurface((0,0),(48,48))
self.tank_R1 = self.tank.subsurface((48,0),(48,48))
self.rect = self.tank_R0.get_rect()if playerNumber ==1:
self.rect.left, self.rect.top =3+24*8,3+24*24if playerNumber ==2:
self.rect.left, self.rect.top =3+24*16,3+24*24
self.speed =3
self.dir_x, self.dir_y =0,-1
self.life =3
self.bulletNotCooling = True
self.bullet = bulletClass.Bullet()
# self.bullet.rect.left, self.bullet.rect.right =3+12*24,3+24*24
def shoot(self):
self.bullet.life = True
self.bullet.changeImage(self.dir_x, self.dir_y)if self.dir_x ==0 and self.dir_y ==-1:
self.bullet.rect.left = self.rect.left +20
self.bullet.rect.bottom = self.rect.top +1
elif self.dir_x ==0 and self.dir_y ==1:
self.bullet.rect.left = self.rect.left +20
self.bullet.rect.top = self.rect.bottom -1
elif self.dir_x ==-1 and self.dir_y ==0:
self.bullet.rect.right = self.rect.left -1
self.bullet.rect.top = self.rect.top +20
elif self.dir_x ==1 and self.dir_y ==0:
self.bullet.rect.left = self.rect.right +1
self.bullet.rect.top = self.rect.top +20if self.level ==1:
self.bullet.speed =16
self.bullet.strong = False
if self.level ==2:
self.bullet.speed =16
self.bullet.strong = True
if self.level ==3:
self.bullet.speed =48
self.bullet.strong = True
def levelUp(self):if self.level <2:
self.level +=1if self.level ==0:
self.tank = self.tank_L0_image
if self.level ==1:
self.tank = self.tank_L1_image
if self.level ==2:
self.tank = self.tank_L2_image
if self.level ==3:
self.tank = self.tank_L2_image
def levelDown(self):if self.level 0:
self.level -=1if self.level ==0:
self.tank = self.tank_L0_image
self.bullet.speed =6
self.bullet.strong = False
if self.level ==1:
self.tank = self.tank_L1_image
if self.level ==2:
self.tank = self.tank_L2_image
def moveUp(self, tankGroup, brickGroup, ironGroup):
self.rect = self.rect.move(self.speed *0, self.speed *-1)
self.tank_R0 = self.tank.subsurface((0,0),(48,48))
self.tank_R1 = self.tank.subsurface((48,0),(48,48))
self.dir_x, self.dir_y =0,-1if self.rect.top <3:
self.rect = self.rect.move(self.speed *0, self.speed *1)return True
if pygame.sprite.spritecollide(self, brickGroup, False, None) \
or pygame.sprite.spritecollide(self, ironGroup, False, None):
self.rect = self.rect.move(self.speed *0, self.speed *1)return True
if pygame.sprite.spritecollide(self, tankGroup, False, None):
self.rect = self.rect.move(self.speed *0, self.speed *1)return True
return False
def moveDown(self, tankGroup, brickGroup, ironGroup):
self.rect = self.rect.move(self.speed *0, self.speed *1)
self.tank_R0 = self.tank.subsurface((0,48),(48,48))
self.tank_R1 = self.tank.subsurface((48,48),(48,48))
self.dir_x, self.dir_y =0,1if self.rect.bottom 630-3:
self.rect = self.rect.move(self.speed *0, self.speed *-1)return True
if pygame.sprite.spritecollide(self, brickGroup, False, None) \
or pygame.sprite.spritecollide(self, ironGroup, False, None):
self.rect = self.rect.move(self.speed *0, self.speed *-1)return True
if pygame.sprite.spritecollide(self, tankGroup, False, None):
self.rect = self.rect.move(self.speed *0, self.speed *-1)return True
return False
def moveLeft(self, tankGroup, brickGroup, ironGroup):
self.rect = self.rect.move(self.speed *-1, self.speed *0)
self.tank_R0 = self.tank.subsurface((0,96),(48,48))
self.tank_R1 = self.tank.subsurface((48,96),(48,48))
self.dir_x, self.dir_y =-1,0if self.rect.left <3:
self.rect = self.rect.move(self.speed *1, self.speed *0)return True
if pygame.sprite.spritecollide(self, brickGroup, False, None) \
or pygame.sprite.spritecollide(self, ironGroup, False, None):
self.rect = self.rect.move(self.speed *1, self.speed *0)return True
if pygame.sprite.spritecollide(self, tankGroup, False, None):
self.rect = self.rect.move(self.speed *1, self.speed *0)return True
return False
def moveRight(self, tankGroup, brickGroup, ironGroup):
self.rect = self.rect.move(self.speed *1, self.speed *0)
self.tank_R0 = self.tank.subsurface((0,144),(48,48))
self.tank_R1 = self.tank.subsurface((48,144),(48,48))
self.dir_x, self.dir_y =1,0if self.rect.right 630-3:
self.rect = self.rect.move(self.speed *-1, self.speed *0)return True
if pygame.sprite.spritecollide(self, brickGroup, False, None) \
or pygame.sprite.spritecollide(self, ironGroup, False, None):
self.rect = self.rect.move(self.speed *-1, self.speed *0)return True
if pygame.sprite.spritecollide(self, tankGroup, False, None):
self.rect = self.rect.move(self.speed *-1, self.speed *0)return True
return False
ウォールクラスを作成する
import pygame
brickImage = r"..\image\brick.png"
ironImage = r"..\image\iron.png"classBrick(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(brickImage)
self.rect = self.image.get_rect()classIron(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(ironImage)
self.rect = self.image.get_rect()classMap():
def __init__(self):
self.brickGroup = pygame.sprite.Group()
self.ironGroup = pygame.sprite.Group()
# 数字は地図上の場所を表します
# レンガを描く
X1379 =[2,3,6,7,18,19,22,23]
Y1379 =[2,3,4,5,6,7,8,9,10,17,18,19,20,21,22,23]
X28 =[10,11,14,15]
Y28 =[2,3,4,5,6,7,8,11,12,15,16,17,18,19,20]
X46 =[4,5,6,7,18,19,20,21]
Y46 =[13,14]
X5 =[12,13]
Y5 =[16,17]
X0Y0 =[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]for x in X1379:for y in Y1379:
self.brick =Brick()
self.brick.rect.left, self.brick.rect.top =3+ x *24,3+ y *24
self.brickGroup.add(self.brick)for x in X28:for y in Y28:
self.brick =Brick()
self.brick.rect.left, self.brick.rect.top =3+ x *24,3+ y *24
self.brickGroup.add(self.brick)for x in X46:for y in Y46:
self.brick =Brick()
self.brick.rect.left, self.brick.rect.top =3+ x *24,3+ y *24
self.brickGroup.add(self.brick)for x in X5:for y in Y5:
self.brick =Brick()
self.brick.rect.left, self.brick.rect.top =3+ x *24,3+ y *24
self.brickGroup.add(self.brick)for x, y in X0Y0:
self.brick =Brick()
self.brick.rect.left, self.brick.rect.top =3+ x *24,3+ y *24
self.brickGroup.add(self.brick)
# 石を塗る
for x, y in[(0,14),(1,14),(12,6),(13,6),(12,7),(13,7),(24,14),(25,14)]:
self.iron =Iron()
self.iron.rect.left, self.iron.rect.top =3+ x *24,3+ y *24
self.ironGroup.add(self.iron)
メイン機能
# - *- coding: utf-8-*-import pygame
import sys
import traceback
import wall
import myTank
import enemyTank
import food
def main():
pygame.init()
pygame.mixer.init()
resolution =630,630
screen = pygame.display.set_mode(resolution)
pygame.display.set_caption("Tank War ")
# 画像を読み込む,音楽,サウンドエフェクト.
background_image = pygame.image.load(r"..\image\background.png")
home_image = pygame.image.load(r"..\image\home.png")
home_destroyed_image = pygame.image.load(r"..\image\home_destroyed.png")
bang_sound = pygame.mixer.Sound(r"..\music\bang.wav")
bang_sound.set_volume(1)
fire_sound = pygame.mixer.Sound(r"..\music\Gunfire.wav")
start_sound = pygame.mixer.Sound(r"..\music\start.wav")
start_sound.play()
# スプライトグループを定義する:戦車、私たちの戦車、敵の戦車、敵の弾丸
allTankGroup = pygame.sprite.Group()
mytankGroup = pygame.sprite.Group()
allEnemyGroup = pygame.sprite.Group()
redEnemyGroup = pygame.sprite.Group()
greenEnemyGroup = pygame.sprite.Group()
otherEnemyGroup = pygame.sprite.Group()
enemyBulletGroup = pygame.sprite.Group()
# マップを作成する
bgMap = wall.Map()
# 食べ物を作る/小道具は表示されません
prop = food.Food()
# タンクを作成する
myTank_T1 = myTank.MyTank(1)
allTankGroup.add(myTank_T1)
mytankGroup.add(myTank_T1)
myTank_T2 = myTank.MyTank(2)
allTankGroup.add(myTank_T2)
mytankGroup.add(myTank_T2)
# 敵の戦車を作成する
for i inrange(1,4):
enemy = enemyTank.EnemyTank(i)
allTankGroup.add(enemy)
allEnemyGroup.add(enemy)if enemy.isred == True:
redEnemyGroup.add(enemy)continueif enemy.kind ==3:
greenEnemyGroup.add(enemy)continue
otherEnemyGroup.add(enemy)
# 敵戦車登場のアニメーション
appearance_image = pygame.image.load(r"..\image\appear.png").convert_alpha()
appearance =[]
appearance.append(appearance_image.subsurface((0,0),(48,48)))
appearance.append(appearance_image.subsurface((48,0),(48,48)))
appearance.append(appearance_image.subsurface((96,0),(48,48)))
# カスタムイベント
# 敵の戦車作成のために200を遅らせる
DELAYEVENT = pygame.constants.USEREVENT
pygame.time.set_timer(DELAYEVENT,200)
# 敵の弾丸を作成するために1000を遅らせる
ENEMYBULLETNOTCOOLINGEVENT = pygame.constants.USEREVENT +1
pygame.time.set_timer(ENEMYBULLETNOTCOOLINGEVENT,1000)
# 弾丸遅延200を作成します
MYBULLETNOTCOOLINGEVENT = pygame.constants.USEREVENT +2
pygame.time.set_timer(MYBULLETNOTCOOLINGEVENT,200)
# 敵の戦車はまだ8000
NOTMOVEEVENT = pygame.constants.USEREVENT +3
pygame.time.set_timer(NOTMOVEEVENT,8000)
delay =100
moving =0
movdir =0
moving2 =0
movdir2 =0
enemyNumber =3
enemyCouldMove = True
switch_R1_R2_image = True
homeSurvive = True
running_T1 = True
running_T2 = True
clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 弾丸冷却イベント
if event.type == MYBULLETNOTCOOLINGEVENT:
myTank_T1.bulletNotCooling = True
# 敵の弾丸冷却イベント
if event.type == ENEMYBULLETNOTCOOLINGEVENT:for each in allEnemyGroup:
each.bulletNotCooling = True
# 敵戦車静止イベント
if event.type == NOTMOVEEVENT:
enemyCouldMove = True
# 敵の戦車の作成の遅れ
if event.type == DELAYEVENT:if enemyNumber <4:
enemy = enemyTank.EnemyTank()if pygame.sprite.spritecollide(enemy, allTankGroup, False, None):break
allEnemyGroup.add(enemy)
allTankGroup.add(enemy)
enemyNumber +=1if enemy.isred == True:
redEnemyGroup.add(enemy)
elif enemy.kind ==3:
greenEnemyGroup.add(enemy)else:
otherEnemyGroup.add(enemy)if event.type == pygame.KEYDOWN:if event.key == pygame.K_c and pygame.KMOD_CTRL:
pygame.quit()
sys.exit()if event.key == pygame.K_e:
myTank_T1.levelUp()if event.key == pygame.K_q:
myTank_T1.levelDown()if event.key == pygame.K_3:
myTank_T1.levelUp()
myTank_T1.levelUp()
myTank_T1.level =3if event.key == pygame.K_2:if myTank_T1.speed ==3:
myTank_T1.speed =24else:
myTank_T1.speed =3if event.key == pygame.K_1:for x, y in[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:
bgMap.brick = wall.Brick()
bgMap.brick.rect.left, bgMap.brick.rect.top =3+ x *24,3+ y *24
bgMap.brickGroup.add(bgMap.brick)if event.key == pygame.K_4:for x, y in[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:
bgMap.iron = wall.Iron()
bgMap.iron.rect.left, bgMap.iron.rect.top =3+ x *24,3+ y *24
bgMap.ironGroup.add(bgMap.iron)
# ユーザーのキーボード操作を確認する
key_pressed = pygame.key.get_pressed()
# プレイヤーワンムーブ
if moving:
moving -=1if movdir ==0:
allTankGroup.remove(myTank_T1)if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving +=1
allTankGroup.add(myTank_T1)
running_T1 = True
if movdir ==1:
allTankGroup.remove(myTank_T1)if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving +=1
allTankGroup.add(myTank_T1)
running_T1 = True
if movdir ==2:
allTankGroup.remove(myTank_T1)if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving +=1
allTankGroup.add(myTank_T1)
running_T1 = True
if movdir ==3:
allTankGroup.remove(myTank_T1)if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving +=1
allTankGroup.add(myTank_T1)
running_T1 = True
if not moving:if key_pressed[pygame.K_w]:
moving =7
movdir =0
running_T1 = True
allTankGroup.remove(myTank_T1)if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving =0
allTankGroup.add(myTank_T1)
elif key_pressed[pygame.K_s]:
moving =7
movdir =1
running_T1 = True
allTankGroup.remove(myTank_T1)if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving =0
allTankGroup.add(myTank_T1)
elif key_pressed[pygame.K_a]:
moving =7
movdir =2
running_T1 = True
allTankGroup.remove(myTank_T1)if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving =0
allTankGroup.add(myTank_T1)
elif key_pressed[pygame.K_d]:
moving =7
movdir =3
running_T1 = True
allTankGroup.remove(myTank_T1)if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):
moving =0
allTankGroup.add(myTank_T1)if key_pressed[pygame.K_j]:if not myTank_T1.bullet.life and myTank_T1.bulletNotCooling:
fire_sound.play()
myTank_T1.shoot()
myTank_T1.bulletNotCooling = False
# プレイヤー2の移動操作
if moving2:
moving2 -=1if movdir2 ==0:
allTankGroup.remove(myTank_T2)
myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
running_T2 = True
if movdir2 ==1:
allTankGroup.remove(myTank_T2)
myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
running_T2 = True
if movdir2 ==2:
allTankGroup.remove(myTank_T2)
myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
running_T2 = True
if movdir2 ==3:
allTankGroup.remove(myTank_T2)
myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
running_T2 = True
if not moving2:if key_pressed[pygame.K_UP]:
allTankGroup.remove(myTank_T2)
myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
moving2 =7
movdir2 =0
running_T2 = True
elif key_pressed[pygame.K_DOWN]:
allTankGroup.remove(myTank_T2)
myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
moving2 =7
movdir2 =1
running_T2 = True
elif key_pressed[pygame.K_LEFT]:
allTankGroup.remove(myTank_T2)
myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
moving2 =7
movdir2 =2
running_T2 = True
elif key_pressed[pygame.K_RIGHT]:
allTankGroup.remove(myTank_T2)
myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(myTank_T2)
moving2 =7
movdir2 =3
running_T2 = True
if key_pressed[pygame.K_KP0]:if not myTank_T2.bullet.life:
# fire_sound.play()
myTank_T2.shoot()
# 背景を描く
screen.blit(background_image,(0,0))
# レンガを描く
for each in bgMap.brickGroup:
screen.blit(each.image, each.rect)
# フラワーストーン
for each in bgMap.ironGroup:
screen.blit(each.image, each.rect)
# 家に帰る
if homeSurvive:
screen.blit(home_image,(3+12*24,3+24*24))else:
screen.blit(home_destroyed_image,(3+12*24,3+24*24))
# 私たちのタンクを引く1ifnot(delay %5):
switch_R1_R2_image = not switch_R1_R2_image
if switch_R1_R2_image and running_T1:
screen.blit(myTank_T1.tank_R0,(myTank_T1.rect.left, myTank_T1.rect.top))
running_T1 = False
else:
screen.blit(myTank_T1.tank_R1,(myTank_T1.rect.left, myTank_T1.rect.top))
# タンク2ifスイッチを引く_R1_R2_image and running_T2:
screen.blit(myTank_T2.tank_R0,(myTank_T2.rect.left, myTank_T2.rect.top))
running_T2 = False
else:
screen.blit(myTank_T2.tank_R1,(myTank_T2.rect.left, myTank_T2.rect.top))
# 敵の戦車を引く
for each in allEnemyGroup:
# 50セントの特殊効果が再生されているかどうかを確認します
if each.flash:
# 左に描くか右に描くかを決める
if switch_R1_R2_image:
screen.blit(each.tank_R0,(each.rect.left, each.rect.top))if enemyCouldMove:
allTankGroup.remove(each)
each.move(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(each)else:
screen.blit(each.tank_R1,(each.rect.left, each.rect.top))if enemyCouldMove:
allTankGroup.remove(each)
each.move(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)
allTankGroup.add(each)else:
# 5セントの特殊効果を再生する
if each.times 0:
each.times -=1if each.times <=10:
screen.blit(appearance[2],(3+ each.x *12*24,3))
elif each.times <=20:
screen.blit(appearance[1],(3+ each.x *12*24,3))
elif each.times <=30:
screen.blit(appearance[0],(3+ each.x *12*24,3))
elif each.times <=40:
screen.blit(appearance[2],(3+ each.x *12*24,3))
elif each.times <=50:
screen.blit(appearance[1],(3+ each.x *12*24,3))
elif each.times <=60:
screen.blit(appearance[0],(3+ each.x *12*24,3))
elif each.times <=70:
screen.blit(appearance[2],(3+ each.x *12*24,3))
elif each.times <=80:
screen.blit(appearance[1],(3+ each.x *12*24,3))
elif each.times <=90:
screen.blit(appearance[0],(3+ each.x *12*24,3))if each.times ==0:
each.flash = True
# myTankの場合は弾丸1を描画します_T1.bullet.life:
myTank_T1.bullet.move()
screen.blit(myTank_T1.bullet.bullet, myTank_T1.bullet.rect)
# 弾丸衝突弾丸
for each in enemyBulletGroup:if each.life:if pygame.sprite.collide_rect(myTank_T1.bullet, each):
myTank_T1.bullet.life = False
each.life = False
pygame.sprite.spritecollide(myTank_T1.bullet, enemyBulletGroup, True, None)
# 弾丸が敵の戦車に当たる
if pygame.sprite.spritecollide(myTank_T1.bullet, redEnemyGroup, True, None):
prop.change()
bang_sound.play()
enemyNumber -=1
myTank_T1.bullet.life = False
elif pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup, False, None):for each in greenEnemyGroup:if pygame.sprite.collide_rect(myTank_T1.bullet, each):if each.life ==1:
pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup, True, None)
bang_sound.play()
enemyNumber -=1
elif each.life ==2:
each.life -=1
each.tank = each.enemy_3_0
elif each.life ==3:
each.life -=1
each.tank = each.enemy_3_2
myTank_T1.bullet.life = False
elif pygame.sprite.spritecollide(myTank_T1.bullet, otherEnemyGroup, True, None):
bang_sound.play()
enemyNumber -=1
myTank_T1.bullet.life = False
# if pygame.sprite.spritecollide(myTank_T1.bullet, allEnemyGroup, True, None):
# bang_sound.play()
# enemyNumber -=1
# myTank_T1.bullet.life = False
# 弾丸衝突brickGroup
if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.brickGroup, True, None):
myTank_T1.bullet.life = False
myTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right =3+12*24,3+24*24
# 弾丸衝突brickGroup
if myTank_T1.bullet.strong:if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, True, None):
myTank_T1.bullet.life = False
myTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right =3+12*24,3+24*24else:if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, False, None):
myTank_T1.bullet.life = False
myTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right =3+12*24,3+24*24
# myTankの場合は弾丸2を描画します_T2.bullet.life:
myTank_T2.bullet.move()
screen.blit(myTank_T2.bullet.bullet, myTank_T2.bullet.rect)
# 弾丸が敵の戦車に当たる
if pygame.sprite.spritecollide(myTank_T2.bullet, allEnemyGroup, True, None):
bang_sound.play()
enemyNumber -=1
myTank_T2.bullet.life = False
# 弾丸衝突brickGroup
if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.brickGroup, True, None):
myTank_T2.bullet.life = False
myTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right =3+12*24,3+24*24
# 弾丸衝突brickGroup
if myTank_T2.bullet.strong:if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, True, None):
myTank_T2.bullet.life = False
myTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right =3+12*24,3+24*24else:if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, False, None):
myTank_T2.bullet.life = False
myTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right =3+12*24,3+24*24
# 敵の弾丸を引く
for each in allEnemyGroup:
# 弾丸に命がない場合は、弾丸に命を与えます
if not each.bullet.life and each.bulletNotCooling and enemyCouldMove:
enemyBulletGroup.remove(each.bullet)
each.shoot()
enemyBulletGroup.add(each.bullet)
each.bulletNotCooling = False
# 5セントの特殊効果が終了し、弾丸が生きている場合は、敵の弾丸を引きます
if each.flash:if each.bullet.life:
# 敵が動けるなら
if enemyCouldMove:
each.bullet.move()
screen.blit(each.bullet.bullet, each.bullet.rect)
# 弾丸が私たちのタンクに当たった
if pygame.sprite.collide_rect(each.bullet, myTank_T1):
bang_sound.play()
myTank_T1.rect.left, myTank_T1.rect.top =3+8*24,3+24*24
each.bullet.life = False
moving =0 #移動制御パラメータをリセットする
for i inrange(myTank_T1.level+1):
myTank_T1.levelDown()if pygame.sprite.collide_rect(each.bullet, myTank_T2):
bang_sound.play()
myTank_T2.rect.left, myTank_T2.rect.top =3+16*24,3+24*24
each.bullet.life = False
# 弾丸衝突brickGroup
if pygame.sprite.spritecollide(each.bullet, bgMap.brickGroup, True, None):
each.bullet.life = False
# 弾丸衝突ironGroup
if each.bullet.strong:if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, True, None):
each.bullet.life = False
else:if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, False, None):
each.bullet.life = False
# 最後に食べ物を描く/小道具
if prop.life:
screen.blit(prop.image, prop.rect)
# 私たちのタンクは食べ物と衝突します/小道具
if pygame.sprite.collide_rect(myTank_T1, prop):if prop.kind ==1: #敵は完全に破壊されます
for each in allEnemyGroup:if pygame.sprite.spritecollide(each, allEnemyGroup, True, None):
bang_sound.play()
enemyNumber -=1
prop.life = False
if prop.kind ==2: #敵はじっと立っている
enemyCouldMove = False
prop.life = False
if prop.kind ==3: #弾丸の強化
myTank_T1.bullet.strong = True
prop.life = False
if prop.kind ==4: #家は保護されています
for x, y in[(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:
bgMap.iron = wall.Iron()
bgMap.iron.rect.left, bgMap.iron.rect.top =3+ x *24,3+ y *24
bgMap.ironGroup.add(bgMap.iron)
prop.life = False
if prop.kind ==5: #無敵のタンク
prop.life = False
pass
if prop.kind ==6: #タンクのアップグレード
myTank_T1.levelUp()
prop.life = False
if prop.kind ==7: #タンク寿命+1
myTank_T1.life +=1
prop.life = False
# ディレイ
delay -=1if not delay:
delay =100
pygame.display.flip()
clock.tick(60)if __name__ =="__main__":try:main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()input()
実行結果
上、下、左、右の矢印キーとWSADを押して、タンクを移動できます
0とjを押して弾丸を発射します。
より興味深い古典的なミニゲームの実装トピック、あなたと共有してください:
C ++クラシックゲームの概要
Pythonクラシックゲームの概要
pythontetrisゲームコレクション
JavaScriptクラシックゲームは常にプレイされています
古典的なJavaゲームの概要
JavaScriptクラシックゲームの概要
以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。
Recommended Posts