Search code examples
python2dreplit

How do you prevent "unhashable type 'list'"?


So, I was making a simple 2D game in pygame, and was making the map (following a tutorial video, don't judge me, I'm new to pygame) and using replit.com, and that error showed up in the console.

here's my code for it:

import pygame, sys
W = 0
S = 1
G = 2
F = 3

BLUE = (0,0,255)
SAND = (194,176,128)
GRASS = (124,252,0)
FOREST = (0,100,0)

TileColor = {W : BLUE,
            S : SAND,
            G : GRASS,
            F : FOREST
            }

map1 = {(W, S, G, F, F, F, G, S, W, W, W, W),
       [W, S, S, G, G, G, G, F, F, W, W, W],
       [W, S, G, G, G, F, F, F, F, F, W, W],
       [W, S, S, G, G, G, G, G, F, F, F, W]
       }

TILESIZE = 40
MAPWIDTH = 12
MAPHEIGHT = 4

pygame.init()
DISPLAY = pygame.display.set_mode((MAPWIDTH * TILESIZE,MAPHEIGHT * TILESIZE))

while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()

  for row in range(MAPHEIGHT):
    for col in range(MAPWIDTH):
      pygame.draw.rect(DISPLAY,TileColor[map1[row][col]],(col * TILESIZE,row * TILESIZE,TILESIZE,TILESIZE))
  
  pygame.display.update

if anyone has any suggestions for changing my code, please say, and I am sticking with replit.com


Solution

  • You're pretty much correct already. I'm just guessing at how your code is supposed to work, but using a python dictionary for the tile colours with integer-variables as keys is what's causing the issue.

    If you change your tile keys to a letter:

    TileColor = { 'W' : BLUE,
                  'S' : SAND,
                  'G' : GRASS,
                  'F' : FOREST }
    

    And then in your map, use letters too:

    map1 = [ "WSGFFFGSWWWW",
             "WSSGGGGFFWWW",
             "WSGGGFFFFFWW",
             "WSSGGGGGFFFW" ]
    

    It works pretty much perfectly:

    screen shot

    Full code:

    import pygame, sys
    
    BLUE = (0,0,255)
    SAND = (194,176,128)
    GRASS = (124,252,0)
    FOREST = (0,100,0)
    
    TileColor = {'W' : BLUE,
                 'S' : SAND,
                 'G' : GRASS,
                 'F' : FOREST }
    
    map1 = [ "WSGFFFGSWWWW",
             "WSSGGGGFFWWW",
             "WSGGGFFFFFWW",
             "WSSGGGGGFFFW" ]
    
    TILESIZE = 40
    MAPWIDTH = 12
    MAPHEIGHT = 4
    
    pygame.init()
    DISPLAY = pygame.display.set_mode((MAPWIDTH * TILESIZE,MAPHEIGHT * TILESIZE))
    
    while True:
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          pygame.quit()
          sys.exit()
    
      for row in range(MAPHEIGHT):
        for col in range(MAPWIDTH):
          pygame.draw.rect(DISPLAY,TileColor[map1[row][col]],(col * TILESIZE,row * TILESIZE,TILESIZE,TILESIZE))
      
      pygame.display.update()