Renamed mine to tile, since mine did not make sense as the name. Also rewrote the field initialization function to not theoretically go on forever

This commit is contained in:
nc5432 2025-05-13 14:49:17 -04:00
parent 807b3d8de5
commit 5bc56ee648
4 changed files with 37 additions and 38 deletions

View File

@ -1,16 +1,16 @@
[gd_scene load_steps=4 format=3 uid="uid://b03smhbrrkgmw"] [gd_scene load_steps=4 format=3 uid="uid://b03smhbrrkgmw"]
[ext_resource type="Script" uid="uid://3wkgv7brl1l2" path="res://scripts/Mine.gd" id="1_rrkvo"] [ext_resource type="Script" uid="uid://3wkgv7brl1l2" path="res://scripts/Tile.gd" id="1_vhibn"]
[ext_resource type="Texture2D" uid="uid://b26tmpl7dhsls" path="res://sprites/cover.png" id="3_ke0lc"] [ext_resource type="Texture2D" uid="uid://b26tmpl7dhsls" path="res://sprites/cover.png" id="2_r3gf4"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_xpffi"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_xpffi"]
size = Vector2(16, 16) size = Vector2(16, 16)
[node name="Mine" type="Node2D"] [node name="Tile" type="Node2D"]
script = ExtResource("1_rrkvo") script = ExtResource("1_vhibn")
[node name="layer1" type="Sprite2D" parent="."] [node name="layer1" type="Sprite2D" parent="."]
texture = ExtResource("3_ke0lc") texture = ExtResource("2_r3gf4")
[node name="layer2" type="Sprite2D" parent="."] [node name="layer2" type="Sprite2D" parent="."]

View File

@ -2,14 +2,14 @@ class_name Minefield extends Node2D
static var instance: Minefield static var instance: Minefield
@onready var minePrefab: PackedScene = preload("res://scenes/Mine.tscn") @onready var tilePrefab: PackedScene = preload("res://scenes/Tile.tscn")
@onready var cam: Camera2D = $Camera2D @onready var cam: Camera2D = $Camera2D
@export var width: int = 10 @export var width: int = 10
@export var height: int = 10 @export var height: int = 10
@export var mineCount: int = 10 @export var mineCount: int = 10
var mines: Array[Mine] var tiles: Array[Tile]
var spriteWidth: int = 16 var spriteWidth: int = 16
var fieldInitialized: bool = false var fieldInitialized: bool = false
@ -21,28 +21,27 @@ func _ready() -> void:
var scale: float = 1 var scale: float = 1
for x: int in range(width): for x: int in range(width):
for y: int in range(height): for y: int in range(height):
var mine: Mine = minePrefab.instantiate() var tile: Tile = tilePrefab.instantiate()
mine.coord = Vector2i(x, y) tile.coord = Vector2i(x, y)
mine.position = Vector2(spriteWidth * x - (spriteWidth * (width / 2)) + (spriteWidth / 2), tile.position = Vector2(spriteWidth * x - (spriteWidth * (width / 2)) + (spriteWidth / 2),
spriteWidth * y - (spriteWidth * (height / 2)) + (spriteWidth / 2)) spriteWidth * y - (spriteWidth * (height / 2)) + (spriteWidth / 2))
add_child(mine) add_child(tile)
mines.append(mine) tiles.append(tile)
func initField(coord: Vector2i) -> void: func initField(coord: Vector2i) -> void:
var picked: Array[Vector2i] fieldInitialized = true
var pickPool: Array[Tile] = tiles.duplicate()
for i: int in range(mineCount): for i: int in range(mineCount):
var pick: Vector2i var pick: Tile = pickPool.pick_random()
while (true): while (true):
pick = Vector2i(randi_range(0, width - 1), randi_range(0, height - 1)) pickPool.erase(pick)
if abs(coord - pick) <= Vector2i(1, 1) || pick in picked: if (abs(coord - pick.coord) >= Vector2i(1, 1)):
continue pick.type = Tile.TileTypes.MINE
break break
print("Picked " + str(pick)) pick = pickPool.pick_random()
picked.append(pick) for tile: Tile in tiles:
getMine(pick).type = Mine.MineType.MINE tile.evaluateType()
for mine: Mine in mines:
mine.evaluateType()
func getMine(coord: Vector2i) -> Mine: func getTile(coord: Vector2i) -> Tile:
if (coord.x < 0 || coord.y < 0 || coord.x >= width || coord.y >= width): return null if (coord.x < 0 || coord.y < 0 || coord.x >= width || coord.y >= width): return null
return mines[(coord.x * height) + coord.y] return tiles[(coord.x * height) + coord.y]

View File

@ -1,4 +1,4 @@
class_name Mine extends Node2D class_name Tile extends Node2D
@onready var backplate: CompressedTexture2D = preload("res://sprites/backplate.png") @onready var backplate: CompressedTexture2D = preload("res://sprites/backplate.png")
@onready var cover: CompressedTexture2D = preload("res://sprites/cover.png") @onready var cover: CompressedTexture2D = preload("res://sprites/cover.png")
@ -15,7 +15,7 @@ class_name Mine extends Node2D
preload("res://sprites/8.png") preload("res://sprites/8.png")
] ]
enum MineType{ enum TileTypes{
EMPTY, EMPTY,
ONE, ONE,
TWO, TWO,
@ -31,35 +31,35 @@ enum MineType{
@onready var layer1: Sprite2D = $layer1 @onready var layer1: Sprite2D = $layer1
@onready var layer2: Sprite2D = $layer2 @onready var layer2: Sprite2D = $layer2
var type: MineType var type: TileTypes
var coord: Vector2i var coord: Vector2i
var revealed: bool = false var revealed: bool = false
func evaluateType() -> void: func evaluateType() -> void:
if (type == MineType.MINE): return if (type == TileTypes.MINE): return
var count: int = 0 var count: int = 0
for x: int in range(-1, 2): for x: int in range(-1, 2):
for y: int in range(-1, 2): for y: int in range(-1, 2):
if (x == 0 && y == 0): continue if (x == 0 && y == 0): continue
var mine: Mine = Minefield.instance.getMine(coord + Vector2i(x, y)) var tile: Tile = Minefield.instance.getTile(coord + Vector2i(x, y))
if (mine == null): continue if (tile == null): continue
if (mine.type == MineType.MINE): count += 1 if (tile.type == TileTypes.MINE): count += 1
type = count as MineType type = count as TileTypes
func reveal() -> void: func reveal() -> void:
if (revealed): return if (revealed): return
revealed = true revealed = true
layer1.texture = backplate layer1.texture = backplate
match type: match type:
MineType.EMPTY: TileTypes.EMPTY:
layer2.texture = null layer2.texture = null
for x: int in range(-1, 2): for x: int in range(-1, 2):
for y: int in range(-1, 2): for y: int in range(-1, 2):
if (x == 0 && y == 0): continue if (x == 0 && y == 0): continue
var mine: Mine = Minefield.instance.getMine(coord + Vector2i(x, y)) var tile: Tile = Minefield.instance.getTile(coord + Vector2i(x, y))
if (mine == null): continue if (tile == null): continue
mine.reveal() tile.reveal()
MineType.MINE: TileTypes.MINE:
layer2.texture = mine layer2.texture = mine
_: _:
layer2.texture = nums[type as int - 1] layer2.texture = nums[type as int - 1]