R语言写2048游戏实例讲解

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

(0)

相关推荐

  • R语言 用均值替换、回归插补及多重插补进行插补的操作

    用均值替换.回归插补及多重插补进行插补 # 设置工作空间 # 把"数据及程序"文件夹拷贝到F盘下,再用setwd设置工作空间 setwd("E:\\R_workspace\\R语言数据分析与挖掘实战\\chp4") # 读取销售数据文件,提取标题行 inputfile <- read.csv('./data/catering_sale.csv', header = TRUE) View(inputfile) # 变换变量名 inputfile <- da

  • R语言实现对数据框按某一列分组求组内平均值

    可使用aggregate函数 如: aggregate(.~ID,data=这个数据框名字,mean) 如果是对数据框分组,组内有重复的项,对于重复项保留最后一行数据用: pcm_df$duplicated <- duplicated(paste(pcm_df$OUT_MAT_NO, pcm_df$Posit, sep = "_"), fromLast = TRUE) pcm_df <- subset(pcm_df, !duplicated) pcm_df$duplicat

  • R语言的xtabs函数实例讲解

    今天在做一个列联表独立性检验的时候,总是无法处理好要求的数据类型,偶然的机会,看到了xtabs()函数,感觉很适合用来做列联表,适合将一列数据转换成列联表. shifou <- c("yes","yes","no","no") xinbie <- c("nan","nv","nan","nv") freq <- c(34,38,2

  • R语言基本语法深入讲解

    基本数据类型 数据类型 向量 vector 矩阵 matrix 数组 array 数据框 data frame 因子 factor 列表 list 向量 单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例 向量的元素必须属于某种模式(mode),可以整型(integer).数值型(numeric).字符型(character).逻辑型(logical).复数型(complex) 循环补齐(recycle):在一定情况下自动延长向量 筛选:提取向量子集 向量化:对向量的每一个元素应用函数

  • linux命令行下使用R语言绘图实例讲解

    使用系统:centos 6.4 64bit 在R语言中可以使用png()等函数生成图片,例如: png("aa.png")可以生成图片. 但是如果你是通过shell远程连接到系统上,可能会碰到如下错误: > png("aa.png") 错误于.External2(C_X11, paste("png::", filename, sep = ""), g$width,  :    无法打开PNG设备 此外: 警告信息: In

  • R语言绘制空间热力图实例讲解

    先上图 R语言的REmap包拥有非常强大的空间热力图以及空间迁移图功能,里面内置了国内外诸多城市坐标数据,使用起来方便快捷. 开始首先安装相关包 install_packages("devtools") install_packages("REmap") library(devtools) library(REmap) 我们来试试其强大的城市坐标获取功能 city<- c("beijing","上海") get_geo_

  • R语言归一化处理实例讲解

    归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快. R语言中的归一化函数:scale 数据归一化包括数据的中心化和数据的标准化. 1. 数据的中心化 所谓数据的中心化是指数据集中的各项数据减去数据集的均值. 例如有数据集1, 2, 3, 6, 3,其均值为3,那么中心化之后的数据集为1-3,2-3,3-3,6-3,3-3,即:-2,-1,0,3,0 2. 数据的标准化 所谓数据的标准化是指中心化之后

  • R语言写2048游戏实例讲解

    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

  • R语言格式化输出sprintf实例讲解

    用%s替代字符串 name <- 'max' sprintf('my name is %s',name) [1] "my name is max" 用%d替代整数 age <- 18 sprintf('age:%d',age) [1] "age:18" d前面添加数字n,可以添加n-替代数字位数的空格 sprintf('age:%3d',age) [1] "age: 18" d前面添加0加上数字n,可以添加n-替代数字位数的0 spr

  • R语言向量知识点及实例讲解

    有常见的六种基本的向量类型 创建向量 设定recursive = T,c函数可以从其他数据结构中递归形成向量 > v <- c(.295, .300, .250, .287, list(.102, .200, .303), recursive = T) > v [1] 0.295 0.300 0.250 0.287 0.102 0.200 0.303 > typeof(v) [1] "double" > v <- c(.295, .300, .250

  • C语言实现2048游戏代码

    本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下 效果图: 使用文本界面的屏幕绘图库 ncurses. 设计思路: 在满足条件情况下消除方块 允许在游戏主界面(16 宫格)中任意一格输出数据 实现代码: #include <stdio.h> #include <stdlib.h> #include <curses.h> #include <unistd.h> #include <signal.h> #include &

  • python飞机大战游戏实例讲解

    记得刚学python那会,作过一个飞机大战小项目,这个项目非常经典,可以帮助初学者提高动手能力,今天把它分享出来. 一.项目介绍 先放几张图片 二.项目实现 1.首先安装库 pip install pygame 2.主要python代码 import pygame from pygame.locals import * import random #https://blog.csdn.net/qq_36079986/article/details/110395731 class HeroPlan

  • C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到,内存区每一个字节都有一个编号,地址也可以形象的理解成我们生活中的住址,通过住址找到每一个人所在的地方.指针作为一个变量用来存放地址,可以通过指针来改动变量. 上图就是一个简单的定义一个一级指针变量和利用指针改变变量数值的过程.int*表示整型指针,*p表示解引用操作,就是利用指针找到a的地址然后再改

  • R语言的数据输入深入讲解

    既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来探讨一下. 首先,数据输入最直接最直观的方法就是键盘输入,在上面几篇都已经讲到,利用c创建向量,利用matrix创建矩阵,利用data.frame创建数据框等,但是我们处理的数据往往比较多,键盘输入在面对如此庞大的数据时显然不现实,当然你可以花费好几天来输入数据而且保证不出错除外,而且待处理的一般都存储在Excel,网页,数据库其他中介中

  • 用C语言实现2048游戏

    本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,具体内容如下 我遇到的几个问题: 问题1:如何显示? system("clear");//清屏 每次发生变化就清屏一次,再把内容打印出来 问题2:怎么用键盘控制? w,s,a,d-->上下左右 system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受 问题3:随机位置? 用srand()与rand()产生随机数(x,y),再判断位置(x,y)是否为空格,不是空格就

随机推荐