new 2048 Game

因为app 新2048里面的数字传奇这款小游戏自我感觉挺好玩的,但是因为这个app有很多广告,研究了一下,花了一点时间写了一个版本。

游戏的规则是
1. 在一个5*5的矩阵中,随机在每一个方格中初始化一个数字
2. 每次判断是否有大于3个相连的数字,数字可以任意方向旋转,只需要有一个大于等于3的链子,然后将这些链子的数字合并并且以左上角的数字合并加一(app游戏里面这是以输入的坐标为准,可以自己修改)
3. 合并后数字下落,并且在上方掉落1-6的随机数字,然后在输入前重复执行2步骤直到不满足条件

主要是上述的游戏规则,将其分为了几个方法,
1.以左上角检查矩阵是否有满足条件的上述2的情况
```
const (  
   DIRECTION_ALL = 0  
  DIRECTION_UP = 1  
  DIRECTION_DOWN = 2  
  DIRECTION_LEFT = 3  
  DIRECTION_RIGHT = 4  
  DECOLLATOR = "=="  
)
/**  
找到连接的数字  
*/  
func FindList(data [][]int) (bool, map[string]int) {  
  
   for i := 0; i < len(data); i++ {  
      for j := 0; j < len(data[i]); j++ {  
         tMap := make(map[string]int)  
         if data[i][j] != 0 {  
            findMaxList(data, i, j, data[i][j], DIRECTION_ALL, &tMap)  
         }  
         //fmt.Printf("i:%d,j:%d,tMap:%v\n", i, j, tMap)  
  if len(tMap) >= 3 {  
            return true, tMap  
         }  
      }  
  
   }  
   return false, nil  
}
/**  
direction 方向 0 全都 1 上 2 下 3 左 4 右  
*/  
//func findMaxList(data [][]int, i, j, temp int, list *modlue.List) {  
func findMaxList(data [][]int, i, j, temp, direction int, m *map[string]int) {  
   //fmt.Printf("%d,%d,%d\n", i, j, temp)  
  key := strconv.FormatInt(int64(i), 10) + DECOLLATOR + strconv.FormatInt(int64(j), 10)  
   //横向加一  
  if i < len(data) && j+1 < len(data[i]) && direction != DIRECTION_RIGHT {  
      if temp == data[i][j+1] && temp == data[i][j] {  
         key1 := strconv.FormatInt(int64(i), 10) + DECOLLATOR + strconv.FormatInt(int64(j+1), 10)  
         if (*m)[key] > 0 && (*m)[key1] > 0 {  
            return  
  }  
         (*m)[key] = (*m)[key] + 1  
  (*m)[key1] = (*m)[key] + 2  
  findMaxList(data, i, j+1, temp, DIRECTION_LEFT, m)  
      }  
  
   }  
   //横向减一  
  if i < len(data) && j-1 >= 0 && direction != DIRECTION_LEFT {  
      if temp == data[i][j-1] && temp == data[i][j] {  
         key1 := strconv.FormatInt(int64(i), 10) + DECOLLATOR + strconv.FormatInt(int64(j-1), 10)  
         if (*m)[key] > 0 && (*m)[key1] > 0 {  
            return  
  }  
         (*m)[key] = (*m)[key] + 1  
  (*m)[key1] = (*m)[key] + 2  
  findMaxList(data, i, j-1, temp, DIRECTION_RIGHT, m)  
      }  
  
   }  
   //纵向加一  
  if i+1 < len(data) && direction != DIRECTION_UP {  
      if temp == data[i+1][j] && temp == data[i][j] {  
         key1 := strconv.FormatInt(int64(i+1), 10) + DECOLLATOR + strconv.FormatInt(int64(j), 10)  
         if (*m)[key] > 0 && (*m)[key1] > 0 {  
            return  
  }  
         (*m)[key] = (*m)[key] + 1  
  (*m)[key1] = (*m)[key] + 2  
  findMaxList(data, i+1, j, temp, DIRECTION_DOWN, m)  
      }  
   }  
   //纵向减一  
  if i-1 > 0 && direction != DIRECTION_DOWN {  
      if temp == data[i-1][j] && temp == data[i][j] {  
         key1 := strconv.FormatInt(int64(i-1), 10) + DECOLLATOR + strconv.FormatInt(int64(j), 10)  
         if (*m)[key] > 0 && (*m)[key1] > 0 {  
            return  
  }  
         (*m)[key] = (*m)[key] + 1  
  (*m)[key1] = (*m)[key] + 2  
  findMaxList(data, i-1, j, temp, DIRECTION_UP, m)  
      }  
   }  
}
```
2. 将找到的链子合并
```
/*  
将连接好的变成0,并且返回第一个的位置  
*/  
func ConnectChangeZero(data [][]int, temp map[string]int) (int, int, int) {  
   ir, jr, value := -1, -1, 1000000000000  
  for k, v := range temp {  
      l := strings.Split(k, DECOLLATOR)  
      if len(l) != 2 {  
         return value, ir, jr  
      }  
  
      i, _ := strconv.ParseInt(l[0], 10, 64)  
      j, _ := strconv.ParseInt(l[1], 10, 64)  
      if v <= value {  
         ir, jr, value = int(i), int(j), data[i][j]  
      }  
      data[i][j] = 0  
  }  
   return value, ir, jr  
}
```
3,数字下落和数字填充
```
/**  
数字下落,将0覆盖  
*/  
func Fall(data [][]int) {  
   if len(data) == 0 {  
      return  
  }  
   length := len(data)  
   for j := 0; j < length; j++ {  
      for i := 0; i < length; i++ {  
         if data[i][j] == 0 && i > 0 && data[i-1][j] != 0 {  
            temp := data[i][j]  
            data[i][j] = data[i-1][j]  
            data[i-1][j] = temp  
            i = 0  
  }  
      }  
  
   }  
}  
  
/**  
将0通过随机数填充  
*/  
func Fill(data [][]int, n int) {  
   for i := 0; i < len(data); i++ {  
      for j := 0; j < len(data[i]); j++ {  
         if data[i][j] == 0 {  
            data[i][j] = utils.GetRandom(n)  
         }  
      }  
   }  
}
```

将上述方法组合即可完成游戏,具体可参考github
https://github.com/skyfour/2048NewGame
有问题请自行解决或者发邮箱zhangjiap@163.com,仅限于娱乐。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值