2017-07-26 4 views
1

ここに私のコードです。私が望むのは、マップに1がある場合は、そこにWallを作成することです。しかし、私がプログラムを実行すると、それはWall(col, row). NameError: name 'col' is not defined.と言いますこれをどのように修正できますか?私は多くの答えを探しましたが、本当に解決した人はいません。 colrowを使用して、特定のXとYにWallを追加する場所をコンピュータにどのように伝えることができますか?どんな助けもありがとうございます。Pygameでmap.txtファイルをマップとしてインポートするには?

import pygame as pg 
import sys 
import os 

WIDTH = 800 
HEIGHT = 600 
TITLE = 'Importing A Map' 
CLOCK = pg.time.Clock() 
FPS = 60 

DARKGRAY = (40, 40, 40) 
RED = (255, 0, 0) 

game_folder = os.path.dirname(__file__) 

# create tiles, (WIDTH = 20 tiles, HEIGHT = 15 tiles) 
TILESIZE = 40 
GRIDWIDTH = WIDTH/TILESIZE 
GRIDHEIGHT = HEIGHT/TILESIZE 

screen = pg.display.set_mode((WIDTH, HEIGHT)) 
pg.display.set_caption(TITLE) 

def load_map(): 
    map_data = [] 
    with open(path.join(game_folder, 'map.txt'), 'rt') as f: 
     for line in f: 
      map_data.append(line) 

def new_game(): 
    for row, tiles in enumerate(map_data): 
     for col, tile in enumerate(tiles): 
      # Here is the part where I have problems. 
      if tile == '1': 
       Wall(col, row) 

def draw_tiles(): 
    for x in range(0, WIDTH, TILESIZE): 
     pg.draw.line(screen, DARKGRAY, (x, 0), (x, HEIGHT)) 
    for y in range(0, HEIGHT, TILESIZE): 
     pg.draw.line(screen, DARKGRAY, (0, y), (WIDTH, y)) 

class Wall(pg.sprite.Sprite): 
    def __init__(self, x, y): 
     pg.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.image = pg.Surface((TILESIZE, TILESIZE)) 
     self.image.fill(RED) 
     self.rect = self.image.get_rect() 
     self.rect.x = x * TILESIZE 
     self.rect.y = y * TILESIZE 

wall = Wall(col, row) 

def game_loop(): 
    pg.init() 

    all_sprites = pg.sprite.Group() 
    all_sprites.add(wall) 

    running = True 
    while running: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       running = False 

     draw_tiles() 
     all_sprites.update() 
     all_sprites.draw(screen) 

     pg.display.update() 
     CLOCK.tick(FPS) 

    pg.quit() 

game_loop() 
+1

パーサーは正しくあります:変数 'col'と' row'の値を​​使用しようとしていますが、どちらもまだ値を持っていません。私はあなたのコードの構造に疑問を抱いています:クラス定義と 'game_loop'関数の間にメインプログラムのステートメントが単独で存在するのはなぜですか? – Prune

+1

ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 特に、ゲームグリッドの構築に使用しようとしているコードを*のみ*与えてください。サンプル入力を、特にハードコーディングされた座標リストとして含めるようにしてください。 – Prune

+1

あなたのコードには2つの 'Wall(col、row)'呼び出しがあります。どの原因でエラーが発生していますか? 'map.txt'ファイルのデータのフォーマットは?これらはあなたを助けるために人々が知る必要があるものです。そうでなければ彼らは推測する必要があります。 – martineau

答えて

1

colおよびrowは、forループを含むローカル変数です(変数はforループ内にのみ存在します)。

私は次のコードがあなたの望む通りに動作することを約束することはできませんが、どこに間違ったのかが分かります。

文書の上部にwallの "変数宣言"を作成し、壁変数の代入を両方のfor-loopsの内側に移動し、グローバル変数にして他の関数からアクセスできるようにする方法に注目してください。

これがうまくいかない場合/別の関連する問題がある場合はお知らせください。私は手を貸すために最善を尽くします。

import pygame as pg 
import sys 
import os 

wall = 0 

WIDTH = 800 
HEIGHT = 600 
TITLE = 'Importing A Map' 
CLOCK = pg.time.Clock() 
FPS = 60 

DARKGRAY = (40, 40, 40) 
RED = (255, 0, 0) 

game_folder = os.path.dirname(__file__) 

# create tiles, (WIDTH = 20 tiles, HEIGHT = 15 tiles) 
TILESIZE = 40 
GRIDWIDTH = WIDTH/TILESIZE 
GRIDHEIGHT = HEIGHT/TILESIZE 

screen = pg.display.set_mode((WIDTH, HEIGHT)) 
pg.display.set_caption(TITLE) 

def load_map(): 
    map_data = [] 
    with open(path.join(game_folder, 'map.txt'), 'rt') as f: 
     for line in f: 
      map_data.append(line) 

def new_game(): 
    global wall 
    for row, tiles in enumerate(map_data): 
     for col, tile in enumerate(tiles): 
      if tile == '1': 
       Wall(col, row) 

      wall = Wall(col, row) 

def draw_tiles(): 
    for x in range(0, WIDTH, TILESIZE): 
     pg.draw.line(screen, DARKGRAY, (x, 0), (x, HEIGHT)) 
    for y in range(0, HEIGHT, TILESIZE): 
     pg.draw.line(screen, DARKGRAY, (0, y), (WIDTH, y)) 

class Wall(pg.sprite.Sprite): 
    def __init__(self, x, y): 
     pg.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.image = pg.Surface((TILESIZE, TILESIZE)) 
     self.image.fill(RED) 
     self.rect = self.image.get_rect() 
     self.rect.x = x * TILESIZE 
     self.rect.y = y * TILESIZE 


def game_loop(): 
    pg.init() 

    all_sprites = pg.sprite.Group() 
    all_sprites.add(wall) 

    running = True 
    while running: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       running = False 

     draw_tiles() 
     all_sprites.update() 
     all_sprites.draw(screen) 

     pg.display.update() 
     CLOCK.tick(FPS) 

    pg.quit() 

game_loop() 
関連する問題