Pythonは単純なタンクバトルを実装します

オブジェクト指向のプログラミングのアイデアに基づいて、簡単なタンクバトルゲームを完了します。主な目的は、オブジェクト指向のプログラミングのアイデアをトレーニングすることです
ゲームの作成にpythonを使用する場合は、同じpygameモジュールをインストールする必要があります

インストール方法:

pycharmのインストール方法:ファイル—設定

ゲームの主なオブジェクトは次のとおりです。

タンクの親クラス:BaseTank
私たちのタンク:HeroTank
敵タンク:EnemyTank
弾丸:弾丸
爆発クラス:爆発
壁のカテゴリ:壁
メインプロセス:MainGame

スプライトクラスを定義します:

# スプライトクラスを定義する
classBaseItem(Sprite):
 def __init__(self, color, width, height):
 # Call the parent class(Sprite) constructor
 pygame.sprite.Sprite.__init__(self)

タンクの親クラス:

# タンクの親
classBaseTank(BaseItem):
 # クラス属性を定義します。すべてのタンクオブジェクトの高さと幅は同じです。
 width =60
 height =60

 def __init__(self, left, top):
 self.direction ='U' #タンクの方向はデフォルトで上向きです
 # 写真を保存するための辞書
 self.images ={'U': pygame.image.load('tank_img/p1tankU.gif'),'D': pygame.image.load('tank_img/p1tankD.gif'),'L': pygame.image.load('tank_img/p1tankL.gif'),'R': pygame.image.load('tank_img/p1tankR.gif')}
 self.image = self.images[self.direction] #タンクの絵は方向によって決まります
 self.speed =5 #タンクの速度
 self.rect = self.image.get_rect()
 # 配置場所を設定する
 self.rect.left = left
 self.rect.top = top
 self.stop = True #タンクは止まりますか
 self.live = True #タンクが破壊されているかどうかを判断します

 # 元の位置を維持します
 self.oldLeft = self.rect.left
 self.oldTop = self.rect.top

 # 撮影方法
 def shot(self):returnBullet(self)

 # タンクの動き
 def move(self):
 # 元の状態を維持する
 self.oldLeft = self.rect.left
 self.oldTop = self.rect.top
 # タンクの移動方向を決定します
 if self.direction =='U':if self.rect.top   0:
 self.rect.top -= self.speed
 elif self.direction =='D':if self.rect.top + self.rect.height < WINDOW_HEIGHT:
 self.rect.top += self.speed
 elif self.direction =='L':if self.rect.left   0:
 self.rect.left -= self.speed
 elif self.direction =='R':if self.rect.left+self.rect.height < WINDOW_WIDTH:
 self.rect.left += self.speed
 
 # ロードタンク
 def displayTank(self):
 self.image = self.images[self.direction]
 MainGame.window.blit(self.image, self.rect)
 
 # 壁に当たる
 def hitWall(self):for wall in MainGame.wallList:if pygame.sprite.collide_rect(wall, self):
 self.stay()
 
 # 処理位置は変更されていません
 def stay(self):
 self.rect.left = self.oldLeft
 self.rect.top = self.oldTop

私たちのタンククラス():

# 私たちのタンク
classHeroTank(BaseTank):
 def __init__(self, left, top):super().__init__(left, top)
 
 # 私たちの戦車が敵の戦車と衝突する
 def myTank_hit_enemyTank(self):for enemyTank in MainGame.EnemyTankList:if pygame.sprite.collide_rect(enemyTank, self):
 self.stay()

敵タンクタイプ():

# 敵戦車
classEnemyTank(BaseTank):
 def __init__(self, left, top, speed):super(EnemyTank, self).__init__(left, top)
 self.images ={'U': pygame.image.load('tank_img/enemy1U.gif'),'D': pygame.image.load('tank_img/enemy1D.gif'),'L': pygame.image.load('tank_img/enemy1L.gif'),'R': pygame.image.load('tank_img/enemy1R.gif')}

 self.direction = self.RandomDirection()
 self.image = self.images[self.direction]
 self.rect = self.image.get_rect()
 self.rect.left = left
 self.rect.top = top
 self.speed = speed
 self.step =60
 self.enemy_flag = False

 # タンク誕生のランダムな方向
 def RandomDirection(self):
 num = random.randint(1,4)if num ==1:return'U'
 elif num ==2:return'D'
 elif num ==3:return'L'else:return'R'
 
 # タンクはランダムに動きます
 def randomMove(self):if self.step <0:
 self.direction = self.RandomDirection()
 self.step =60else:
 self.move()
 self.step -=1
 
 # タンクシューティング
 def shot(self):
 num = random.randint(1,100)if num <4:returnBullet(self)
 
 # 敵の戦車が私たちの戦車と衝突した
 def enemyTank_hit_MyTank(self):for enemy in MainGame.EnemyTankList:if MainGame.my_tank and MainGame.my_tank.live:if pygame.sprite.collide_rect(MainGame.my_tank, enemy):
 self.stay()

