-
Notifications
You must be signed in to change notification settings - Fork 0
/
cliDisplayer.go
100 lines (84 loc) · 1.93 KB
/
cliDisplayer.go
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
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"os/exec"
"strconv"
"time"
)
type cliDisplayer struct{}
func (c cliDisplayer) init() {}
// the main game loop which handles input and display
func (c cliDisplayer) startGameLoop(grid [][]int) {
// set the wanted displayer
// seed random with the current time
rand.Seed(time.Now().UTC().UnixNano())
// create a reader
reader := bufio.NewReader(os.Stdin)
for {
createNewTiles(grid)
// clear the screen
c := exec.Command("clear")
c.Stdout = os.Stdout
c.Run()
// show the map
cliDisplayGrid(grid)
// get movement from stdin and move accordinlgy
fmt.Print("Move: ")
move, _ := reader.ReadString('\n')
// use vim keybinding for movement
switch move {
case "j\n":
moveVertical(grid, false)
case "k\n":
moveVertical(grid, true)
case "h\n":
moveHorizontal(grid, true)
case "l\n":
moveHorizontal(grid, false)
}
}
}
// print grid to stdout
func cliDisplayGrid(grid [][]int) {
// save dimension (height/width) of the grid
height := len(grid)
width := len(grid[0])
// make the top line
makeHorizontalSeperator(width)
// loop through the whole grid-matrix
for y := 0; y < height; y++ {
fmt.Print("|")
for x := 0; x < width; x++ {
// get the value of the current cell
value := grid[y][x]
// get the number of digits in the value
digits := getLengthOfInt(value)
// print whitespace to add padding to cells
for q := 0; q < 11-digits; q++ {
fmt.Print(" ")
}
// print the actual value
fmt.Print(strconv.Itoa(value))
fmt.Print("|")
}
// make a newline
fmt.Println()
// make a seperator between the lines
makeHorizontalSeperator(width)
}
}
// make the horizontal line
func makeHorizontalSeperator(width int) {
fmt.Print("+")
for i := 0; i < width; i++ {
fmt.Print("-----------+")
}
fmt.Println()
}
// get number of digits in a integer
func getLengthOfInt(number int) int {
return len(strconv.Itoa(number))
}