##### Gazela saltitante - Jogo da sinalizacao honesta ##### #Esta funcao foi criada para executar o jogo da gazela saltitante, utilizado na disciplina #de comportamento animal (pelo menos em 2019) para que os alunos compreendessem, de uma forma #mais pratica, como funciona o modelo de sinalizacao honesta de qualidade. Ela pode ser executada #uma vez so (quando simular=FALSE), para que o aluno tenha acesso a perspectiva de um individuo ou #(se simular=TRUE) quantas vezes o usuario quiser (default=100), para ver como o modelo se comporta #na populacao. Segue o codigo: #Cria a funcao gazela.saltitante com 3 argumentos (que possuem um default mas podem ser alterados pelo usuario) gazela.saltitante <- function(simular=TRUE, repetir= 100, rodadas=15) { #Controla o fluxo da funcao de acordo com o valor logico atribuido ao argumento 'simular' pelo usuario, realizando as seguintes tarefas se simular==FALSE if(simular==FALSE) { #Cria o data.frame 'g' contendo: #os individuos 1 e 2 (gazelas) e NA (leao), #um valor de vigor para cada gazela atraves de um sample de 2 valores entre 1:10 sem repeticao e NA para o leao #Cria a coluna classe, mas ainda nao atribui valores #Nomeia as linhas do data.frame como G1(gazela 1),G2(gazela 2) e L(leao) g <- data.frame(ind = c(1,2,NA),vigor = c((sample(1:10,2)),NA), classe = NA, row.names = c("G1","G2","L")) #Ordena as linhas do data.frame de acordo com o valor do vigor g <- g[order(g$vigor),] #Atribui a coluna 'classe' os valores fr(fraca - gazela com menor vigor), fo(forte - gazela com maior vigor) e deixa leao sem valor g$classe <- c("fr","fo", "NA") #Cria o objeto fr, de valor igual ao numero do individuo na primeira linha do data.frame (coluna ind) fr <- g$ind[1] #Cria o objeto fo, de valor igual ao numero do individuo na segunda linha do data.frame (coluna ind) fo <- g$ind[2] #Cria a coluna 'salto', onde o valor do salto da gazela fraca e um valor entre 3:8 e o da forte e entre 5:10. O leao nao salta. g$salto <- c(sample(3:8,1),sample(5:10,1), 0) #Informa aos jogadores o quanto a G1 saltou, sendo esta uma pista para o leao escolher a gazela cat(paste("A gazela 1 saltou", g$salto[which(g$ind==1)])) #Informa aos jogadores o quanto a G2 saltou, sendo esta uma pista para o leao escolher a gazela cat(paste("\nA gazela 2 saltou", g$salto[which(g$ind==2)])) #Cria a funcao interativa 'presas' para possibilitar que o leao escolha sua presa presas <- function() { #Cria o objeto 'escolha' para mostrar na tela a mensagem para o leao e aguardar a escolha do jogador no console do R escolha <- readline("Leao, escolha sua presa: ") #Controla o fluxo para prosseguir de acordo com a escolha feita pelo jogador (nesta linha, se a escolha for a G1) if (substr(escolha, 1, 1) == 1) #Informa ao jogadores a escolha feita pelo leao (nesta linha, se a escolha for a G1) cat("O leao escolheu a gazela 1!\nGazela 2, voce escapou de virar jantar de leao.\nGazela 1, run for your life! \n ") #Controla o fluxo para prosseguir de acordo com a escolha feita pelo jogador (nesta linha, se a escolha for a G2) else #Informa ao jogadores a escolha feita pelo leao (nesta linha, se a escolha for a G2) cat("O leao escolheu a gazela 2!\nGazela 1, voce escapou de virar jantar de leao.\nGazela 2, run for your life! \n ") #A funcao 'presas' retorna a escolha feita pelo leao return(substr(escolha, 1, 1)) } #Cria o objeto 'presa' para guardar o resultado da funcao 'presas' transformado em um objeto de classe numerica presa <- as.numeric(presas()) #Cria o vetor pos.fo vazio para guardar as posicoes da gazela forte pos.fo <- NA #Atribui o valor 5 a primeira posicao do vetor da gazela forte, pois esta comeca o jogo 5 posicoes a frente do leao pos.fo[1] <- 5 #Cria o vetor pos.fr vazio para guardar as posicoes da gazela fraca pos.fr <- NA #Atribui o valor 5 a primeira posicao do vetor da gazela fraca, pois esta comeca o jogo 5 posicoes a frente do leao pos.fr[1] <- 5 #Cria o vetor pos.l vazio para guardar as posicoes do leao pos.l <- NA #Atribui o valor 0 a primeira posicao do vetor do leao, pois este comeca o jogo na posicao 0 pos.l[1] <- 0 #Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela forte) if(presa==fo) { #Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas for(r in 2:rodadas) { #Realiza a jogada da gazela forte atraves de um sample de 5:10 e guarda no objeto pos.fo criado anteriormente pos.fo[r] = pos.fo[r-1]+sample(5:10,1) #Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente pos.l[r] = pos.l[r-1]+sample(5:10,1) #Mantem a gazela fraca na posicao 5 ja que ela nao foi escolhida pos.fr[r] = 5 #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela) if(pos.l[r]>=pos.fo[r]) { #Informa aos jogadores que o leao predou a gazela message("\nGazela, voce foi predada, sashay away!\n ") #Guarda no objeto 'txt' qual foi a gazela predada e em que rodada isso aconteceu txt <- paste("A gazela",presa,", que era forte, foi predada na rodada", r) #Quebra o loop caso a gazela seja predada break() } #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario) if(r==rodadas) #Guarda no objeto 'txt' que a gazela forte, que era o individuo X escapou txt <- paste("A gazela",presa,", que era forte, escapou!") } } #Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela fraca) if(presa==fr) { #Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas for(r in 2:rodadas) { #Realiza a jogada da gazela fraca atraves de um sample de 2:7 e guarda no objeto pos.fr criado anteriormente pos.fr[r] = pos.fr[r-1]+sample(2:7,1) #Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente pos.l[r] = pos.l[r-1]+sample(5:10,1) #Mantem a gazela forte na posicao 5 ja que ela nao foi escolhida pos.fo[r] = 5 #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela) if(pos.l[r]>=pos.fr[r]) { #Informa aos jogadores que o leao predou a gazela message("\nGazela, voce foi predada, sashay away! \n ") #Guarda no objeto 'txt' qual foi a gazela predada e em que rodada isso aconteceu txt <- paste("A gazela",presa,", que era fraca, foi predada na rodada", r) #Quebra o loop caso a gazela seja predada break() } #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario) if(r==rodadas) #Guarda no objeto 'txt' que a gazela fraca, que era o individuo X escapou txt <- paste("A gazela",presa,", que era fraca, escapou!") } } #Cria a matriz 'pos' com os as posicoes de pos.fo, pos.fr e pos.l, com 3 linhas e o tanto de colunas correspondente ao ultimo valor que r assumiu no for, #preenchendo a matriz por coluna e deixando as linhas sem nome, enquanto as colunas sao nomeadas como rodadas de 1 a r pos <- matrix(data=c(pos.fr,pos.fo,pos.l),nrow=3,ncol=r,byrow = TRUE, dimnames = list(NULL,paste("Rodada",1:r))) #Cria o objeto 'data.final' juntando o data.frame 'g' e a matrix 'pos' data.final <- cbind(g,pos) #Adiciona a coluna 'gasto energetico', onde o gasto das gazelas corresponde a posicao da ultima rodada menos 5 (posicao inicial delas) #somado ao valor do salto. Ja o gasto do leao corresponde ao valor encontrado na ultima rodada data.final$Gasto_energetico <- c((data.final[1:2,ncol(data.final)]-5+data.final$salto[1:2]), data.final[3,ncol(data.final)]) #Cria o vetor 'resultado' que guarda uma lista com o data.frame 'data.final' e o objeto 'txt' resultado <- list(data.final, txt) #Se simular=TRUE, a funcao gazela.saltitante ira retornar a lista 'resultado' return(resultado) } #Controla o fluxo da funcao de acordo com o valor logico atribuido ao argumento 'simular' pelo usuario, realizando as seguintes tarefas se simular==TRUE if(simular==TRUE) { #Cria uma matriz 2x2 vazia para guardar os resultados dos loops a seguir, onde cada linha e uma gazela (fraca ou forte) e cada coluna e o seu status (escapou ou morreu) status <- matrix(data=0,2,2,dimnames = list(c("Fraca","Forte"),c("Escapou","Morreu"))) #Cria um loop para repetir o jogo tantas vezes quanto determinado pelo usuario no argumento repetir for(i in 1:repetir) { #Cria o objeto 'salto' para guardar o salto da gazela fraca (de 3:8) e da forte (de 5:10), nesta ordem salto <- c(sample(3:8,1),sample(5:10,1)) #Controla o fluxo para decidir qual gazela o leao ira perseguir if(salto[1]>=5&&salto[2]<=8) { #Se o salto de ambas variar entre 5 e 8, a presa sera decidida com um sample, com 50% de chances pra cada presa <- sample(1:2,1) } #Se o salto da fraca (1) for menor que 5, o leao escolhe a fraca como presa if(salto[1]<5) { #A presa escolhida e a 1 presa <- 1 } #Se o salto da forte (2) for maior que 8, o leao escolhe a fraca como presa if(salto[2]>8) { #A presa escolhida e a 1 presa <- 1 } #Cria o vetor pos.fo vazio para guardar as posicoes da gazela forte pos.fo <- NA #Atribui o valor 5 a primeira posicao do vetor da gazela forte, pois esta comeca o jogo 5 posicoes a frente do leao pos.fo[1] <- 5 #Cria o vetor pos.fr vazio para guardar as posicoes da gazela fraca pos.fr <- NA #Atribui o valor 5 a primeira posicao do vetor da gazela fraca, pois esta comeca o jogo 5 posicoes a frente do leao pos.fr[1] <- 5 #Cria o vetor pos.l vazio para guardar as posicoes do leao pos.l <- NA #Atribui o valor 0 a primeira posicao do vetor do leao, pois este comeca o jogo na posicao 0 pos.l[1] <- 0 #Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela fraca) if(presa==1) { #Soma um ao valor de gazelas fortes que escaparam na matriz 'status', ja que a escolhida foi a fraca status[2,1] <- status[2,1]+1 #Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas for(r in 2:rodadas) { #Realiza a jogada da gazela fraca atraves de um sample de 2:7 e guarda no objeto pos.fr criado anteriormente pos.fr[r] = pos.fr[r-1]+sample(2:7,1) #Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente pos.l[r] = pos.l[r-1]+sample(5:10,1) #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela) if(pos.l[r]>=pos.fr[r]) { #Soma um ao valor de gazelas fracas predadas na matriz 'status' status[1,2]<-status[1,2]+1 #Quebra o loop caso a gazela seja predada break() } #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario) if(r==rodadas) #Soma um ao valor de gazelas fracas que escaparam na matriz 'status' status[1,1]<-status[1,1]+1 } } #Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela forte) if(presa==2) { #Soma um ao valor de gazelas fracas que escaparam na matriz 'status', ja que a escolhida foi a forte status[1,1] <- status[1,1]+1 #Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas for(r in 2:rodadas) { #Realiza a jogada da gazela forte atraves de um sample de 5:10 e guarda no objeto pos.fo criado anteriormente pos.fo[r] = pos.fo[r-1]+sample(5:10,1) #Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente pos.l[r] = pos.l[r-1]+sample(5:10,1) #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela) if(pos.l[r]>=pos.fo[r]) { #Soma um ao valor de gazelas fortes predadas status[2,2]<-status[2,2]+1 #Quebra o loop caso a gazela seja predada break() } #Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario) if(r==rodadas) #Soma um ao valor de gazelas fortes que escaparam na matriz 'status' status[2,1]<-status[2,1]+1 } } #Plota um barplot da matriz 'status', com colunas lado a lado, separadas em gazela forte e gazela fraca, com a barra da cor verde sendo as gazelas que escaparam e vermelha as que morreram, #posiciona a legenda, nomeia o eixo Y de frequencia, limitada pelo argumento 'repetir'da funcao e coloca os valores do eixo na horizontal barplot(t(status),beside = T, names.arg = c("Gazela fraca","Gazela forte"), legend.text=T, args.legend = list(x = "topright", bty = "n", inset=c(-0.02,-0.02)), col = c("green","red"), ylab = "Frequencia", ylim = c(0,repetir), las=1) } } }