import [Link].
File
fun criaMenu(): String {
return "\nBem vindo ao jogo das tendas\n\n1 - Novo jogo\n0 - Sair\n"
}
fun validaTamanhoMapa(numLinhas: Int, numColunas: Int): Boolean{
return (numLinhas==6 && numColunas==5)||(numLinhas==6 && numColunas==6)||
(numLinhas==8 && numColunas==8)||
(numLinhas==10 && numColunas==10)||(numLinhas==8 && numColunas==10)||
(numLinhas==10 && numColunas==8)
}
fun validaDataNascimento(data: String?) : String?{
val invalida = "Data invalida"
val underage = "Menor de idade nao pode jogar"
if(data== null || [Link] != 10){
return invalida
}
val dia = ([Link](0).toString()+[Link](1).toString())
val mes = ([Link](3).toString()+[Link](4).toString())
val ano = ([Link](6).toString()+[Link](7).toString()+[Link](8).toString()
+[Link](9).toString())
if ([Link] != 2 || [Link] != 2 || [Link] != 4){
return invalida
}
if([Link]() in 1900..2022){
if ([Link]() in 1..12){
if ([Link]() == 4||[Link]() ==6 || [Link]() == 9 ||
[Link]() == 11){
if ([Link]() > 30 || [Link]() < 1){
return invalida
}
if (([Link]() == 2004 && [Link]() == 11) || ([Link]() >
2004)){
return underage
}
return null
}
else if ([Link]() == 2){
if([Link]() % 4 == 0 && ([Link]() % 100 != 0) || ([Link]()
% 400 == 0)){
if ([Link]() > 29 ||[Link]() < 1 ){
return invalida
}
if ([Link]() > 2004){
return underage
}
return null
}
if ([Link]() > 28 || [Link]() < 1){
return invalida
}
if ([Link]() > 2004){
return underage
}
return null
} else{
if ([Link]() > 31 || [Link]() < 1){
return invalida
}
if (([Link]() == 2004 && [Link]() == 12) || ([Link]() >
2004)){
return underage
}
return null
}
}
return invalida
}
return invalida
}
fun criaLegendaHorizontal(numColuna: Int): String{
var countColuna = 0
var legenda=""
var codigoAscii=65
var letras=""
while (countColuna < numColuna && codigoAscii <= 90) {
letras=( [Link]()).toString()
if(countColuna > numColuna-2) {
legenda = legenda + "$letras"
}else{
legenda=legenda+"$letras | "
}
codigoAscii++
countColuna++
}
return legenda
}
fun criaLegendaVertical(numColuna: Int): String{
var countColuna = 0
var legenda=""
var codigoAscii=65
var letras=""
while (countColuna < numColuna && codigoAscii <= 90) {
letras=( [Link]()).toString()
codigoAscii++
countColuna++
}
return letras
}
fun leContadoresDoFicheiro(numLines: Int, numColumns: Int, verticais: Boolean):
Array<Int?>{
val linhas= File("$numLines"+"x"+"$numColumns"+".txt").readLines()
if(verticais) {
val array:Array<Int?> =Array(numColumns,{null})
val coluna=linhas[0].split(",")
for (posicao in 0..numColumns - 1) {
if (coluna[posicao].toInt() > 0) {
array[posicao] = coluna[posicao].toInt()
}
}
return array
}else{
val array:Array<Int?> =Array(numLines,{null})
val linha=linhas[1].split(",")
for (posicao in 0..numLines - 1) {
if (linha[posicao].toInt() > 0) {
array[posicao] = linha[posicao].toInt()
}
}
return array
}
}
fun criaLegendaContadoresHorizontal(contadoresHorizontal: Array<Int?>): String {
var contadorshorizontalstr = ""
val posicao = 0
for (posicao in 0..[Link] - 1) {
if (contadoresHorizontal[posicao] == null) {
contadoresHorizontal[posicao]=0//aqui
contadorshorizontalstr =
contadorshorizontalstr+contadoresHorizontal[posicao]+" "
} else if(posicao==[Link]-1) {
contadorshorizontalstr =
contadorshorizontalstr+contadoresHorizontal[posicao].toString()
}else{
contadorshorizontalstr =contadorshorizontalstr+
contadoresHorizontal[posicao].toString()+" "
}
}
return contadorshorizontalstr
}
fun leTerrenoDoFicheiro(numLines: Int, numColumns: Int): Array<Array<String?>> {
val array: Array<Array<String?>> = Array(numLines, { Array(numColumns,
{ null }) })
val linhas = File("$numLines" + "x" + "$numColumns" + ".txt").readLines()
val coordenadas = ""
for (posicao in 2..[Link] - 1) {
val partes = linhas[posicao].split(",")
for (linha in 0..[Link] - 1) {
for (coluna in 0..array[linha].size - 1) {
if (coluna == partes[1].toInt() && linha == partes[0].toInt()) {
array[linha][coluna] = "A"
}
}
}
}
return array
}
fun processaCoordenadas(coordenadasStr: String?, numLines: Int, numColumns: Int):
Pair<Int,Int>?{
var par:Pair<Int,Int>?= Pair(0,0)
if (numLines > 0 || numColumns > 0){
if (coordenadasStr != null) {
if ([Link] == 3){
if (coordenadasStr[1] == ',') {
if (coordenadasStr[0].toString().toInt() == numLines ||
validaTamanhoMapa(numLines,numColumns) == true) {
if (coordenadasStr[2].isUpperCase()){
if (coordenadasStr[2] in 'A'..'Z') {
if(par!=null){
var countColuna=0
for(letras in 'A'..'Z' ){
if(letras<coordenadasStr[2]){
countColuna++
}
}
par=Pair(coordenadasStr[0].toString().toInt()-
1,countColuna)
return par
}
}
}
}
}
}
}
}
return null
}
fun criaTerreno(terreno: Array<Array<String?>>, contadoresVerticais: Array<Int?>?,
contadoresHorizontais: Array<Int?>?,
mostraLegendaHorizontal: Boolean=true, mostraLegendaVertical:
Boolean=true): String {
var mapa = ""
var linha = 0
var contaverticais = ""
if (contadoresVerticais != null) {
for (count in 0 until [Link]){
if (criaLegendaContadoresHorizontal(contadoresVerticais )!=
contadoresVerticais[count].toString()){
if (contadoresVerticais[count] == 0){
contaverticais += ""
}
contaverticais += " "
}
else{
contaverticais +=
criaLegendaContadoresHorizontal(contadoresVerticais)
}
}
mapa += contaverticais + "\n"
}
else{
mapa += " "
}
if (mostraLegendaHorizontal && mostraLegendaVertical) {
if(contadoresVerticais!=null) {
mapa += " " +
criaLegendaContadoresHorizontal(contadoresVerticais!!) + "\n"//aqui
}
mapa += " " + "| " + criaLegendaHorizontal(terreno[1].size) +
"\n"//aqui
while (linha <= [Link] - 1) {
var linhastr=criaLegendaVertical(linha)
if (contadoresHorizontais != null){
if (contadoresHorizontais[linha].toString() != "null"){
mapa += contadoresHorizontais[linha].toString()
}
else{
mapa += " "
}
}
mapa += " " + "$linhastr |"//aqui
for (coluna in 0 until terreno[linha].size) {
if (terreno[linha][coluna] != null) {
if (terreno[linha][coluna] == "A") {
terreno[linha][coluna] = "△"
} else {
terreno[linha][coluna] += ""
}
} else {
terreno[linha][coluna] = ""
}
if (coluna != terreno[linha].size - 1) {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]} |"
} else if (terreno[linha][coluna] == "T") {
mapa += " ${terreno[linha][coluna]} |"
}
else {
mapa += " ${terreno[linha][coluna]} |"
}
} else {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]}"
} else if (terreno[linha][coluna] == "T") {
mapa += " ${terreno[linha][coluna]}"
}
else {
mapa += " ${terreno[linha][coluna]} "
}
}
}
if (linha == [Link] - 1) {
mapa += ""
} else {
mapa += "\n"
}
linha++
}
}
if (!mostraLegendaHorizontal && mostraLegendaVertical) {
while (linha <= [Link] - 1) {
var linhastr=criaLegendaVertical(linha)
if (contadoresHorizontais != null){
if (contadoresHorizontais[linha].toString() != "null"){
mapa += contadoresHorizontais[linha].toString()
}
else{
mapa += " "
}
}
if (linha == 0){
mapa += " " + "${linhastr} |"
}
else{
mapa += " " + "${linhastr} |"
}
for (coluna in 0 until terreno[linha].size) {
if (terreno[linha][coluna] != null) {
if (terreno[linha][coluna] == "A") {
terreno[linha][coluna] = "△"
} else {
terreno[linha][coluna] += ""
}
} else {
terreno[linha][coluna] = ""
}
if (coluna != terreno[linha].size - 1) {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]} |"
} else if (terreno[linha][coluna] == "T") {
mapa += " ${terreno[linha][coluna]} |"
}
else {
mapa += " ${terreno[linha][coluna]} |"
}
} else {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]}"
} else {
mapa += " ${terreno[linha][coluna]} "
}
}
}
if (linha == [Link] - 1) {
mapa += ""
} else {
mapa += "\n"
}
linha++
}
}
if (mostraLegendaHorizontal && !mostraLegendaVertical) {
mapa += " " + "| " + criaLegendaHorizontal(terreno[1].size) + "\n"
while (linha <= [Link] - 1) {
if (contadoresHorizontais != null){
if (contadoresHorizontais[linha].toString() != "null"){
mapa += contadoresHorizontais[linha].toString()
}
else{
mapa += " "
}
}
if (linha == 0){
mapa += " "+"|"
}
else{
mapa += " "+"|"
}
for (coluna in 0 until terreno[linha].size) {
if (terreno[linha][coluna] != null) {
if (terreno[linha][coluna] == "A") {
terreno[linha][coluna] = "△"
} else {
terreno[linha][coluna] += ""
}
} else {
terreno[linha][coluna] = ""
}
if (coluna != terreno[linha].size - 1) {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]} |"
} else if (terreno[linha][coluna] == "T") {
mapa += " ${terreno[linha][coluna]} |"
}
else {
mapa += " ${terreno[linha][coluna]} |"
}
} else {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]}"
} else {
mapa += " ${terreno[linha][coluna]} "
}
}
}
if (linha == [Link] - 1) {
mapa += ""
} else {
mapa += "\n"
}
linha++
}
}
if (!mostraLegendaHorizontal && !mostraLegendaVertical) {
while (linha <= [Link] - 1) {
if (contadoresHorizontais != null){
if (contadoresHorizontais[linha].toString() != "null"){
mapa += contadoresHorizontais[linha].toString()
}
else{
mapa += " "
}
}
if (linha == 0){
mapa += " "+ "|"
}
else{
mapa += " "+ " |"
}
for (coluna in 0 until terreno[linha].size) {
if (terreno[linha][coluna] != null) {
if (terreno[linha][coluna] == "A") {
terreno[linha][coluna] = "△"
} else {
terreno[linha][coluna] += ""
}
} else {
terreno[linha][coluna] = ""
}
if (coluna != terreno[linha].size - 1) {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]} |"
} else if (terreno[linha][coluna] == "T") {
mapa += " ${terreno[linha][coluna]} |"
}
else{
mapa += " ${terreno[linha][coluna]} |"
}
} else {
if (terreno[linha][coluna] == "△") {
mapa += " ${terreno[linha][coluna]}"
} else {
mapa += " ${terreno[linha][coluna]} "
}
}
}
if (linha == [Link] - 1) {
mapa += ""
} else {
mapa += "\n"
}
linha++
}
return mapa
}
fun temArvoreAdjacente(terreno: Array<Array<String?>>, coords: Pair<Int, Int>) :
Boolean {
for (linha in 0 until [Link]) {
for (coluna in 0 until terreno[linha].size) {
if ((linha==[Link] && (coluna == [Link] - 1 || coluna ==
[Link] + 1))||
(coluna==[Link]&&(linha == [Link] - 1 || linha ==
[Link] + 1))) {
if (terreno[linha][coluna] == "A") {
return true
}
}
}
return false
}
fun temTendaAdjacente(terreno: Array<Array<String?>>, coords: Pair<Int, Int>) :
Boolean{
for (linha in 0 until [Link]) {
for (coluna in 0 until terreno[linha].size) {
if ((linha==[Link] && (coluna == [Link] - 1 || coluna ==
[Link] + 1))||
(coluna==[Link]&&(linha == [Link] - 1 || linha ==
[Link] + 1))||
((linha==[Link]-1 || linha==[Link]+1) &&
(coluna == [Link] - 1 || coluna == [Link] +
1))) {
if (terreno[linha][coluna] == "T") {
return true
}
}
}
return false
}
fun contaTendasColuna(terreno:Array<Array<String?>>, coluna: Int): Int{
var countTendas=0
for(linha in 0..[Link]-1){
if(coluna in 0..terreno[linha].size-1){
if(coluna==terreno[linha].size-1){
return -1
}
if(terreno[linha][coluna]=="T"){
countTendas++
return countTendas
}
}
}
return 0
}
fun contaTendasLinha(terreno: Array<Array<String?>>, linha: Int):Int{
if(linha in 0..[Link]-1){
var countTendas=0
for(coluna in 0..terreno[linha].size-1){
if(terreno[linha][coluna]=="T"){
countTendas++
}
}
return countTendas
}
return 0
}
fun colocaTenda(terreno: Array<Array<String?>>, coords: Pair<Int, Int>): Boolean {
for(linha in 0..[Link]-1){
for(coluna in 0..terreno[linha].size-1){
if(linha==[Link] && coluna==[Link]){
if(terreno[linha][coluna]==null){
if(temArvoreAdjacente(terreno,coords)==true){
if(temTendaAdjacente(terreno, coords)==false){
terreno[linha][coluna]="T"
return true
}
}
}else{
terreno[linha][coluna]=""
}
}
}
}
return false
}
fun terminouJogo(terreno: Array<Array<String?>>, contadoresVerticais: Array<Int?>,
contadoresHorizontais: Array<Int?>): Boolean{
for(linha in 0..[Link]-1){
for(coluna in 0..terreno[linha].size-1){
if(contaTendasLinha(terreno, linha)==contadoresHorizontais[linha]){
if(contaTendasColuna(terreno,coluna)==contadoresVerticais[coluna]){
return true
}
}
}
}
return false
}
fun main() {
do {
var opcaoInvalida = true
val invalido = "Resposta invalida"
val underage = "Menor de idade nao pode jogar"
println(criaMenu())
var menu = readln().toIntOrNull()
while (menu == null || menu != 0 && menu != 1) {
println("Opcao invalida")
println(criaMenu())
menu = readln().toIntOrNull()
}
if (menu == 1) {
println("Quantas linhas?")
var linhas = readln().toIntOrNull()
while (!(linhas != null && linhas > 0)) {
println(invalido)
println("Quantas linhas?")
linhas = readLine()?.toIntOrNull()
}
println("Quantas colunas?")
var colunas = readln().toIntOrNull()
while (!(colunas != null && colunas!! > 0) || !(colunas > 0)) {
println(invalido)
println("Quantas colunas?")
colunas = readln().toInt()
}
if (!validaTamanhoMapa(linhas, colunas)) {
println("Terreno invalido")
opcaoInvalida = false
}
if (linhas == 10 && colunas == 10) {
println("Qual a sua data de nascimento? (dd-mm-yyyy)")
var nascimento = readLine().toString()
if (validaDataNascimento(nascimento) == underage) {
println(validaDataNascimento(nascimento))
opcaoInvalida = false
}
while (validaDataNascimento(nascimento) == "Data invalida") {
println(validaDataNascimento(nascimento))
println("Qual a sua data de nascimento? (dd-mm-yyyy)")
nascimento = readln()
if (validaDataNascimento(nascimento) == underage) {
println(validaDataNascimento(nascimento))
opcaoInvalida = false
}
}
}
if ((opcaoInvalida)) {
do {
val terreno = leTerrenoDoFicheiro(linhas, colunas)
val contadoresHorizontais = leContadoresDoFicheiro(linhas,
colunas, false)
val contadoresVerticais = leContadoresDoFicheiro(linhas,
colunas, true)
println("")
println(
criaTerreno(
terreno,
contadoresVerticais,
contadoresHorizontais
)
)
println("Coordenadas da tenda? (ex: 1,B)")
var coordenadas = readln()
while (processaCoordenadas(coordenadas, linhas, colunas) ==
null) {
println(
"Coordenadas invalidas"
)
println("Coordenadas da tenda? (ex: 1,B)")
coordenadas = readln()
while (colocaTenda(terreno, processaCoordenadas(coordenadas,
linhas, colunas)!!) == false) {
println(
"Tenda nao pode ser colocada nestas coordenadas")
println("Coordenadas da tenda? (ex: 1,B)")
coordenadas = readln()
while (processaCoordenadas(coordenadas, linhas, colunas) ==
null) {
println(
"Coordenadas invalidas"
)
println("Coordenadas da tenda? (ex: 1,B)")
coordenadas = readln()
}
}
colocaTenda(terreno,processaCoordenadas(coordenadas,linhas,colunas)!!)==true
println(criaTerreno(terreno, contadoresVerticais,
contadoresHorizontais))
}while (!terminouJogo(terreno,
contadoresVerticais,contadoresHorizontais))
println("Parabens! Terminou o jogo!\n")
}
}
}while (menu == 1)
return
}