箇条書き():

# 弾丸
classBullet(BaseItem):
 def __init__(self, tank):
 self.image = pygame.image.load('tank_img/tankmissile.gif')
 self.direction = tank.direction
 self.rect = self.image.get_rect()
 # タンクの方向に応じて、弾丸の位置を生成します
 if self.direction =='U':
 self.rect.left = tank.rect.left + tank.rect.width /2- self.rect.width /2
 self.rect.top = tank.rect.top - self.rect.height
 elif self.direction =='D':
 self.rect.left = tank.rect.left + tank.rect.width /2- self.rect.width /2
 self.rect.top = tank.rect.top + tank.rect.height
 elif self.direction =='L':
 self.rect.left = tank.rect.left - self.rect.width /2- self.rect.width /2
 self.rect.top = tank.rect.top + tank.rect.height /2- self.rect.width /2
 elif self.direction =='R':
 self.rect.left = tank.rect.left + tank.rect.width
 self.rect.top = tank.rect.top + tank.rect.height /2- self.rect.width /2

 # 弾丸の速度
 self.speed =6
 # 弾丸の状態
 self.live = True
 
 # 弾丸をロード
 def displayBullet(self):
 MainGame.window.blit(self.image, self.rect)
 
 # 弾丸の動き
 def move(self):if self.direction =='U':if self.rect.top   0:
 self.rect.top -= self.speed
 else:
 self.live = False
 elif self.direction =='R':if self.rect.left + self.rect.width < WINDOW_WIDTH:
 self.rect.left += self.speed
 else:
 self.live = False
 elif self.direction =='D':if self.rect.top + self.rect.height < WINDOW_HEIGHT:
 self.rect.top += self.speed
 else:
 self.live = False
 elif self.direction =='L':if self.rect.left   0:
 self.rect.left -= self.speed
 else:
 self.live = False
 
 # 私たちの弾丸が敵の戦車に当たった
 def myBullet_hit_enemy(self):for enemytank in MainGame.EnemyTankList:if pygame.sprite.collide_rect(enemytank, self):
 enemytank.live = False
 self.live = False

 # 分解されたオブジェクトを作成する
 explode =Explode(enemytank)
 MainGame.explodeList.append(explode)
 
 # 敵の戦車が私たちの戦車に当たる
 def enemyBullet_hit_myTank(self):if MainGame.my_tank and MainGame.my_tank.live:if pygame.sprite.collide_rect(MainGame.my_tank, self):
 MainGame.my_tank.live = False
 self.live = False

 # 分解されたオブジェクトを作成する
 explode =Explode(MainGame.my_tank)
 MainGame.explodeList.append(explode)
 
 # 射撃壁
 def wall_bullet(self):for wall in MainGame.wallList:if pygame.sprite.collide_rect(wall, self):
 wall.hg -=1
 self.live = False
 if wall.hg <=0:
 wall.live = False

壁の種類():

# ウォールクラス
classWall:
 def __init__(self, left, top):
 self.image = pygame.image.load('tank_img/steels.gif')
 self.rect = self.image.get_rect()
 self.rect.left = left
 self.rect.top = top
 self.live = True
 self.hg =100000000000000
 
 # 壁に負荷をかける
 def displayWall(self):if self.live:
 MainGame.window.blit(self.image, self.rect)

爆発クラス:

# 爆発性
classExplode:
 def __init__(self, tank):
 # 爆発の場所はタンクによって決定されます
 self.rect = tank.rect
 self.images =[
 pygame.image.load('tank_img/blast0.gif'),
 pygame.image.load('tank_img/blast1.gif'),
 pygame.image.load('tank_img/blast2.gif'),
 pygame.image.load('tank_img/blast3.gif'),
 pygame.image.load('tank_img/blast4.gif'),
 pygame.image.load('tank_img/blast5.gif'),
 pygame.image.load('tank_img/blast6.gif'),
 pygame.image.load('tank_img/blast7.gif')]
 self.step =0
 self.image = self.images[self.step]
 self.live = True
 
 # 負荷爆発クラス
 def displayExplode(self):if self.step <len(self.images):
 self.image = self.images[self.step]
 self.step +=1
 MainGame.window.blit(self.image, self.rect)else:
 self.live = False
 self.step =0

メインプロセス():

