文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

R语言写2048游戏实例讲解

2024-04-02 19:55

关注

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=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游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