服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - R语言 - R语言写2048游戏实例讲解

R语言写2048游戏实例讲解

2021-12-30 15:42ywliao R语言

这篇文章主要介绍了R语言写2048游戏实例讲解,文中将代码列举了出来,有感兴趣的同学可以学习下

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

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

程序结构如下:

R语言写2048游戏实例讲解

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=1
mt <- matrix(c(sample(c(2,4),1),rep(0,15)),nrow=4)
e$m <- mt[sample(4),sample(4)]
draw_bg()
draw_num()
}

#移除矩阵数字间的0
rm_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 <- 1
e$x <- 0
rm_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游戏实例讲解的文章就介绍到这了,更多相关R语言写2048游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/ywliao/p/6725174.html

延伸 · 阅读

精彩推荐
  • R语言R语言创建矩阵的实现方法

    R语言创建矩阵的实现方法

    这篇文章主要介绍了R语言创建矩阵的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    hjk_caesar9462021-12-27
  • R语言R语言绘制散点图实例分析

    R语言绘制散点图实例分析

    在本篇文章里小编给大家整理的是一篇关于R语言绘制散点图实例分析内容,有需要的朋友们可以学习下。...

    w3cschool6942022-01-06
  • R语言R studio 批量注释的快捷方式

    R studio 批量注释的快捷方式

    这篇文章主要介绍了R studio 批量注释的快捷方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    JasonKQLin13342022-01-04
  • R语言R语言可视化存储矢量图实现方式

    R语言可视化存储矢量图实现方式

    这篇文章主要为大家介绍了R语言存储矢量图的实现方式过程,有需要的朋友可以借鉴参考下,希望能够有所你帮助,祝大家多多进步,早日升职加薪...

    Kanny广小隶9392022-01-20
  • R语言R语言编程学习绘制动态图实现示例

    R语言编程学习绘制动态图实现示例

    这篇文章主要介绍了R语言编程学习绘制动态图实现示例,有需要的的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    微小冷7652022-01-18
  • R语言聊聊R语言中Legend 函数的参数用法

    聊聊R语言中Legend 函数的参数用法

    这篇文章主要介绍了聊聊R语言中Legend 函数的参数用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Gavin姓陈6352021-12-28
  • R语言R语言中c()函数与paste()函数的区别说明

    R语言中c()函数与paste()函数的区别说明

    这篇文章主要介绍了R语言中c()函数与paste()函数的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    yiyu_j11152022-01-12
  • R语言R语言-使用ifelse进行数据分组

    R语言-使用ifelse进行数据分组

    这篇文章主要介绍了R语言-使用ifelse进行数据分组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小力丸12042022-01-10