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
|
package main
// aesthetics.go contains all the functions which
// display or setup visuals without the use of tview.
import (
"github.com/mbndr/figlet4go"
"strconv"
)
// printPrimary displays an ASCII version of the primary battleship board
// The primary board is the one which belongs to the person calling a hit
// He sees his own boats on this board.
// Here is an example
// A B C D E F G H I J
// 0 ~ ~ ~ ~ ~ ~ ~ ~ ~ △
// 1 ~ ~ ~ ~ ~ ~ ~ ~ ~ ▯
// 2 ~ ~ ~ ~ ~ ~ ~ ~ ~ ▽
// 3 ~ ~ ~ ◁ ▭ ▭ ▭ ▷ ~ ~
// 4 ~ ~ △ ~ ~ ~ ~ △ ~ ~
// 5 ~ ~ ▯ ~ ~ ~ ~ ▯ ~ ~
// 6 ~ ~ ▯ ~ ~ ~ ~ ~ ~ ~
// 7 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
// 8 ~ ~ ~ ~ ◀ ▬ ▬ ▷ ~ ~
// 9 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
// Only E8, F8, and G8 were hit.
func (plyr player) DisplayPrimary() string {
text := "\n A B C D E F G H I J \n"
for i := 0; i < 10; i++ {
text += strconv.Itoa(i)
text += " "
for j := 0; j < 10; j++ {
switch plyr.primary[i][j][2] {
case 0: // That coordinate was not hit
text += boatchars[1][plyr.primary[i][j][1]]
case 1: // That coordinates was hit
text += boatchars[0][plyr.primary[i][j][1]]
// default:
// return errors.New("Unknown State (hit/unhit) at a given coordinate")
}
text += " "
}
text += "\n"
}
// fmt.Println(text)
return text
}
func (plyr *player) DisplayTarget() string {
// First row labelling the columns
text := "\n A B C D E F G H I J \n"
// For every row (r)
for r := 0; r < 10; r++ {
// Add the row number at the start of each line
text += strconv.Itoa(r)
// For every column (c)
for c := 0; c < 10; c++ {
// Separate each character with a space
text += " "
// First thing: is the coordinate hit or not?
switch plyr.target[r][c][0] {
// The coordinate is NOT hit:
case 0:
// Add the `~` symbol
text += boatchars[1][0]
// If the coordinate is NOT hit:
default:
// Is the coordinate water?
switch plyr.prey.primary[r][c][0] {
// It IS water:
case 6:
// Add the `◌` symbol
text += boatchars[0][0]
// It's NOT water:
default:
// Is the ID of the boat at that coordinate marked as a gain?
switch plyr.gains[plyr.prey.primary[r][c][0]] {
// It IS marked as a gain:
case true:
// Show the boat as it's meant to be:
// (hit boatchars: with `position` marked in the opponents primary)
text += boatchars[0][plyr.prey.primary[r][c][1]]
default:
// Nope, you're getting a censored tile: `▣`
text += misteryHit
}
}
}
}
text += "\n"
}
return text
}
// TODO: Function which returns what was hit as a commentary for the hitter
/* Boats Info:
|------------+--------+----------------|
| BoatName | BoatID | HorizontalBoat |
| Carrier | 0 | ◁ ▭ ▭ ▭ ▷ |
| Battleship | 1 | ◁ ▭ ▭ ▷ |
| Destroyer | 2 | ▭ ▭ ▷ |
| Submarine | 3 | ◁ ▭ ▷ |
| PatrolBoat | 4 | ▭ ▷ |
|------------+--------+----------------|
*/
var boatchars = [2][7]string{
{`◌`, `▲`, `▼`, `◀`, `▶`, `▮`, `▬`},
{`~`, `△`, `▽`, `◁`, `▷`, `▯`, `▭`},
}
func figletWrite(text string) string {
ascii := figlet4go.NewAsciiRender()
options := figlet4go.NewRenderOptions()
options.FontName = "larry3d"
options.FontColor = []figlet4go.Color{
figlet4go.ColorCyan,
}
// The underscore would be an error
renderStr, _ := ascii.Render(text)
return renderStr
}
// This constant keeps information about boats that aren't totally sunk secret.
// It therefore substitues the shape of a boat on the target board when it is unsunk.
const misteryHit = `▣`
|