118 lines
2.8 KiB
GDScript
118 lines
2.8 KiB
GDScript
extends Node2D
|
|
|
|
var current_player: int = 0
|
|
var player_states := ["Circle", "Cross"]
|
|
var won := ""
|
|
|
|
|
|
@onready var board := $Board as Board
|
|
@onready var nextPlayer := $GUI/NextPlayer as Sprite2D
|
|
@onready var wonPlayer := $GUI/WonPlayer as Sprite2D
|
|
@onready var diceButton := $GUI/DiceButton as Button
|
|
@onready var diceSprite = $GUI/DiceSprite as Sprite2D
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
current_player = 0
|
|
board.reset()
|
|
won = ""
|
|
wonPlayer.hide()
|
|
nextPlayer.region_rect.position.x = current_player * 300
|
|
nextPlayer.show()
|
|
_update_dice_sprite(0)
|
|
board.active = true
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(_delta):
|
|
if won == "":
|
|
if Input.is_action_just_pressed("Click"):
|
|
var grid_pos = board.gridpos_at_mouse()
|
|
if board.get_state(grid_pos) == board.empty_state:
|
|
var new_pos = board._calculate_drop_pos(grid_pos)
|
|
if board.set_state(new_pos, player_states[current_player]):
|
|
won = _check_win()
|
|
if won=="":
|
|
current_player = 1 - current_player
|
|
nextPlayer.region_rect.position.x = current_player * 300
|
|
else:
|
|
print("Winner: ", won)
|
|
wonPlayer.region_rect.position.x = player_states.find(won) * 300
|
|
wonPlayer.show()
|
|
nextPlayer.hide()
|
|
board.active = false
|
|
|
|
|
|
|
|
func _on_restart_button_pressed():
|
|
_ready()
|
|
|
|
|
|
var _checks = [
|
|
[Vector2i(-1,0), Vector2i(1,0)],
|
|
[Vector2i(0,-1), Vector2i(0,1)],
|
|
[Vector2i(-1,-1), Vector2i(1,1)],
|
|
[Vector2i(-1,1), Vector2i(1,-1)],
|
|
]
|
|
|
|
|
|
func _check_win() -> String:
|
|
for cell in board.get_used_cells(board.layer_by_name[board.state_layer]):
|
|
var state = board.get_state(cell)
|
|
for check in _checks:
|
|
for i in range(3):
|
|
var same = true
|
|
for j in range(4):
|
|
if board.get_state(cell + check[0] * (i + j)) != state:
|
|
same = false
|
|
break
|
|
if same:
|
|
return state
|
|
return ""
|
|
|
|
|
|
#Generiert die Zufallszahl von 1-6
|
|
func _roll_dice():
|
|
var zahl = randi() % 6 + 1
|
|
_update_dice_sprite(zahl)
|
|
print(zahl) #Debug ausgabe, später löschen lol
|
|
return zahl
|
|
|
|
|
|
#Funktion um Knop und Methode zu verbinden
|
|
func _on_dice_button_pressed():
|
|
_roll_dice()
|
|
|
|
|
|
#Sucht sich für die entsprechende Augenzahl
|
|
#die X und Y-Koordinaten in der Tilemap
|
|
func _update_dice_sprite(result :int):
|
|
diceSprite.region_rect.position.x = _get_dice_pos_x(result)
|
|
diceSprite.region_rect.position.y = _get_dice_pos_y(result)
|
|
|
|
|
|
#X-Koordinaten der Augenzahlen in der Tilemap
|
|
func _get_dice_pos_x(result: int) -> int:
|
|
match result:
|
|
1: return 8
|
|
2: return 108
|
|
3: return 208
|
|
4: return 308
|
|
5: return 108
|
|
6: return 208
|
|
return 208
|
|
|
|
|
|
#Y-Koordinaten in der Tilemap
|
|
func _get_dice_pos_y(result: int) -> int:
|
|
match result:
|
|
1: return 308
|
|
2: return 308
|
|
3: return 308
|
|
4: return 308
|
|
5: return 410
|
|
6: return 410
|
|
return 410
|
|
|