# ゲーム
classMainGame:
# クラス属性
window = None
my_tank = None
# 敵タンクの初期化
EnemyTankList =[]
EnemyTankCount =5
# 箇条書きを保存する
myBulleList =[]
# 敵の弾丸のリストを保存する
EnemyBulletList =[]
# 分解されたオブジェクトのリストを作成する
explodeList =[]
# ウォールリストを作成する
wallList =[]
# ゲームの開始方法
def start_game(self):
# ディスプレイモジュールを初期化します
pygame.display.init()
# ウィンドウを作成するメソッドを呼び出す
self.creat_window()
# ゲームウィンドウのタイトルを設定する
pygame.display.set_caption('タンクバトル')
# タンクを初期化します
self.createMyTank()
# 敵の戦車を初期化する
self.creatEnemyTank()
# 壁を初期化する
self.creatWall()
# プログラムは続く
while True:
# 背景色を変更する
MainGame.window.fill(COLOR_GREEN)
# バックグラウンドミュージック
# イベントを取得する
self.getEvent()
# 展示のために私たちのタンクに電話してください
if MainGame.my_tank and MainGame.my_tank.live:
MainGame.my_tank.displayTank()if not MainGame.my_tank.stop:
MainGame.my_tank.move()
MainGame.my_tank.hitWall()
MainGame.my_tank.myTank_hit_enemyTank()else:
del MainGame.my_tank
MainGame.my_tank = None
# 弾丸をロードする
self.biltMyBullet()
# 敵の戦車を表示する
self.biltEnemyTank()
# 敵の弾丸を表示する
self.biltEnemyBullet()
# ディスプレイウォール
self.blitWall()
# 爆発効果を表示
self.blitExplode()
self.put_more_enemytank()
# ウィンドウはリフレッシュし続けます
pygame.display.update()
time.sleep(0.02)
# 敵の戦車を繰り返し追加する
def put_more_enemytank(self):whilelen(MainGame.EnemyTankList)<5:
self.more()
# ゲームウィンドウの作成方法:
def creat_window(self):if not MainGame.window:
# ウィンドウを作成
MainGame.window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))return MainGame.window
# タンクを作成する
def createMyTank(self):
MainGame.my_tank =HeroTank((WINDOW_WIDTH - HeroTank.width)/2, WINDOW_HEIGHT - HeroTank.height)
music =Music('tank_img/start.wav')
music.play()
# 壁を作成する
def creatWall(self):for i inrange(60, WINDOW_WIDTH,60):
top = WINDOW_WIDTH // 3
left = i
wall =Wall(left, top)
MainGame.wallList.append(wall)
# ディスプレイウォール
def blitWall(self):for b in MainGame.wallList:if b.live:
b.displayWall()else:
MainGame.wallList.remove(b)
# 弾丸をロードする
def biltMyBullet(self):for bullet in MainGame.myBulleList:if bullet.live:
bullet.displayBullet()
bullet.move()
bullet.myBullet_hit_enemy()
bullet.wall_bullet()else:
MainGame.myBulleList.remove(bullet)
# 後続のタンクの追加
def more(self):
top =0for i inrange(5-len(MainGame.EnemyTankList)):
left = random.randint(0,750)
speed = random.randint(1,4)
enemy =EnemyTank(left, top, speed)
MainGame.EnemyTankList.append(enemy)
# 敵の戦車を作成する
def creatEnemyTank(self):
top =0for i inrange(MainGame.EnemyTankCount):
left = random.randint(0,750)
speed = random.randint(1,4)
enemy =EnemyTank(left, top, speed)
MainGame.EnemyTankList.append(enemy)
# ループして敵の戦車を表示する
def biltEnemyTank(self):for enemytank in MainGame.EnemyTankList:if enemytank.live:
enemytank.displayTank()
EnemyBullet = enemytank.shot()
enemytank.randomMove()
enemytank.hitWall()
enemytank.enemyTank_hit_MyTank()
# 敵の弾丸を保管する
if EnemyBullet:
MainGame.EnemyBulletList.append(EnemyBullet)else:
MainGame.EnemyTankList.remove(enemytank)
MainGame.EnemyTankCount -=1
# 敵の弾丸をロードする
def biltEnemyBullet(self):for bullet in MainGame.EnemyBulletList:if bullet.live:
bullet.displayBullet()
bullet.move()
bullet.enemyBullet_hit_myTank()
bullet.wall_bullet()else:
MainGame.EnemyBulletList.remove(bullet)
# 負荷爆発効果
def blitExplode(self):for explode in MainGame.explodeList:if explode.live:
explode.displayExplode()else:
MainGame.explodeList.remove(explode)
# ゲーム内のすべてのイベントを取得する
def getEvent(self):
# ゲーム内のイベントのリストを取得する
even_list = pygame.event.get()for e in even_list:
# ウィンドウの十字をクリックしてゲームを終了します
if e.type == pygame.QUIT:
sys.exit()
# 上、下、左、右のキーでタンクの動きを制御します
if e.type == pygame.KEYDOWN:if MainGame.my_tank and MainGame.my_tank.live:if e.key == pygame.K_DOWN or e.key == pygame.K_s:
MainGame.my_tank.direction ='D'
MainGame.my_tank.stop = False
print("下に移動するには、下ボタンを押します")
elif e.key == pygame.K_UP or e.key == pygame.K_w:
MainGame.my_tank.direction ='U'
MainGame.my_tank.stop = False
print("上に移動するには、上キーを押します")
elif e.key == pygame.K_LEFT or e.key == pygame.K_a:
MainGame.my_tank.direction ='L'
MainGame.my_tank.stop = False
print("左キーを押して左に移動します")
elif e.key == pygame.K_RIGHT or e.key == pygame.K_d:
MainGame.my_tank.direction ='R'
MainGame.my_tank.stop = False
print("右キーを押して右に移動します")
elif e.key == pygame.K_SPACE:print('弾丸を発射する')
# 弾丸を作成する
iflen(MainGame.myBulleList)<10:
mybullet =Bullet(MainGame.my_tank)
MainGame.myBulleList.append(mybullet)
# 射撃音
Shot_music =Music('tank_img/fire.wav')
Shot_music.play()
elif e.type == pygame.KEYUP:if e.key == pygame.K_UP or e.key == pygame.K_DOWN or e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT \
or e.key == pygame.K_w or e.key == pygame.K_s or e.key == pygame.K_a or e.key == pygame.K_d:if MainGame.my_tank and MainGame.my_tank.live:
MainGame.my_tank.stop = True

