fully implemented random map generation
This commit is contained in:
parent
8a14461983
commit
54d9133751
12
main.py
12
main.py
@ -6,6 +6,7 @@ from pyglet.gl import * # for blocky textures
|
|||||||
import project_constants
|
import project_constants
|
||||||
import event_interpreter
|
import event_interpreter
|
||||||
import minefield as mf
|
import minefield as mf
|
||||||
|
import json_generator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -19,11 +20,8 @@ def main():
|
|||||||
glEnable(GL_TEXTURE_2D)
|
glEnable(GL_TEXTURE_2D)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
|
||||||
|
|
||||||
|
|
||||||
# loading minefields
|
|
||||||
# create an instance of Minefield, pass necessary data
|
# create an instance of Minefield, pass necessary data
|
||||||
minefield = mf.Minefield()
|
minefield = mf.Minefield(project_constants.MAP_RANDOM_10x10)
|
||||||
|
|
||||||
|
|
||||||
running = True
|
running = True
|
||||||
while running:
|
while running:
|
||||||
@ -44,11 +42,7 @@ def main():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# tiles
|
# draw tiles and mines
|
||||||
# TODO : call to tile blitting function goes here
|
|
||||||
|
|
||||||
# mines
|
|
||||||
# TODO : call to a mine blitting function goes here
|
|
||||||
minefield.draw(project_constants.SCREEN)
|
minefield.draw(project_constants.SCREEN)
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
|
|
||||||
|
78
minefield.py
78
minefield.py
@ -1,39 +1,85 @@
|
|||||||
import pygame
|
import pygame
|
||||||
|
import json
|
||||||
import project_constants as consts
|
import project_constants as consts
|
||||||
import tile as tl
|
import tile as tl
|
||||||
import mine as mn
|
import mine as mn
|
||||||
|
|
||||||
|
tile_asset_options = {
|
||||||
|
"BLUE": consts.ASSET_TILE_BLUE,
|
||||||
|
"GREEN": consts.ASSET_TILE_GREEN,
|
||||||
|
"ORANGE": consts.ASSET_TILE_ORANGE,
|
||||||
|
"PURPLE": consts.ASSET_TILE_PURPLE,
|
||||||
|
"RED": consts.ASSET_TILE_RED,
|
||||||
|
"WHITE": consts.ASSET_TILE_WHITE,
|
||||||
|
"YELLOW": consts.ASSET_TILE_YELLOW
|
||||||
|
}
|
||||||
|
|
||||||
|
mine_asset_options = {
|
||||||
|
'A': consts.ASSET_MINE_A,
|
||||||
|
'B': consts.ASSET_MINE_B,
|
||||||
|
'F': consts.ASSET_MINE_F,
|
||||||
|
'K': consts.ASSET_MINE_K
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_screen_position(x, y):
|
||||||
|
coords = (
|
||||||
|
consts.V_SCREEN_PADDING + consts.V_TILE_SIZE * x,
|
||||||
|
consts.V_SCREEN_PADDING + consts.V_TILE_SIZE * y,
|
||||||
|
)
|
||||||
|
|
||||||
|
return coords
|
||||||
|
|
||||||
|
|
||||||
class Minefield:
|
class Minefield:
|
||||||
def __init__(self, minefield_data=None):
|
def __init__(self, json_path):
|
||||||
|
|
||||||
# create matrix of a desired size, fill it with empty tile objects
|
# open JSON with minefield info
|
||||||
self.matrix = [[tl.Tile((i, j)) for i in range(consts.V_GRID_VER_TILES)] for j in range(consts.V_GRID_HOR_TILES)]
|
with open(json_path) as json_data:
|
||||||
|
data = json.load(json_data)
|
||||||
|
|
||||||
# serialize JSON, create matrix
|
# create matrix of a desired size, fill it with default tile objects
|
||||||
|
self.matrix = [
|
||||||
|
[
|
||||||
|
tl.Tile((i, j)) for i in range(consts.V_GRID_VER_TILES)
|
||||||
|
] for j in range(consts.V_GRID_HOR_TILES)
|
||||||
|
]
|
||||||
|
|
||||||
# iterate through matrix fields
|
# iterate through tiles, set their colors and add mines
|
||||||
for x in range(consts.V_GRID_HOR_TILES):
|
for x in range(consts.V_GRID_HOR_TILES):
|
||||||
for y in range(consts.V_GRID_VER_TILES):
|
for y in range(consts.V_GRID_VER_TILES):
|
||||||
# if there should be a mine, create one
|
|
||||||
mine = mn.Mine((x, y), 'f')
|
|
||||||
|
|
||||||
# change tile properties
|
# load tile's data from json
|
||||||
self.matrix[x][y].update_color("green")
|
tile_data = data[f"{x},{y}"]
|
||||||
|
|
||||||
|
# create and add mine if there is one
|
||||||
|
if tile_data["mine"] is not None:
|
||||||
|
mine_type = tile_data["mine"]["mine_type"].upper()
|
||||||
|
mine = mn.Mine((x, y), mine_type)
|
||||||
self.matrix[x][y].mine = mine
|
self.matrix[x][y].mine = mine
|
||||||
|
|
||||||
|
self.matrix[x][y].color = tile_data["color"].upper()
|
||||||
|
|
||||||
|
# probably a temporary solution
|
||||||
|
# (depends on sapper's movement implementation)
|
||||||
|
sapper_x, sapper_y = data['agent_starting_position'].split(",")
|
||||||
|
self.sapper_position = (int(sapper_x), int(sapper_y))
|
||||||
|
|
||||||
def draw(self, window):
|
def draw(self, window):
|
||||||
# iterate through tiles
|
# iterate through tiles
|
||||||
for column in self.matrix:
|
for column in self.matrix:
|
||||||
for tile in column:
|
for tile in column:
|
||||||
pixel_coords = (
|
|
||||||
consts.V_SCREEN_PADDING + consts.V_TILE_SIZE * tile.position[0], # x
|
|
||||||
consts.V_SCREEN_PADDING + consts.V_TILE_SIZE * tile.position[1] # y
|
|
||||||
)
|
|
||||||
|
|
||||||
window.blit(tile.asset, pixel_coords)
|
# calculate tile position on the screen
|
||||||
|
tile_screen_coords = calculate_screen_position(tile.position[0], tile.position[1])
|
||||||
|
|
||||||
|
# draw a tile
|
||||||
|
window.blit(tile_asset_options.get(tile.color), tile_screen_coords)
|
||||||
|
|
||||||
|
# draw a mine on top if there is one
|
||||||
if tile.mine is not None:
|
if tile.mine is not None:
|
||||||
window.blit(tile.mine.asset, pixel_coords)
|
window.blit(mine_asset_options.get(tile.mine.mine_type), tile_screen_coords)
|
||||||
|
|
||||||
|
|
||||||
|
# draw the sapper
|
||||||
|
sapper_screen_coords = calculate_screen_position(self.sapper_position[0], self.sapper_position[1])
|
||||||
|
window.blit(consts.ASSET_SAPPER, sapper_screen_coords)
|
@ -6,6 +6,7 @@ import os
|
|||||||
# V a value like a string or an int
|
# V a value like a string or an int
|
||||||
# STRUCT a list or other structure of values
|
# STRUCT a list or other structure of values
|
||||||
# ASSET a png file (or other graphic format)
|
# ASSET a png file (or other graphic format)
|
||||||
|
# MAP a JSON map file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -38,6 +39,12 @@ SCREEN = pygame.display.set_mode\
|
|||||||
STRUCT_TILE_COLORS = ["blue", "green", "orange", "purple", "red", "white", "yellow"]
|
STRUCT_TILE_COLORS = ["blue", "green", "orange", "purple", "red", "white", "yellow"]
|
||||||
STRUCT_MINE_TYPES = ['a', 'b', 'f', 'k']
|
STRUCT_MINE_TYPES = ['a', 'b', 'f', 'k']
|
||||||
|
|
||||||
|
# ============== #
|
||||||
|
# ==== MAPS ==== #
|
||||||
|
# ============== #
|
||||||
|
MAP_RANDOM_10x10 = os.path.join("resources", "minefields", "firstmap.json")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ============== #
|
# ============== #
|
||||||
# === ASSETS === #
|
# === ASSETS === #
|
||||||
|
451
resources/minefields/firstmap.json
Normal file
451
resources/minefields/firstmap.json
Normal file
@ -0,0 +1,451 @@
|
|||||||
|
{
|
||||||
|
"0,0": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,1": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,2": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,3": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,4": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,5": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,6": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0,7": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,8": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"0,9": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"1,0": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"1,1": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"1,2": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"1,3": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"1,4": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"1,5": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"1,6": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"1,7": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"1,8": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"1,9": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,0": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,1": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,2": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,3": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,4": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,5": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2,6": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,7": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2,8": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"2,9": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,0": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,1": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3,2": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,3": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,4": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,5": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,6": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3,7": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,8": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"3,9": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,0": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,1": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,2": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,3": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,4": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,5": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4,6": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,7": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4,8": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"4,9": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,0": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,1": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,2": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5,3": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,4": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5,5": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5,6": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,7": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,8": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"5,9": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,0": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,1": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,2": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6,3": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,4": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,5": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,6": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,7": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,8": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"6,9": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"7,0": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"7,1": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7,2": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7,3": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7,4": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"7,5": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"7,6": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7,7": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"7,8": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"7,9": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8,0": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,1": {
|
||||||
|
"color": "yellow",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,2": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,3": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,4": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,5": {
|
||||||
|
"color": "red",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,6": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,7": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,8": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"8,9": {
|
||||||
|
"color": "purple",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"9,0": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"9,1": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"9,2": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"9,3": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"9,4": {
|
||||||
|
"color": "green",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9,5": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"9,6": {
|
||||||
|
"color": "white",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9,7": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9,8": {
|
||||||
|
"color": "blue",
|
||||||
|
"mine": {
|
||||||
|
"mine_type": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9,9": {
|
||||||
|
"color": "orange",
|
||||||
|
"mine": null
|
||||||
|
},
|
||||||
|
"agent_starting_position": "0,0"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user