2025-08-18 08:23:01 +00:00
|
|
|
extends CanvasLayer
|
|
|
|
|
|
|
|
@warning_ignore("unused_signal")
|
|
|
|
signal exit(arg)
|
|
|
|
|
2025-08-19 16:37:44 +00:00
|
|
|
@onready var grid = %GridContainer as GridContainer
|
|
|
|
@onready var block_arr: Array[TextureButton] = [%B0, %B1, %B2, %B3, %B4, %B5, %B6, %B7, %B8]
|
|
|
|
# 留出一个空缺
|
|
|
|
var empty_id := 4
|
|
|
|
|
|
|
|
|
2025-08-18 08:23:01 +00:00
|
|
|
func _ready() -> void:
|
2025-08-20 09:18:26 +00:00
|
|
|
# TODO 1、保存操作状态 2、成功后锁定操作
|
|
|
|
|
|
|
|
|
2025-08-18 08:23:01 +00:00
|
|
|
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
|
2025-08-19 16:37:44 +00:00
|
|
|
block_arr[empty_id].modulate.a = 0.0
|
|
|
|
for id in range(block_arr.size()):
|
|
|
|
var btn := block_arr[id]
|
|
|
|
btn.pressed.connect(_on_button_pressed.bind(btn))
|
|
|
|
if id != empty_id:
|
|
|
|
btn.mouse_entered.connect(_toggle_hightlight.bind(btn, true))
|
|
|
|
btn.mouse_exited.connect(_toggle_hightlight.bind(btn, false))
|
|
|
|
# suffle
|
|
|
|
suffling = true
|
|
|
|
for i in 200:
|
|
|
|
_on_button_pressed(block_arr.pick_random())
|
|
|
|
suffling = false
|
|
|
|
|
|
|
|
|
|
|
|
var suffling = false
|
|
|
|
var game_success = false
|
|
|
|
|
|
|
|
|
|
|
|
func _on_button_pressed(btn: TextureButton) -> void:
|
|
|
|
if game_success:
|
|
|
|
return
|
|
|
|
var current_blocks = grid.get_children()
|
|
|
|
var empty_coord = current_blocks.find(block_arr[empty_id])
|
|
|
|
var empty_x = empty_coord % 3
|
|
|
|
@warning_ignore("integer_division")
|
|
|
|
var empty_y = floori(empty_coord / 3)
|
|
|
|
var block_coord = current_blocks.find(btn)
|
|
|
|
var block_x = block_coord % 3
|
|
|
|
@warning_ignore("integer_division")
|
|
|
|
var block_y = floori(block_coord / 3)
|
|
|
|
# 判断能否交换
|
|
|
|
if abs(empty_x - block_x) + abs(empty_y - block_y) == 1:
|
|
|
|
# 交换位置,先移动后面的到前面
|
|
|
|
if empty_coord < block_coord:
|
|
|
|
grid.move_child(btn, empty_coord)
|
|
|
|
grid.move_child(block_arr[empty_id], block_coord)
|
|
|
|
else:
|
|
|
|
grid.move_child(block_arr[empty_id], block_coord)
|
|
|
|
grid.move_child(btn, empty_coord)
|
|
|
|
_check_success()
|
|
|
|
elif not suffling:
|
|
|
|
$SfxInvalid.play()
|
|
|
|
|
|
|
|
|
|
|
|
func _check_success() -> void:
|
|
|
|
if suffling:
|
|
|
|
return
|
|
|
|
# 判断游戏是否成功
|
|
|
|
var success := true
|
|
|
|
var current_blocks = grid.get_children()
|
|
|
|
for i in 9:
|
|
|
|
if current_blocks[i] != block_arr[i]:
|
|
|
|
success = false
|
|
|
|
if success:
|
|
|
|
# 游戏成功
|
|
|
|
$SfxValid.play()
|
|
|
|
print("success")
|
|
|
|
game_success = true
|
|
|
|
var block = block_arr[empty_id]
|
|
|
|
var tween = create_tween()
|
|
|
|
tween.tween_property(block, "modulate:a", 1.0, 1.0)
|
|
|
|
|
|
|
|
|
|
|
|
func _toggle_hightlight(btn: TextureButton, highlight: bool) -> void:
|
|
|
|
if game_success:
|
|
|
|
highlight = false
|
|
|
|
btn.get_node("PointLight2D").enabled = highlight
|