[R-br] quem é o autor de tanks.R ???
Rodrigo Coster
rcoster em gmail.com
Sexta Outubro 2 14:17:19 BRT 2015
Cleber,
Eu tinha pensado em publicar ele em outros locais, mas nunca consegui
finalizar ele 100% (tem um bug que não arrumei na hora de calcular o dano)
e a ideia acabou ficando de lado... ainda esses dias estava pensando em
fazer um código novo, mas me falta tempo :(
Marcos,
Tem também o pacote sudoku (
https://cran.r-project.org/web/packages/sudoku/index.html), que foi o
pacote que me motivou a fazer os meus. Coloquei meus outros códigos
parecidos (da época em que eu tinha tempo livre) no meu git, da uma olhada
lá depois: https://github.com/rcoster/Rfun (e sinta-se a vontade de postar
no seu blog)
[]'s
2015-10-02 12:09 GMT-03:00 Marcos Vital <marcosvital em gmail.com>:
> Caramba, gente, que legal! Adorei conhecer a função (e adoro esses
> joguinhos, hehehe).
>
> Vocês conhecem outros joguinhos pro R? Já vou ali conferir o pacote fun,
> que alguém mencionou, mas queria saber se existem outros.
> Pode parecer besteira, mas acho que essas coisas descontraídas ajudam a
> atrair pessoas para o R. Fora que usuários mais avançados podem se
> interessar em entender como foi feito, o que acaba sendo positivo também.
>
> Rodrigo, tudo bem divulgar por aí o seu código? Para dar crédito,
> colocamos apenas o seu nome ou você tem algum link (site pessoal, lattes,
> sei lá) que gostaria que acompanhasse? Eu tenho um blog onde divulgo coisas
> de R, e penso em fazer uma postagem sobre o seu "tanks" por lá, pode ser?
>
> Abraços!
>
> Marcos
>
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20151002/53f2560d/attachment.html>
-------------- Próxima Parte ----------
jv <- function() {
tecla <- function(a,b) { return() }
clica <- function(a,b,c) {
checa <- function() {
jo <- cbind(matrix(1:9,ncol=3),matrix(1:9,ncol=3,byrow=T),c(1,5,9),c(7,5,3))
for (j in 1:8) {
if (sum(jogo[jo[,j]]) %in% c(3,12)) {
m <- jo[c(1,3),j]
x <- as.integer((m-1)/3)+.5
y <- 2.5 - ((m-1) %% 3)
lines(x,y,col='red',lwd=4)
return(TRUE)
}
}
return(FALSE)
}
m <- sum((as.integer(c(b,1-c)*3)+c(0,1))*c(3,1))
if (jogo[m] == 0) {
jogo[m] <<- 4
x <- as.integer((m-1)/3)+.5
y <- 2.5 - ((m-1) %% 3)
points(x,y,pch='X')
if ((any(jogo == 0)) && (checa() == FALSE)) {
m <- joga(jogo)
jogo[m] <<- 1
x <- as.integer((m-1)/3)+.5
y <- 2.5 - ((m-1) %% 3)
points(x,y,pch='O')
checa()
}
if ((checa() == TRUE) || (all(jogo != 0))) { return('ok') }
}
}
joga <- function(jogo) {
jo <- cbind(matrix(1:9,ncol=3),matrix(1:9,ncol=3,byrow=T),c(1,5,9),c(7,5,3))
pontos <- rbind(c(8,2),c(4,1),c(0,0))
marca <- c(rep(3,4),1,rep(3,4))/2
for (i in 1:3) {
for (j in 1:8) {
if (sum(jogo[jo[,j]]) %in% pontos[i,]) {
marca[jo[,j]] <- marca[jo[,j]] * (8 - 2 * i) * ifelse(sum(jogo[jo[,j]]) == 8,10,1) * ifelse(sum(jogo[jo[,j]]) == 2,20,1)
}
}
}
marca[jogo != 0] <- 0
print(matrix(marca,3))
out <- which.max(marca)
if (sum(marca == max(marca)) > 1) { out <- sample((1:9)[marca == max(marca)],1) }
return(out)
}
par(mar=c(0,0,0,0),cex=5)
plot(1,xlim=c(0,3),ylim=c(0,3),type='n',xlab='',ylab='')
lines(c(2,2),c(0,3))
lines(c(1,1),c(0,3))
lines(c(0,3),c(1,1))
lines(c(0,3),c(2,2))
jogo <- matrix(0,3,3)
if (runif(1) < .5) {
# m <- sample(c(1,3,7,9),1)
m <- joga(jogo)
jogo[m] <- 1
x <- as.integer((m-1)/3)+.5
y <- 2.5 - ((m-1) %% 3)
points(x,y,pch='O')
}
a <- getGraphicsEvent("Tic-Tac-Toe :)", onMouseUp = clica, onKeybd = tecla)
return(invisible())
}
jv()
-------------- Próxima Parte ----------
###
# cm(c(casas horizontais,casa verticais,minas)) ou cm(l), onde l pode 1, 2 ou 3
# cm(c(15,15,20))
###
cm <- function(l=2) {
joga <- function(b, x, y) {
if ((!exists('m') || !exists('jo') || !exists('c')) || (all(jo == c))) { return(' ') }
p <- (ceiling((x)*l[1])-1)*l[2]+ceiling((y)*l[2])
n <- pi
a <- 0
if (b == 0) {
while (length(p) > 0) {
a <- a+1
pa <- p[1]
p <- p[-1]
if ((pa > 0) && (pa <= length(m))) {
if ((jo[pa] == 10) || ((jo[pa] == 11) && (a == 1))) {
n <- c[pa]
if (n == 0) {
pt <- c(ceiling(pa/l[2]),(pa -1) %% l[2] +1) + cbind(c(-1,-1),c(-1,0),c(-1,1),c(0,-1),c(0,1),c(1,-1),c(1,0),c(1,1))
v <- !(pt[1,] < 1 | pt[1,] > l[1] | pt[2,] < 1 | pt[2,] > l[2])
pos <- 1:8
if (!any(v)) { pos <- -((1:8)[v]) }
pt <- pt[,v]
p <- c(p,(pt[1,] -1) * l[2] + pt[2,])
}
if (n == 9) {
jo <<- c
}
jo[pa] <<- n
}
}
}
}
else if ((b == 2) && (jo[p] > 9)) {
jo[p] <<- ifelse(jo[p] == 10,11,10)
}
p1 <- which(jo == 10,arr.ind=T)
rect(p1[,2]-1,p1[,1]-1,p1[,2],p1[,1],col='white')
p2 <- which(jo == 11 | jo == 9,arr.ind=T)
rect(p2[,2]-1,p2[,1]-1,p2[,2],p2[,1],col='red')
p3 <- which(jo < 9,arr.ind=T)
rect(p3[,2]-1,p3[,1]-1,p3[,2],p3[,1],col='gray')
p4 <- which(jo < 9 & jo > 0,arr.ind=T)
text(p4[,2]-.5,p4[,1]-.5,jo[which(jo < 9 & jo > 0)],col=rainbow(8)[jo[which(jo < 9 & jo > 0)]],cex=2)
if (n == 9) { cat('Voce perdeu! :(\n') ; jo <<- c ; return() }
jot <- jo
jot[jo == 11] <- 9
if (all(jot == c)) { cat('Voce ganhou! \\o/\n') ; jo <<- c }
return()
}
l <- floor(l)
if (length(l) == 1) {
if (l == 1) { l <- c(9,9,10) }
else if (l == 2) { l <- c(16,16,40) }
else if (l == 3) { l <- c(30,16,90) }
else { stop('l deve ser um vetor de comprimento 3, ou igual � 1, 2 ou 3') }
}
if (l[1] * l[2] < l[3]) { stop('Problema no tamanho do tabuleiro: Muito pequeno para o n�mero de minas desejado') }
par(mar=rep(0,4),xaxs='i',yaxs='i')
plot(pi,pi,xlim=c(0,l[1]),ylim=c(0,l[2]),type='n')
text(l[1]/2,l[2]/2,'Pressione espa�o sempre que quiser come�ar um jogo novo, \nou clique no tabuleiro ap�s perder para recome�ar.\n\n\nPatrocinado por:\n CEEE')
while (getGraphicsEvent("Campo Minado",onMouseDown = joga,onKeybd = function(a) return(a)) == " ") {
plot(pi,pi,xlim=c(0,l[1]),ylim=c(0,l[2]),type='n')
abline(h = 2:l[2] -1)
abline(v = 2:l[1] -1)
m <- matrix(0,l[2],l[1])
jo <- matrix(10,l[2],l[1])
m[sample(1:(l[1]*l[2]),l[3])] <- 1
c <- rbind(m[-1,],0) + rbind(0,m[-l[2],]) + cbind(m[,-1],0) + cbind(0,m[,-l[1]]) + cbind(rbind(m[-1,],0)[,-1],0) + cbind(0,rbind(m[-1,],0)[,-l[1]]) + cbind(rbind(0,m[-l[2],])[,-1],0) + cbind(0,rbind(0,m[-l[2],])[,-l[1]])
c[m == 1] <- 9
}
}
cm(2)
-------------- Próxima Parte ----------
##
# jogo(l), onde l é 1 ou 2 (dificuldade)
# jogo(2)
##
jogo <- function(lvl=1) {
## Rotinas de apoio
# Checa se o movimento é valido
pode <- function(tabul,x,y,jo) {
p <- FALSE
for (i in 1:3-2) {
for (j in 1:3-2) {
if ((x+i < 11) && (x+i > 0) && (y+j < 11) && (y+j > 0)) {
if (tabul[x+i,y+j] %in% 1:2) { p <- TRUE }
}
}
}
if (tabul[x,y] %in% 1:2) { p <- FALSE }
if (p == T) {
p <- sum(move(x,y,jo) == jo) - 1 > sum(tabul == jo)
}
return(p)
}
# IA
joga <- function() {
mv <- 1
r <- 0
if (lvl == 1) {
for (i in 1:10) {
for (j in 1:10) {
if (pode(m,i,j,1)) {
t <- move(i,j,1)
if (sum(t == 1) > r) {
mv <- c(i,j)
r <- sum(t == 1)
}
}
}
}
}
if (lvl == 2) {
for (i in 1:10) {
for (j in 1:10) {
if (pode(m,i,j,1)) {
r1 <- 0
t <- move(i,j,1,m)
for (k in 1:10) {
for (l in 1:10) {
if (pode(t,k,l,2)) {
n <- move(k,l,2,t)
if (sum(n == 2) > r1) {
r1 <- sum(n == 2)
}
}
}
}
if ((sum(t == 1) - r1 > r) || (length(mv) == 1)) {
mv <- c(i,j)
r <- sum(t == 1) - r1
}
}
}
}
}
m <<- move(mv[1],mv[2],1)
}
# Evento do mouse
clica <- function(b, x, y) {
x <- as.integer(x*10)+1
y <- as.integer((1-y)*10+1)
f <- 0
if (pode(m,y,x,2) == TRUE) {
m <<- move(y,x,2)
f <- plot(m)
joga <- 1
while (((poss(1)) && (joga == 1)) || ((!poss(2)) && (poss(1)))) { joga() ; f <- plot(m) ; joga <- 2 }
}
if ((f == 1) || (!poss(2))) { return('dtm') }
return()
}
# Plota
plot.tabul <- function(tabul) {
plot(0:10,type='n')
for (i in 1:10) {
for (j in 1:10) {
rect(j,10-i,j+1,11-i,col=c('white','blue','red')[tabul[i,j] + 1])
}
}
if (!any(tabul == 0)) { return(1) }
return(0)
}
# Movimento
move <- function(x,y,p,tabul=m) {
out <- tabul
pt2 <- matrix(c(x,y),ncol=2)
for (i in c(1,0,-1)) {
for (j in c(1,0,-1)) {
pt <- c(x,y)
pt1 <- vector()
cont <- 1
while ((max(pt) <= 10) && (min(pt) >= 1) && (cont == 1)) {
pt <- pt + c(i,j)
pt1 <- rbind(pt1,pt)
if (((i == 0) && (j == 0)) || ((any(pt > 10)) || (any(pt < 1)))) { cont <- 2 }
else if (tabul[pt[1],pt[2]] == p) { pt2 <- rbind(pt2,pt1) ; cont <- 2 }
else if (tabul[pt[1],pt[2]] == 0) { cont <- 2 }
}
}
}
for (k in 1:nrow(pt2)) {
out[pt2[k,1],pt2[k,2]] <- p
}
return(out)
}
# Confere se há jogadas possiveis
poss <- function(jo,tabul=m) {
for (i in 1:10) {
for (j in 1:10) {
if (pode(tabul,i,j,jo) == TRUE) { return(T) }
}
}
return(F)
}
## Jogo
par(mar=rep(0,4),xaxs='i',yaxs='i')
m <- matrix(0,10,10)
class(m) <- 'tabul'
for (i in 5:6) {
for (j in 5:6) {
m[i,j] <- ((i + j -1) %% 2 + 1)
}
}
plot(m)
if (runif(1) > .5) { Sys.sleep(.5) ; joga() ; plot(m) }
getGraphicsEvent('Reversi',onMouseDown=clica)
cat('Fim de jogo! Resultado:\n Azul (PC):',sum(m == 1),'\n Vermelho (você):',sum(m == 2),'\n') ; if (any(m == 0)) { cat(' Branco:',sum(m==0),'\n') } ;
return(invisible())
}
jogo(2)
Mais detalhes sobre a lista de discussão R-br