battleship-cli/game.go

163 lines
3.4 KiB
Go
Raw Normal View History

package main
import (
"fmt"
"math/rand/v2"
"os"
"reflect"
"strconv"
"time"
)
var (
hiddenShips1 [][]string
revealedShips1 [][]string
)
func fillShips(tiles int) {
hiddenShips1 = make([][]string, tiles)
revealedShips1 = make([][]string, tiles)
for i := 0; i < tiles; i++ {
hiddenShips1[i] = make([]string, tiles)
revealedShips1[i] = make([]string, tiles)
}
for i := 0; i < len(revealedShips1); i++ {
for i1 := range revealedShips1[i] {
shipChance := rand.IntN(3-0) + 0
if shipChance == 1 {
revealedShips1[i][i1] = "S"
} else {
revealedShips1[i][i1] = "_"
}
}
}
for i := 0; i < len(hiddenShips1); i++ {
for i1 := range hiddenShips1[i] {
hiddenShips1[i][i1] = "_"
}
}
}
func game() {
fmt.Printf("How many rows/columns would you like to have?\nChoice: ")
var shipNum int
fmt.Scanln(&shipNum)
clear()
fillShips(shipNum)
showMatrix(revealedShips1)
for {
clear()
gameStatus()
checkWin()
fmt.Printf("X coordinate: ")
x := scanLine()
fmt.Printf("Y coordinate: ")
y := scanLine()
xint, _ := strconv.Atoi(x)
yint, _ := strconv.Atoi(y)
xint--
yint--
bombingText := fmt.Sprintf("Bombing X: %v / Y: %v.", x, y)
for i := 0; i < 3; i++ {
fmt.Printf("\r%v", bombingText)
time.Sleep(time.Second)
bombingText = bombingText + "."
}
fmt.Printf("\nBombed!")
time.Sleep(time.Second)
}
}
func checkWin() {
var winStatus bool = reflect.DeepEqual(revealedShips1, hiddenShips1)
if winStatus == true {
fmt.Println("You win!")
os.Exit(0)
}
}
func gameStatus() {
fmt.Println("Player 1 (You):")
showMatrix(hiddenShips1)
}
func showMatrix(mat [][]string) {
for i := 0; i < len(mat); i++ {
for _, v := range mat[i] {
fmt.Printf("%v ", v)
}
fmt.Println()
}
}
func fillMatrix(mat [][]string) {
for i := 0; i < len(mat); i++ {
for i1 := range mat[i] {
shipChance := rand.IntN(3-0) + 0
if shipChance == 1 {
mat[i][i1] = "S"
} else {
mat[i][i1] = "_"
}
}
}
}
// Trash zone:
// func gameStatus(player1 [][]string, player2 [][]string) {
// fmt.Println("Player 1 (You):")
// fillMatrix(PLAYER1_REAL_MATRIX)
// showMatrix(PLAYER1_REAL_MATRIX)
// fmt.Println()
// showMatrix(PLAYER1_HIDDEN_MATRIX)
// fmt.Printf("\n\n")
// fmt.Println("Player 2:")
// fillMatrix(PLAYER2_REAL_MATRIX)
// showMatrix(PLAYER2_REAL_MATRIX)
// fmt.Println()
// showMatrix(PLAYER2_HIDDEN_MATRIX)
//
// }
// PLAYER1_REAL_MATRIX := [][]string{
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// }
// Holy hell this is a MUCH better way to initialize matrixes
// PLAYER1_REAL_MATRIX := make([][]string, 5)
// for i := 0; i < 5; i++ {
// PLAYER1_REAL_MATRIX[i] = make([]string, 5)
// }
//PLAYER1_HIDDEN_MATRIX := PLAYER1_REAL_MATRIX
// PLAYER1_HIDDEN_MATRIX := make([][]string, len(PLAYER1_REAL_MATRIX))
// copy(PLAYER1_HIDDEN_MATRIX, PLAYER1_REAL_MATRIX)
// PLAYER2_REAL_MATRIX := [][]string{
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// {"x", "x", "x", "x", "x", "x"},
// }
//
// PLAYER2_HIDDEN_MATRIX := PLAYER2_REAL_MATRIX
// Forget it, I'm just going to implement a single player for now
// for {
//
// fmt.Scanln()
// }