112 lines
3.1 KiB
Plaintext
112 lines
3.1 KiB
Plaintext
|
extends Node
|
||
|
|
||
|
@export var circle_scene: PackedScene
|
||
|
@export var cross_scene: PackedScene
|
||
|
|
||
|
var player: int
|
||
|
var moves: int
|
||
|
var winner: int
|
||
|
var temp_marker
|
||
|
var player_panel_pos: Vector2i
|
||
|
var grid_data: Array
|
||
|
var grid_pos: Vector2i
|
||
|
var board_size: int
|
||
|
var cell_size: int
|
||
|
var row_sum: int
|
||
|
var col_sum: int
|
||
|
var diag1_sum: int
|
||
|
var diag2_sum: int
|
||
|
|
||
|
# Called when the node enters the scene tree for the first time.
|
||
|
func _ready():
|
||
|
board_size = $Board.texture.get_width()
|
||
|
#get size of cell
|
||
|
cell_size = board_size/3
|
||
|
#coordonates of right panel
|
||
|
player_panel_pos = $PlayerPanel.get_position()
|
||
|
new_game()
|
||
|
|
||
|
|
||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||
|
func _process(delta):
|
||
|
pass
|
||
|
func _input(event):
|
||
|
if event is InputEventMouseButton:
|
||
|
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
|
||
|
#check if mouse on board
|
||
|
if event.position.x < board_size:
|
||
|
#convert mouse poz to grid location
|
||
|
grid_pos = Vector2i(event.position / cell_size)
|
||
|
if grid_data[grid_pos.y][grid_pos.x] == 0:
|
||
|
moves+=1
|
||
|
grid_data[grid_pos.y][grid_pos.x] = player
|
||
|
#place player's marker
|
||
|
create_marker(player,grid_pos * cell_size+Vector2i(cell_size/2,cell_size/2))
|
||
|
if check_win() != 0:
|
||
|
get_tree().paused=true
|
||
|
$GameOverMenu.show()
|
||
|
if winner == -1:
|
||
|
$GameOverMenu.get_node("ResultLabel").text = "Jucător 1 a câștigat!"
|
||
|
elif winner == 1:
|
||
|
$GameOverMenu.get_node("ResultLabel").text = "Jucător 2 a câștigat!"
|
||
|
#check if tie
|
||
|
elif moves==9:
|
||
|
get_tree().paused=true
|
||
|
$GameOverMenu.show()
|
||
|
$GameOverMenu.get_node("ResultLabel").text = "Egalitate!"
|
||
|
player *= -1
|
||
|
#update player marker
|
||
|
temp_marker.queue_free()
|
||
|
create_marker(player,player_panel_pos+Vector2i(cell_size/2,cell_size/2),true)
|
||
|
print(grid_data)
|
||
|
func new_game():
|
||
|
player=1
|
||
|
winner=0
|
||
|
moves=0
|
||
|
row_sum=0
|
||
|
col_sum=0
|
||
|
diag1_sum=0
|
||
|
diag2_sum=0
|
||
|
#clear existing markers
|
||
|
get_tree().call_group("x-uri","queue_free")
|
||
|
get_tree().call_group("zerouri","queue_free")
|
||
|
grid_data = [
|
||
|
[0,0,0],
|
||
|
[0,0,0],
|
||
|
[0,0,0]
|
||
|
]
|
||
|
#create a marker to show starting player's turn
|
||
|
create_marker(player,player_panel_pos+Vector2i(cell_size/2,cell_size/2),true)
|
||
|
$GameOverMenu.hide()
|
||
|
get_tree().paused=false
|
||
|
func create_marker(player,position,temp=false):
|
||
|
#create marker note and add it as a child
|
||
|
if player == -1:
|
||
|
var circle = circle_scene.instantiate()
|
||
|
circle.position = position
|
||
|
add_child(circle)
|
||
|
if temp: temp_marker=circle
|
||
|
else:
|
||
|
var cross = cross_scene.instantiate()
|
||
|
cross.position = position
|
||
|
add_child(cross)
|
||
|
if temp: temp_marker=cross
|
||
|
func check_win():
|
||
|
#add row, col, diag values
|
||
|
for i in len(grid_data):
|
||
|
row_sum = grid_data[i][0]+grid_data[i][1]+grid_data[i][2]
|
||
|
col_sum = grid_data[0][i]+grid_data[1][i]+grid_data[2][i]
|
||
|
diag1_sum = grid_data[0][0]+grid_data[1][1]+grid_data[2][2]
|
||
|
diag2_sum = grid_data[0][2]+grid_data[1][1]+grid_data[2][0]
|
||
|
#check if any player has 3 || -3 points
|
||
|
if row_sum==-3 or col_sum==-3 or diag1_sum==-3 or diag2_sum==-3:
|
||
|
winner = 1
|
||
|
if row_sum==3 or col_sum==3 or diag1_sum==3 or diag2_sum==3:
|
||
|
winner = -1
|
||
|
return winner
|
||
|
|
||
|
|
||
|
|
||
|
func _on_game_over_menu_restart():
|
||
|
new_game()
|