diff --git a/Scenes/Main.tscn b/Scenes/Main.tscn index b83e096..8b47573 100644 --- a/Scenes/Main.tscn +++ b/Scenes/Main.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=5 format=4 uid="uid://bdhkwmdjla3dy"] +[gd_scene load_steps=6 format=4 uid="uid://bdhkwmdjla3dy"] [ext_resource type="Script" uid="uid://cvjgu1sx802tc" path="res://Scripts/GameManager.gd" id="1_r150o"] [ext_resource type="TileSet" uid="uid://d1gtddd47nuvg" path="res://Assets/TileSets/Tilesets.tres" id="2_idj7w"] +[ext_resource type="FontFile" uid="uid://bnipxsg3yhkk8" path="res://Assets/Fonts/文字主题.ttf" id="3_kln2b"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_idj7w"] size = Vector2(336, 450) @@ -9,13 +10,13 @@ size = Vector2(336, 450) [sub_resource type="RectangleShape2D" id="RectangleShape2D_kln2b"] size = Vector2(48, 71) -[node name="GameRoot" type="Node2D" node_paths=PackedStringArray("left_top_of_board", "init_card_anchos", "board_area")] +[node name="GameRoot" type="Node2D" node_paths=PackedStringArray("left_top_of_board", "init_card_anchos", "score_num_label")] script = ExtResource("1_r150o") cols = 7 cell_size = Vector2i(48, 64) left_top_of_board = NodePath("Tiles/Board/LeftTop") init_card_anchos = [NodePath("Tiles/Cards/Marker1"), NodePath("Tiles/Cards/Marker2"), NodePath("Tiles/Cards/Marker3"), NodePath("Tiles/Cards/Marker4")] -board_area = NodePath("") +score_num_label = NodePath("Score/ScoreNum") [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(-159, -32) @@ -74,4 +75,22 @@ offset_bottom = 40.0 [node name="Cards" type="Node2D" parent="."] +[node name="Score" type="Label" parent="."] +offset_left = -400.0 +offset_top = -328.0 +offset_right = -64.0 +offset_bottom = -272.0 +theme_override_fonts/font = ExtResource("3_kln2b") +theme_override_font_sizes/font_size = 48 +text = "Score:" + +[node name="ScoreNum" type="Label" parent="Score"] +layout_mode = 0 +offset_left = 128.0 +offset_right = 336.0 +offset_bottom = 56.0 +theme_override_fonts/font = ExtResource("3_kln2b") +theme_override_font_sizes/font_size = 48 +text = "0" + [connection signal="input_event" from="Tiles/Board/BoardArea" to="." method="_on_board_area_input_event"] diff --git a/Scripts/Card.gd b/Scripts/Card.gd index 8227ee2..3fc1223 100644 --- a/Scripts/Card.gd +++ b/Scripts/Card.gd @@ -26,9 +26,11 @@ var settled : bool func setup_card(category: Category, value: int) -> void: origin_pos = global_position - setup_sprite() + self.category = category + self.value = value + setup_sprite(category, value) -func setup_sprite() -> void: +func setup_sprite(category: Category, value: int) -> void: $Value.text = str(value) match category : Category.Onion: @@ -39,6 +41,7 @@ func setup_sprite() -> void: texture_normal = carrot_texture Category.Bucket: texture_normal = bucket_texture + $Value.text = "" func _on_button_down() -> void: if !settled: diff --git a/Scripts/GameManager.gd b/Scripts/GameManager.gd index 48d587a..56b3842 100644 --- a/Scripts/GameManager.gd +++ b/Scripts/GameManager.gd @@ -5,10 +5,16 @@ extends Node @export var left_top_of_board : Marker2D @export var init_card_anchos : Array[Marker2D] -@export var board_area : ReferenceRect +@export var score_num_label : Label signal dragging_card signal release_dragging_card +signal place_card +signal kill_cards + +var score = 0 + +var waitting_cards_num = 4 var has_mouse: bool = false var dragged_card : Card @@ -30,9 +36,13 @@ func _ready() -> void: init_game() dragging_card.connect(_on_dragging_card) release_dragging_card.connect(_on_release_dragging_card) + place_card.connect(_on_place_card) + kill_cards.connect(_on_kill_cards) func init_game() -> void: board_info = create_cells() + score = 0 + waitting_cards_num = init_card_anchos.size() send_cards() func create_cells() -> Array: @@ -76,8 +86,78 @@ func _on_dragging_card(card: Card) -> void: dragged_card = card func _on_release_dragging_card(card: Card, index: Vector2i) -> void: - print(index) dragged_card = null + waitting_cards_num -= 1 + if waitting_cards_num == 0: + waitting_cards_num = init_card_anchos.size() + send_cards() + +func _on_place_card(card: Card, index: Vector2i) -> void: + var cell_info = board_info[index.x][index.y] + var lt = cell_info[GLOBAL_LEFT_TOP] + card.global_position = lt + card.settled = true + cell_info[HOLD_CARD] = card + card.index = index + try_kill_card(index) + +func try_kill_card(index: Vector2i) -> void: + var detected_cards = detect_cards(index) + if detected_cards.size() > 1: + emit_signal("kill_cards", detected_cards) + +func detect_cards(index: Vector2i) -> Array[Vector2i]: + var cell_info = board_info[index.x][index.y] + var card = cell_info[HOLD_CARD] + if card == null: + return [] + return _detect_cards(index, index, []) + +func _detect_cards(index: Vector2i, origin_index: Vector2i, visited) -> Array[Vector2i]: + # 检查是否越界或已经访问 + if index.x < 0 or index.y < 0 or index.x >= cols or index.y >= cols: + return [] + if index in visited: + return [] + + # 标记当前格子为已访问 + visited.append(index) + + var cell_info = board_info[index.x][index.y] + var origin_cell_info = board_info[origin_index.x][origin_index.y] + + # 如果当前格子为空(值为0),则返回空列表 + if cell_info[HOLD_CARD] == null: + return [] + + # 当前格子含有棋子,将其加入结果 + if cell_info[HOLD_CARD].category == origin_cell_info[HOLD_CARD].category and cell_info[HOLD_CARD].value == origin_cell_info[HOLD_CARD].value: + var result : Array[Vector2i] = [index] + + # 检查上下左右相邻格子 + var directions = [ + Vector2i(0, 1), # 上 + Vector2i(0, -1), # 下 + Vector2i(1, 0), # 右 + Vector2i(-1, 0) # 左 + ] + for dir in directions: + result += _detect_cards(index + dir, index, visited) + return result + return [] + +func _on_kill_cards(index_array: Array[Vector2i]) -> void: + print("------*****--------") + for i in index_array: + var cell_info = board_info[i.x][i.y] + var card = cell_info[HOLD_CARD] as Card + cell_info[HOLD_CARD] = null + card.index = Global.invalid_cell_index + card.queue_free() + print("kill-" + str(i) + "-" + str(cell_info)) + score += 1 + score_num_label.text = str(score) + print("-------------------") func get_hover_cell_index() -> Vector2i: var mouse_global_position = $MouseAnchor.get_global_mouse_position() @@ -104,17 +184,16 @@ func clamp_cell() -> ColorRect: func send_cards() -> void: var card_prefab = load("res://Scenes/Card.tscn") - for i in range(init_card_anchos.size()): + for i in range(waitting_cards_num): var pos = init_card_anchos[i].global_position - var card_instance = card_prefab.instantiate() + var card_instance = card_prefab.instantiate() as Card var card_size = (card_instance as Card).texture_normal.get_size() card_instance.global_position = Vector2(pos.x - card_size.x / 2, pos.y - card_size.y / 2) - var val = randi() % 10 + var val = randi() % 9 + 1 var cate_num = randi() % 4 card_instance.setup_card(cate_num, val) $Cards.add_child(card_instance) - func _on_board_area_input_event(viewport: Node, event: InputEvent, shape_idx: int) -> void: if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_LEFT: @@ -127,8 +206,5 @@ func try_place_card(card: Card) -> void: return var cell_info = board_info[index.x][index.y] if cell_info[HOLD_CARD] == null: - var lt = cell_info[GLOBAL_LEFT_TOP] - card.global_position = lt - card.settled = true - cell_info[HOLD_CARD] = card emit_signal("release_dragging_card", card, index) + emit_signal("place_card", card, index)