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"]
[ext_resource type="Script" uid="uid://3wkgv7brl1l2" path="res://scripts/Mine.gd" id="1_rrkvo"]
[ext_resource type="Texture2D" uid="uid://b26tmpl7dhsls" path="res://sprites/cover.png" id="3_ke0lc"]
[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="2_r3gf4"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_xpffi"]
size = Vector2(16, 16)
[node name="Mine" type="Node2D"]
script = ExtResource("1_rrkvo")
[node name="Tile" type="Node2D"]
script = ExtResource("1_vhibn")
[node name="layer1" type="Sprite2D" parent="."]
texture = ExtResource("3_ke0lc")
texture = ExtResource("2_r3gf4")
[node name="layer2" type="Sprite2D" parent="."]

View File

@ -2,14 +2,14 @@ class_name Minefield extends Node2D
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
@export var width: int = 10
@export var height: int = 10
@export var mineCount: int = 10
var mines: Array[Mine]
var tiles: Array[Tile]
var spriteWidth: int = 16
var fieldInitialized: bool = false
@ -21,28 +21,27 @@ func _ready() -> void:
var scale: float = 1
for x: int in range(width):
for y: int in range(height):
var mine: Mine = minePrefab.instantiate()
mine.coord = Vector2i(x, y)
mine.position = Vector2(spriteWidth * x - (spriteWidth * (width / 2)) + (spriteWidth / 2),
var tile: Tile = tilePrefab.instantiate()
tile.coord = Vector2i(x, y)
tile.position = Vector2(spriteWidth * x - (spriteWidth * (width / 2)) + (spriteWidth / 2),
spriteWidth * y - (spriteWidth * (height / 2)) + (spriteWidth / 2))
add_child(mine)
mines.append(mine)
add_child(tile)
tiles.append(tile)
func initField(coord: Vector2i) -> void:
var picked: Array[Vector2i]
fieldInitialized = true
var pickPool: Array[Tile] = tiles.duplicate()
for i: int in range(mineCount):
var pick: Vector2i
var pick: Tile = pickPool.pick_random()
while (true):
pick = Vector2i(randi_range(0, width - 1), randi_range(0, height - 1))
if abs(coord - pick) <= Vector2i(1, 1) || pick in picked:
continue
break
print("Picked " + str(pick))
picked.append(pick)
getMine(pick).type = Mine.MineType.MINE
for mine: Mine in mines:
mine.evaluateType()
pickPool.erase(pick)
if (abs(coord - pick.coord) >= Vector2i(1, 1)):
pick.type = Tile.TileTypes.MINE
break
pick = pickPool.pick_random()
for tile: Tile in tiles:
tile.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
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 cover: CompressedTexture2D = preload("res://sprites/cover.png")
@ -15,7 +15,7 @@ class_name Mine extends Node2D
preload("res://sprites/8.png")
]
enum MineType{
enum TileTypes{
EMPTY,
ONE,
TWO,
@ -31,35 +31,35 @@ enum MineType{
@onready var layer1: Sprite2D = $layer1
@onready var layer2: Sprite2D = $layer2
var type: MineType
var type: TileTypes
var coord: Vector2i
var revealed: bool = false
func evaluateType() -> void:
if (type == MineType.MINE): return
if (type == TileTypes.MINE): return
var count: int = 0
for x: int in range(-1, 2):
for y: int in range(-1, 2):
if (x == 0 && y == 0): continue
var mine: Mine = Minefield.instance.getMine(coord + Vector2i(x, y))
if (mine == null): continue
if (mine.type == MineType.MINE): count += 1
type = count as MineType
var tile: Tile = Minefield.instance.getTile(coord + Vector2i(x, y))
if (tile == null): continue
if (tile.type == TileTypes.MINE): count += 1
type = count as TileTypes
func reveal() -> void:
if (revealed): return
revealed = true
layer1.texture = backplate
match type:
MineType.EMPTY:
TileTypes.EMPTY:
layer2.texture = null
for x: int in range(-1, 2):
for y: int in range(-1, 2):
if (x == 0 && y == 0): continue
var mine: Mine = Minefield.instance.getMine(coord + Vector2i(x, y))
if (mine == null): continue
mine.reveal()
MineType.MINE:
var tile: Tile = Minefield.instance.getTile(coord + Vector2i(x, y))
if (tile == null): continue
tile.reveal()
TileTypes.MINE:
layer2.texture = mine
_:
layer2.texture = nums[type as int - 1]