-
Notifications
You must be signed in to change notification settings - Fork 0
/
tictactoe.swift
151 lines (131 loc) · 6.18 KB
/
tictactoe.swift
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
144
145
146
147
148
149
150
import Foundation
import Scenes
import Igis
class tictactoe : RenderableEntity, EntityMouseClickHandler {
static var boxes : Array<Character> = [" "," "," "," "," "," "," "," "," "]
var winningCombinations = [[Int]]() //to create a two-dimensional array
static var isGameOver : Bool = false
var isGameDraw : Bool = true
static var currentMove : Int = 0
static var boxNumber : Int = 0
let backgroundPic : Image
let tie : Image
init(){
winningCombinations = [[0, 1, 2], [3, 4, 5], [6, 7, 8],
[0, 3, 6], [1, 4, 7], [2, 5, 8],
[0, 4, 8], [2, 4, 6]]
guard let backgroundPicURL = URL(string:"https://wallpaperaccess.com/full/1151553.jpg") else {
fatalError("Failed to create URL for Background")
}
backgroundPic = Image(sourceURL:backgroundPicURL)
guard let tieURL = URL(string:"https://www.collinsdictionary.com/images/full/tie_171498722_1000.jpg") else {
fatalError("Failed to create URL for Tie")
}
tie = Image(sourceURL:tieURL)
super.init(name: "tictactoe")
}
override func setup(canvasSize:Size, canvas:Canvas) {
dispatcher.registerEntityMouseClickHandler(handler:self)
canvas.setup(backgroundPic)
canvas.setup(tie)
}
override func teardown() {
dispatcher.unregisterEntityMouseClickHandler(handler:self)
}
func onEntityMouseClick(globalLocation: Point) {
if (globalLocation.x >= 100 && globalLocation.x <= 400) && (globalLocation.y >= 100 && globalLocation.y <= 400){
tictactoe.boxNumber = ((globalLocation.x-99)/100) + ((globalLocation.y-99)/100)*3
if tictactoe.boxes[tictactoe.boxNumber] == " "{
tictactoe.currentMove += 1
}
}
}
override func render(canvas:Canvas) {
if tictactoe.isGameOver == true{
return
}
if tictactoe.currentMove == 0{
if backgroundPic.isReady {
backgroundPic.renderMode = .destinationRect(Rect(topLeft:Point(x:0, y:0), size:Size(width:1500, height:800)))
canvas.render(backgroundPic)
}
}
for i in 0...3{
let horizontalLines = Lines(from:Point(x:100, y:100 + (i * 100)), to:Point(x:400, y:100 + (i * 100)))
let verticalLines = Lines(from:Point(x:100 + (i * 100), y:100), to:Point(x:100 + (i * 100), y:400 ))
let strokeStyleForOutline = StrokeStyle(color:Color(.red))
let lineWidthForOutline = LineWidth(width:8)
canvas.render(strokeStyleForOutline, lineWidthForOutline, horizontalLines, verticalLines)
}
let xPos : Int = 110 + ((tictactoe.boxNumber % 3) * 100)
let yPos : Int = 110 + ((tictactoe.boxNumber / 3) * 100)
if tictactoe.currentMove > 0{
if tictactoe.currentMove % 2 == 1{
let lines1 = Lines(from:Point(x:xPos, y:yPos), to:Point(x:xPos + 80, y:yPos + 80))
let lines2 = Lines(from:Point(x:xPos, y:yPos + 80), to:Point(x:xPos + 80, y:yPos))
let strokeStyleForX = StrokeStyle(color:Color(.red))
let lineWidthForX = LineWidth(width:8)
canvas.render(strokeStyleForX, lineWidthForX, lines1, lines2)
tictactoe.boxes[tictactoe.boxNumber] = "X"
}
else {
let circle = Ellipse(center:Point(x:xPos + 40, y:yPos + 40), radiusX:42, radiusY:42)
let strokeStyleForO = StrokeStyle(color:Color(.white))
let lineWidthForO = LineWidth(width:8)
canvas.render(strokeStyleForO, lineWidthForO, circle)
tictactoe.boxes[tictactoe.boxNumber] = "O"
}
for i in 0 ... 7{
var xWon : Bool = true
var oWon : Bool = true
for j in 0 ... 2{
print("\(winningCombinations[i][j])")
if xWon == true && tictactoe.boxes[winningCombinations[i][j]] != "X"{
xWon = false
}
if oWon == true && tictactoe.boxes[winningCombinations[i][j]] != "O"{
oWon = false
}
}
if xWon == true{
isGameDraw = false
tictactoe.isGameOver = true
print("X is Winner")
print(" xwon - \(tictactoe.currentMove)")
let text = Text(location:Point(x:500, y:500), text:"X won the game!")
text.font = "60pt Arial"
canvas.render(FillStyle(color:Color(.red)))
canvas.render(text)
break
}
else if oWon == true{
isGameDraw = false
tictactoe.isGameOver = true
print("O is Winner")
print(" owon - \(tictactoe.currentMove)")
let text = Text(location:Point(x:500, y:500), text:"O won the game!")
text.font = "60pt Arial"
canvas.render(FillStyle(color:Color(.red)))
canvas.render(text)
break
}
}
if tictactoe.currentMove == 9 && isGameDraw == true{
if tie.isReady {
tie.renderMode = .destinationRect(Rect(topLeft:Point(x:900, y:200), size:Size(width:200, height:250)))
canvas.render(tie)
}
tictactoe.isGameOver = true
print(" draw - \(tictactoe.currentMove)")
print(tictactoe.currentMove)
let text = Text(location:Point(x:500, y:500), text:"Neither won the game. It was a tie!")
text.font = "40pt Arial"
canvas.render(FillStyle(color:Color(.red)))
canvas.render(text)
}
}
}
override func boundingRect() -> Rect {
return Rect(size: Size(width: Int.max, height: Int.max))
}
}