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:
parent
807b3d8de5
commit
5bc56ee648
@ -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="."]
|
||||||
|
|
@ -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]
|
||||||
|
@ -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]
|
Loading…
x
Reference in New Issue
Block a user