-
Notifications
You must be signed in to change notification settings - Fork 0
/
Game.gd
147 lines (121 loc) · 2.93 KB
/
Game.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
extends Node2D
var size = 3
var cell_size = 50
var player = 'X'
var font = DynamicFont.new()
var board = []
var pos = []
func _create_board() -> void:
var tab = []
for i in range(size):
for j in range(size):
tab.append('')
board.append(tab)
tab = []
func set_pos_array() -> void:
var posx = 0 ;
var posy = 0 ;
var tab = []
for i in range(size):
for j in range(size):
tab.append(Vector2(posx,posy))
posx += cell_size
pos.append(tab)
tab = []
posy += cell_size
posx = 0
func resize_screen(size):
OS.set_window_size(Vector2(size*cell_size,size*cell_size))
return
func get_clicked_cell(p):
for i in range(size):
for j in range(size):
if (p.x >= pos[i][j].x and p.x <= pos[i][j].x +cell_size ) and (p.y >= pos[i][j].y and p.y <= pos[i][j].y +cell_size) :
return [i,j]
func check_pos_is_valid(i,j) -> bool:
if board[i][j] == '' :
return true
else :
return false
func switch_players() -> void:
if player == 'X' :
player = 'O'
elif player == 'O' :
player = 'X'
return
func play(i,j) -> void:
board[i][j] = player
switch_players()
print(player+' turn')
update()
func _ready():
font.font_data = load("res://Another Round.otf")
font.size = cell_size
set_pos_array()
_create_board()
resize_screen(size)
func check_winner() :
#Row and column test
for i in range(size):
var test = [true,true]
for j in range(size):
#Row test
if board[i][j] != board[i][0] or board[i][j] == '' :
test[0] = false
#Column test
if board[j][i] != board[0][i] or board[j][i] == '' :
test[1] = false
if test[0] :
return board[i][0] ;
if test[1] :
return board[0][i] ;
#diagonal test
var dia_test = [true,true]
var j = size - 1
for i in range(size):
if board[i][i] != board[0][0] or board[i][i] == '' :
dia_test[0] = false
if board[i][j] != board[size-1][0] or board[i][j] == '' :
dia_test[1] = false
j -= 1
if dia_test[0] :
return board[0][0]
if dia_test[1] :
return board[size-1][0]
return null
func check_draw() :
var k = 0
for i in range(size):
for j in range(size):
if board[i][j] != '' :
k += 1
if k == pow(size,2) :
return true
return false
func is_game_finished() :
var winner = check_winner()
if winner != null :
print(winner + ' is winner')
return true
elif check_draw() :
print('Draw')
return true
return false
func _draw():
#drawing the board array
for i in range(size):
for j in range(size):
draw_string(font,Vector2(pos[i][j].x + (cell_size*0.2) , pos[i][j].y + cell_size*0.8),board[i][j],Color(0,0,0,5))
#drawing Grid
var j = 0
for i in range(size) :
j += cell_size
draw_line(Vector2(0,j),Vector2(cell_size*size,j),Color(0,0,0,5))
draw_line(Vector2(j,0),Vector2(j,cell_size*size),Color(0,0,0,5))
func _input(event):
if(Input.is_action_just_pressed("click")):
var cell = get_clicked_cell(event.position)
if check_pos_is_valid(cell[0],cell[1]) :
play(cell[0],cell[1])
if is_game_finished() :
set_process_input(false)