プログラムの実行結果:

ソースダウンロード:pythonは単純なタンクバトルを実現します

pythonゲームに関するよりエキサイティングな記事については、クリックして次のトピックを表示してください。

pythontetrisゲームコレクション

Pythonクラシックゲームの概要

PythonWeChatジャンプジャンプゲームコレクション

以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。

Recommended Posts

Pythonは単純なタンクバトルを実装します
Pythonは戦車戦を実現
Pythonは単純なtic-tac-toeゲームを実装しています
Pythonはシンプルな名刺管理システムを実装しています
Pythonはスーパーマリオを実装しています
Pythonはtic-tac-toeゲームを実装しています
Pythonはtic-tac-toeゲームを実装しています
Pythonはマンマシンゴバンを実装します
PythonはTetrisゲームを実装しています
Pythonは画像スティッチングを実装しています
Pythonはminesweeperゲームを実装しています
Pythonはスキャンツールを実装しています
Pythonはしきい値回帰を実装します
Pythonは地雷除去ゲームを実装しています
Pythonは電子辞書を実装しています
Pythonは推測ゲームを実装しています
Pythonでタンクバトルゲームを実現|ドライポスト
Pythonでタンクバトルゲームを実現|ドライポスト
Pythonはudpチャットウィンドウを実装します
PythonはWeChat飛行機ゲームを実装しています
Pythonは単語推測ゲームを実装しています
Pythonは推測ゲームを実装しています
Pythonは駐車場管理システムを実現
Pythonはデジタル爆弾ゲームを実装しています
PythonはTCPファイル転送を実装します
Pythonは単純なXMLデータを解析します
Pythonnumpyはローリングケースを実装します
OpenCVPythonはパズルゲームを実装しています
Pythonはパスワード強度検証を実装します
Pythonは車の管理システムを実装しています
Pythonはコードブロックフォールディングを実装します
Pythonはパノラマ画像スティッチングを実装しています
PythonはSMTPメール送信を実装します
Pythonは多次元配列ソートを実装しています
PythonがFTP機能を実装する方法
Pythonは平均シフトクラスタリングアルゴリズムを実装しています
Pythonは検証コード認識を実装します
Pythonは勾配降下法を実装しています
Pythonはテキストバージョンのminesweeperを実装しています
Pythonは画像スティッチング機能を実装しています
Pythonは実店舗のゲームを実装しています
Pythonは学生のパフォーマンス評価システムを実装しています
Pythonがメール機能を実装する方法
Pythonは単にスネークゲームを実装します
Python3はシングルトンデザインパターンを実装しています
Pythonは為替レート変換操作を実装します
Pythonは文字列と数値のスプライシングを実装します
Pythonは10の古典的なソートアルゴリズムを実装しています
PythonはユニバーサルWebフレームワークを実装しています
Pythonは、メールを送信するために126のメールボックスを実装しています
PythonはAIフェイスチェンジ機能を実装しています
Pythonは最も急な降下方法を実装します
Pythonは実際の銀行システムを実装しています
Pythonはデジタル爆弾ゲームプログラムを実装しています
python定義クラスの簡単な使用法
Pythonデコレータの簡単な使用例の概要
Pythonはftpファイル転送機能を実装しています
Pythonはユーザー名とパスワードの検証を実装しています
Pythonがタイマー機能を実装する方法
Pythonは航空機戦争プロジェクトを実装します
Pythonは写真の水平ステッチを実装しています