fully implemented random map generation

This commit is contained in:
s452645 2021-03-12 21:25:33 +01:00
parent 8a14461983
commit 54d9133751
4 changed files with 524 additions and 26 deletions

12
main.py
View File

@ -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()

View File

@ -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}"]
self.matrix[x][y].mine = mine
# 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].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)

View File

@ -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 === #

View 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"
}