R语言写2048游戏实例讲解

时间:2021-05-20

2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束。

编程时并未查看原作者代码,不喜勿喷。

程序结构如下:

R语言代码:

#!/usr/bin/Rscript#画背景draw_bg <- function(){ plot(0,0,xlim=c(0,0.8),ylim=c(0,0.8),type='n',xaxs="i", yaxs="i") for (i in c(1:4)){ for (j in c(1:4)){ points(0.1+0.2*(i-1),0.9-0.2*(j),col="gray",pch=15,cex=16)}}}#画数字矩阵draw_num <- function(){for (i in c(1:4)){ for (j in c(1:4)){ if (e$m[i,j] != 0){ text(0.1+(j-1)*0.2,0.7-(i-1)*0.2,font=2,family="Arial",label=e$m[i,j],cex=2) }}}}#初次运行游戏,生成随机矩阵init <- function(){e$stage=1mt <- matrix(c(sample(c(2,4),1),rep(0,15)),nrow=4)e$m <- mt[sample(4),sample(4)]draw_bg()draw_num()}#移除矩阵数字间的0rm_zero <- function(){if (e$x==0){if (e$dir=="up"){ for (c in 1:4) e$m[,c] <- c(e$m[,c][which(e$m[,c]!=0)],rep(0,4-length(e$m[,c][which(e$m[,c]!=0)])))}if (e$dir=="down"){ for (c in 1:4) e$m[,c] <- c(rep(0,4-length(e$m[,c][which(e$m[,c]!=0)])),e$m[,c][which(e$m[,c]!=0)])}if (e$dir=="left"){ for (r in 1:4) e$m[r,] <- c(e$m[r,][which(e$m[r,]!=0)],rep(0,4-length(e$m[r,][which(e$m[r,]!=0)])))}if (e$dir=="right"){ for (r in 1:4) e$m[r,] <- c(rep(0,4-length(e$m[r,][which(e$m[r,]!=0)])),e$m[r,][which(e$m[r,]!=0)])}}else{if (e$dir=="up"){ c <- e$x e$m[,c] <- c(e$m[,c][which(e$m[,c]!=0)],rep(0,4-length(e$m[,c][which(e$m[,c]!=0)])))}if (e$dir=="down"){ c <- e$x e$m[,c] <- c(rep(0,4-length(e$m[,c][which(e$m[,c]!=0)])),e$m[,c][which(e$m[,c]!=0)])}if (e$dir=="left"){ r <- e$x e$m[r,] <- c(e$m[r,][which(e$m[r,]!=0)],rep(0,4-length(e$m[r,][which(e$m[r,]!=0)])))}if (e$dir=="right"){ r <- e$x e$m[r,] <- c(rep(0,4-length(e$m[r,][which(e$m[r,]!=0)])),e$m[r,][which(e$m[r,]!=0)])}}}#在空白处添加随机数字new_mt <- function(){e$m[sample(which(e$m==0),1)] <- sample(c(2,4),1)}#检查是否游戏失败fail <- function(){if (length(e$m[which(e$m==0)])==0){ e$x=0 for (r in 1:3){ for (c in 1:3){ if (e$m[r,c] == e$m[r,c+1] | e$m[r,c] == e$m[r+1,c]){ e$x=1 } } } if (e$x==0){ stage2()}}}#游戏中stage1 <- function(){e$stage <- 1e$x <- 0rm_zero()if (e$dir=="left"){ i=1 while (i<=4){ if (e$m[i,1] != 0 & e$m[i,1]==e$m[i,2] & e$m[i,1]==e$m[i,3] & e$m[i,1]==e$m[i,4]){ e$m[i,]=rep(c(2*e$m[i,1],0),each=2) e$x=1 } else if (e$m[i,2]!=0 & e$m[i,3] != 0 & e$m[i,2]==e$m[i,1] & e$m[i,3]==e$m[i,4]){ e$m[i,]=c(2*e$m[i,1],0,2*e$m[i,3],0) e$x=1 } else if (e$m[i,2] != 0 & e$m[i,2]==e$m[i,1]){ e$m[i,]=c(2*e$m[i,1],0,e$m[i,3],e$m[i,4]) e$x=1 } else if (e$m[i,3] != 0 & e$m[i,3]==e$m[i,4]){ e$m[i,]=c(e$m[i,1],e$m[i,2],2*e$m[i,3],0) e$x=1 } else if (e$m[i,2] != 0 & e$m[i,2]==e$m[i,3]){ e$m[i,]=c(e$m[i,1],2*e$m[i,2],0,e$m[i,4]) e$x=1 } i=i+1 } rm_zero() new_mt() draw_bg() draw_num() fail()}if (e$dir=="right"){ i=1 while (i<=4){ if (e$m[i,1] != 0 & e$m[i,1]==e$m[i,2] & e$m[i,1]==e$m[i,3] & e$m[i,1]==e$m[i,4]){ e$m[i,]=rep(c(0,2*e$m[i,1]),each=2) e$x=1 } else if (e$m[i,2] != 0 & e$m[i,3] != 0 & e$m[i,2]==e$m[i,1] & e$m[i,3]==e$m[i,4]){ e$m[i,]=c(0,2*e$m[i,1],0,2*e$m[i,3]) e$x=1 } else if (e$m[i,2] != 0 & e$m[i,2]==e$m[i,1]){ e$m[i,]=c(0,2*e$m[i,1],e$m[i,3],e$m[i,4]) e$x=1 } else if (e$m[i,3] != 0 & e$m[i,3]==e$m[i,4]){ e$m[i,]=c(e$m[i,1],e$m[i,2],0,2*e$m[i,3]) e$x=1 } else if (e$m[i,2] != 0 & e$m[i,2]==e$m[i,3]){ e$m[i,]=c(e$m[i,1],0,2*e$m[i,2],e$m[i,4]) e$x=1 } i=i+1 } rm_zero() new_mt() draw_bg() draw_num() fail()}if (e$dir=="up"){ j=1 while (j<=4){ if (e$m[1,j] != 0 & e$m[1,j]==e$m[2,j] & e$m[1,j]==e$m[3,j] & e$m[1,j]==e$m[4,j]){ e$m[,j]=rep(c(2*e$m[1,j],0),each=2) e$x=1 } else if (e$m[2,j] != 0 & e$m[3,j] != 0 & e$m[2,j]==e$m[1,j] & e$m[3,j]==e$m[4,j]){ e$m[,j]=c(2*e$m[1,j],0,2*e$m[3,j],0) e$x=1 } else if (e$m[2,j] != 0 & e$m[2,j]==e$m[1,j]){ e$m[,j]=c(2*e$m[1,j],0,e$m[3,j],e$m[4,j]) e$x=1 } else if (e$m[3,j] != 0 & e$m[3,j]==e$m[4,j]){ e$m[,j]=c(e$m[1,j],e$m[2,j],2*e$m[3,j],0) e$x=1 } else if (e$m[2,j] != 0 & e$m[2,j]==e$m[3,j]){ e$m[,j]=c(e$m[1,j],2*e$m[2,j],0,e$m[4,j]) e$x=1 } j=j+1 } rm_zero() new_mt() draw_bg() draw_num() fail()}if (e$dir=="down"){ j=1 while (j<=4){ if (e$m[1,j] != 0 & e$m[1,j]==e$m[2,j] & e$m[1,j]==e$m[3,j] & e$m[1,j]==e$m[4,j]){ e$m[,j]=rep(c(0,2*e$m[1,j]),each=2) e$x=1 } else if (e$m[2,j] != 0 & e$m[3,j] != 0 & e$m[2,j]==e$m[1,j] & e$m[3,j]==e$m[4,j]){ e$m[,j]=c(0,2*e$m[1,j],0,2*e$m[3,j]) e$x=1 } else if (e$m[2,j] != 0 & e$m[2,j]==e$m[1,j]){ e$m[,j]=c(0,2*e$m[1,j],e$m[3,j],e$m[4,j]) e$x=1 } else if (e$m[3,j] != 0 & e$m[3,j]==e$m[4,j]){ e$m[,j]=c(e$m[1,j],e$m[2,j],0,2*e$m[3,j]) e$x=1 } else if (e$m[2,j] != 0 & e$m[2,j]==e$m[3,j]){ e$m[,j]=c(e$m[1,j],0,2*e$m[2,j],e$m[4,j]) e$x=1 } j=j+1 } rm_zero() new_mt() draw_bg() draw_num() fail()}}stage2<-function(){ e$stage<-2 plot(0,0,xlim=c(0,1),ylim=c(0,1),type='n',xaxs="i", yaxs="i") text(0.5,0.7,label="Game Over",cex=2) text(0.5,0.4,label="Space to restart, q to quit.",cex=2,col=4) text(0.2,0.05,label="Author:YwLiao",cex=1)}# 开机画图stage0<-function(){ e$stage<-0 plot(0,0,xlim=c(0,1),ylim=c(0,1),type='n',xaxs="i", yaxs="i") text(0.5,0.7,label="2048",cex=2) text(0.5,0.4,label="Any keyboard to start",cex=2,col=4) text(0.5,0.3,label="Up,Down,Left,Rigth to control direction",cex=2,col=2) text(0.2,0.05,label="Author:YwLiao",cex=1)}#键盘事件keydown<-function(K){ print(paste("keydown:",K,",stage:",e$stage)); if(e$stage==0){ #开机画面 init() return(NULL)} if(e$stage==2){ #结束画面 if(K=="q") q() else if(K==' ') stage0() return(NULL) } if(e$stage==1){ #游戏中 if(K == "q") { stage2() }else { if(tolower(K) %in% c("up","down","left","right")){ e$dir<-tolower(K) stage1() } } } return(NULL) }#开始运行游戏run<-function(){ e<<-new.env() #X11(type="Xlib") #linux系统需添加此行代码,不过字体受到限制,没有windows下大 stage0() getGraphicsEvent(prompt="2048",onKeybd=keydown)}run()

游戏画面

到此这篇关于R语言写2048游戏实例讲解的文章就介绍到这了,更多相关R语言写2048游戏内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章