orb.png
player1.png
player2.png
grass.png および water.png の入手先
前提・実現したいこと
現在、pythonでpygameモジュールを用いてミニゲームを作成しているのですが、
ある状況下でプログラムが応答しなくなってしまいます。
この原因の究明が出来なかったので、分かる方に原因と解決策をご教示いただきたいです。
発生している問題・エラーメッセージ
以下のソースコードを実行し、スペースキー押下でゲーム開始→プレイヤーを衝突させてゲームが終了→タイトル画面に戻る→手順の初めに戻る、という手順を2ゲーム目まで行い、3ゲーム目開始時のスペースキー押下でプログラムが応答しなくなってしまいます。
該当のソースコード
python
1import pygame 2from pygame.locals import * 3import random 4import copy 5import sys 6import os 7 8SCREEN_WIDTH_SIZE = 608 9SCREEN_HEIGHT_SIZE = 480 10 11MSIZE = 32 # 1マスの大きさ 12 13LEFT, DOWN, RIGHT, UP = 3, 2, 1, 0 14 15TITLE, GAME, RESULT = 4, 5, 6 16 17class Game_Title: # タイトル画面の処理 18 def __init__(self): 19 self.titlefont = pygame.font.SysFont(None, 50) 20 self.startfont = pygame.font.SysFont(None, 30) 21 self.title_x, self.title_y = 202, 160 22 self.start_x, self.start_y = 204, 400 23 self.start_flame = 0 24 self.start_flag = False 25 self.finish = False 26 27 def update(self): 28 if self.start_flag: 29 self.start_flame += 1 30 if self.start_flame == 9000: # スペースキー押下後、ある程度テキスト点滅したらタイトル画面は終了 31 self.finish = True 32 33 def draw(self, screen): 34 title = self.titlefont.render("Orb Fighters", True, (255, 255, 255)) 35 start = self.startfont.render("Press Space to start", True, (255, 255, 255)) 36 screen.blit(title, (self.title_x, self.title_y)) 37 if self.start_flag: 38 if self.start_flame % 2000 < 1000: # スペースキーが押されたら押されたことをテキストの点滅で知らせる 39 screen.blit(start, (self.start_x, self.start_y)) 40 else: 41 screen.blit(start, (self.start_x, self.start_y)) 42 43 44class Player(pygame.sprite.Sprite): # プレイヤークラス 45 animcycle = 20 # アニメーション速度 46 frame = 0 # アニメーションのフレーム 47 target_x, target_y = -1, -1 # 移動時の移動先マスのx, y座標 48 move_flag = False # グリッド間の移動判定用フラグ 49 has_orbs = 0 # オーブ所持数 50 result = "" # 勝者か敗者か 51 52 def __init__(self, filename, pos_x, pos_y, direction, player): # プレイヤーオブジェクトの初期化処理 53 pygame.sprite.Sprite.__init__(self, self.containers) 54 self.direction = direction 55 self.pos_x, self.pos_y = pos_x, pos_y 56 self.target_x, self.target_y = pos_x * MSIZE, pos_y * MSIZE 57 self.images = split_chara_image(load_image(filename)) 58 self.image = self.images[self.direction][1] 59 self.rect = self.image.get_rect(topleft=(pos_x*MSIZE, pos_y*MSIZE)) 60 self.other_player = player 61 62 def update(self, map): 63 # キャラクターアニメーションおよびオーブ獲得数の更新 64 self.frame += 1 65 self.image = self.images[self.direction][int(self.frame / self.animcycle) % 3] # 20フレーム毎に足踏み 66 if self.move_flag: 67 if self.rect.x < self.target_x: 68 self.rect.x += 1 69 if self.rect.y > self.target_y: 70 self.rect.y -= 1 71 if self.rect.x > self.target_x: 72 self.rect.x -= 1 73 if self.rect.y < self.target_y: 74 self.rect.y += 1 75 if self.rect.x == self.target_x and self.rect.y == self.target_y: 76 self.move_flag = False 77 self.pos_x, self.pos_y = int(self.rect.x / MSIZE), int(self.rect.y / MSIZE) 78 self.get_orb(map) 79 80 def draw(self, screen): # キャラの描写 81 screen.blit(self.image, self.rect) 82 83 def move(self, dir, map): # キャラのグリッド移動 84 85 if self.rect.x == self.target_x and self.rect.y == self.target_y: 86 if dir == LEFT: 87 self.direction = LEFT 88 if map.map[self.pos_y][self.pos_x - 1] == 0: 89 self.move_flag = True 90 self.target_x -= MSIZE 91 if dir == DOWN: 92 self.direction = DOWN 93 if map.map[self.pos_y + 1][self.pos_x] == 0: 94 self.move_flag = True 95 self.target_y += MSIZE 96 if dir == RIGHT: 97 self.direction = RIGHT 98 if map.map[self.pos_y][self.pos_x + 1] == 0: 99 self.move_flag = True 100 self.target_x += MSIZE 101 if dir == UP: 102 self.direction = UP 103 if map.map[self.pos_y - 1][self.pos_x] == 0: 104 self.move_flag = True 105 self.target_y -= MSIZE 106 if self.collision_player(): 107 self.game_set() 108 109 def get_orb(self, map): # 移動してきたマスにオーブがあれば獲得 110 if not self.move_flag: 111 if map.orb_map[self.pos_y][self.pos_x] == 0: 112 map.orb_map[self.pos_y][self.pos_x] = 1 113 self.has_orbs += 1 114 115 def collision_player(self): # プレイヤー同士の衝突判定 116 if self.other_player is None: 117 pass 118 else: 119 if self.direction == LEFT: 120 if self.pos_y == self.other_player.pos_y and self.pos_x - 1 == self.other_player.pos_x: 121 return True 122 else: 123 return False 124 if self.direction == DOWN: 125 if self.pos_y + 1 == self.other_player.pos_y and self.pos_x == self.other_player.pos_x: 126 return True 127 else: 128 return False 129 if self.direction == RIGHT: 130 if self.pos_y == self.other_player.pos_y and self.pos_x + 1 == self.other_player.pos_x: 131 return True 132 else: 133 return False 134 if self.direction == UP: 135 if self.pos_y - 1 == self.other_player.pos_y and self.pos_x == self.other_player.pos_x: 136 return True 137 else: 138 return False 139 140 def game_set(self): # ゲームの勝敗がついたとき 141 if self.has_orbs > self.other_player.has_orbs: 142 self.result += "WINNER" 143 self.other_player.result += "LOSER" 144 elif self.has_orbs < self.other_player.has_orbs: 145 self.result += "LOSER" 146 self.other_player.result += "WINNER" 147 else: 148 self.result += "DRAW" 149 self.other_player.result += "DRAW" 150 151 152class Text_Orbs: # プレイヤーのオーブ所持数のテキスト 153 def __init__(self, player, map): 154 self.sysfont = pygame.font.SysFont(None, 25) 155 self.player = player 156 if player.pos_x == 1 and player.pos_y == 1: 157 self.x, self.y = (player.pos_x - 1) * MSIZE, (player.pos_y - 1) * MSIZE 158 elif player.pos_x == map.col - 2 and player.pos_y == map.row - 2: 159 self.x, self.y = (map.col - 5) * MSIZE, (map.row - 1) * MSIZE 160 161 def draw(self, screen): 162 text = self.sysfont.render("You got " + str(self.player.has_orbs) + " orbs.", True, (255,140,0)) 163 screen.blit(text, (self.x, self.y)) 164 165 166 167 168# 以下掲載しきれないので追記します
試したこと
生成していたオブジェクトをdel文で削除し、ガベージコレクトで解放したメモリの回収を行ってみましたが、相変わらず問題は改善しませんでした。
補足情報(FW/ツールのバージョンなど)
python 3.2
pygame 1.9.2pre
回答2件
あなたの回答
tips
プレビュー