BSC链BNB农场游戏系统开发技术(开发规则)

2022-06-14 15:09:52 浏览数 (1)

元宇宙农场Meta Farm游戏简介

  Meta Farm是一款在BSC链上构建的将(Game Social)Fi完美结合的爆款偷菜游戏。任何人都可以通过熟练的游戏玩法与对生态系统的贡献来获取通证奖励。

玩家可以通过META购买土地获得种子,种植蔬菜水果,通过浇水施肥除虫等收获果实。在天使果实达到一定的数量要求即可使用META进行土地升级。在游戏中,玩家还能体验偷菜、朋友展开各种互动的乐趣。Meta Farm注重玩家的游戏体验,Meta Farm在农场大富翁达到21000时,游戏奖励方案将通过社区投票(持有META者)决定。

  游戏玩法

  有土地玩家在土地上种植,收获果实。去陌生人家中,偷取成熟的果实。

  所有玩家,包括没有土地玩家都可以去陌生人家中,偷取成熟的果实。

  元宇宙农场Meta Farm玩家收益规则

  种地——每次播种后需要等待一定时间才能收获,每次收获都会得到普通果实和天使果实。收获时,普通果实会直接变为FARM,天使果实会储存在仓库中,可以进行买卖或者用来升级农场。等级越高的种子,出售收获的果实的利润越高。

  偷菜——通过地图功能去陌生人家里,当陌生人家里作物成熟时,可以偷到一些果实获得FARM。

  仇人——当被偷时,盗窃者的信息将会被记录在仇人名单中,可以反向偷取仇人相等次数的农作物。

  偷肥——当达到2级时,可以派遣农场里的鼹鼠去陌生人家里偷取肥料,这样能够大大减少自己农场的肥料支出。

图片

  拥有土地的玩家可以通过种菜、收菜,进行获得稳定的FARM收入。除此之外,所有的游戏玩家,包括未拥有土地的玩家也可以通过偷菜,从游戏中获得一定的FARM。

  种地每次播种后需要等待一定时间才能收获,每次收获都会得到普通果实和天使果实。收获时,普通果实会直接变为FARM,天使果实会储存在仓库中,可以进行买卖或者用来升级农场。等级越高的种子,出售收获的果实的利润越高。还可以通过去别人家偷成熟的果实获得收益。如何安排土地种植?尽量种满土地,效益最大化。

代码语言:javascript复制
const HomePageURL = "http://www.xxxxxxx.cn/wap/" // 首页
const LoginURL = HomePageURL   "login.aspx"      // 登录页面
const UserHome = HomePageURL   "userindex.aspx"  // 用户中心
const TianYuanURL = HomePageURL   "tea.aspx"     // 田园页面

const UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
const Accept = "text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
const AcceptLanguage = "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6,mt;q=0.5,zh-TW;q=0.4,la;q=0.3,da;q=0.2,pl;q=0.1,lb;q=0.1,de;q=0.1"
const ContentType = "application/x-www-form-urlencoded"

// 请求客户端
type HttpClient struct {
  // 公共页面参数
  ViewState          string
  ViewStateGenerator string

  gCurCookies   []*http.Cookie
  gCurCookieJar *cookiejar.Ja

  myHttpClient *http.Client // 请求客户端
}

// 登录,获取Cookie
func (h *HttpClient) Login(userName, password string) error {
  h.GetPageParams()
  params := url.Values{}
  params.Add("__VIEWSTATE", h.ViewState)
  params.Add("__VIEWSTATEGENERATOR", h.ViewStateGenerator)
  params.Add("tb_loguid", userName)
  params.Add("tb_pwd", password)
  params.Add("checkboxDefault", "0")
  params.Add("Button1", "确认登录")
  postParams := ioutil.NopCloser(strings.NewReader(params.Encode()))

  req, err := http.NewRequest("POST", LoginURL, postParams)
  if err != nil {
    return er
  }

  req.Header.Add("Content-Type", ContentType)
  req.Header.Add("Accept", Accept)
  req.Header.Add("Accept-Encoding", "gzip, deflate")
  req.Header.Add("Accept-Language", AcceptLanguage)
  req.Header.Add("Cache-Control", "max-age=0")
  req.Header.Add("Connection", "keep-alive")
  req.Header.Add("Content-Length", "217")
  req.Header.Add("DNT", "1")
  req.Header.Add("Origin", "http://www.xxxxxxx.cn")
  req.Header.Add("Referer", LoginURL)
  req.Header.Add("Upgrade-Insecure-Requests", "1")
  req.Header.Add("User-Agent", UserAgent)

  resp, err := h.myHttpClient.Do(req)
  if err != nil {
    return er
  }

  h.gCurCookies = h.gCurCookieJar.Cookies(req.URL)
  defer resp.Body.Close()

  return nil
}

// 获取页面及Cookie参数,币安农场游戏开发平台V:MrsFu123
func (h *HttpClient) GetPageParams() error {
  _myCookieJar, _ := cookiejar.New(nil)
  h.gCurCookieJar = _myCookieJa
  h.myHttpClient = &http.Client{
    CheckRedirect: nil,
    Jar:           h.gCurCookieJar,
  }

  if err := h.getViewState(LoginURL); err != nil {
    return er
  }

  return nil
}

// 获取页面参数
func (h *HttpClient) getViewState(url string) error {
  req, err := http.NewRequest("GET", url, nil)
  if err != nil {
    return er
  }

  res, err := h.myHttpClient.Do(req)
  if err != nil {
    return er
  }

  defer res.Body.Close()

  doc, err := goquery.NewDocumentFromReader(res.Body)
  if err != nil {
    return er
  }

  doc.Find("#__VIEWSTATE").Each(func(i int, s *goquery.Selection) {
    h.ViewState = s.AttrOr("value", "")
  })

  doc.Find("#__VIEWSTATEGENERATOR").Each(func(i int, s *goquery.Selection) {
    h.ViewStateGenerator = s.AttrOr("value", "")
  })

  if url == LoginURL {
    h.gCurCookies = h.gCurCookieJar.Cookies(req.URL)
  }

  return nil
}

值为qipao的节点,那么就可以操作收茶动作。

代码语言:javascript复制
// 检查是否可以收茶
func (h *HttpClient) checkCanTakeTea() (bool, error) {
  if err := h.getViewState(TianYuanURL); err != nil {
    return false, er
  }

  req, err := http.NewRequest("GET", TianYuanURL, nil)
  if err != nil {
    return false, er
  }

  res, err := h.myHttpClient.Do(req)
  if err != nil {
    return false, er
  }

  defer res.Body.Close()

  doc, err := goquery.NewDocumentFromReader(res.Body)
  if err != nil {
    return false, er
  }

  // 如果可以收茶,则页面会有 .qipao 这个节点
  if len(doc.Find(".qipao").Nodes) >= 1 {
    return true, nil
  }

  return false, nil
}


// 浇水操作
func (h *HttpClient) Watering() error {
  if err := h.getViewState(TianYuanURL); err != nil {
    return er
  }

  params := url.Values{}
  params.Add("__VIEWSTATE", h.ViewState)
  params.Add("__VIEWSTATEGENERATOR", h.ViewStateGenerator)
  params.Add("__EVENTTARGET", "")
  params.Add("__EVENTARGUMENT", "")
  params.Add("Button1", "确认浇水")
  postParams := ioutil.NopCloser(strings.NewReader(params.Encode()))
  req, err := http.NewRequest("POST", TianYuanURL, postParams)
  if err != nil {
    return er
  }
  req.Header.Add("Content-Type", ContentType)

  resp, err := h.myHttpClient.Do(req)
  if err != nil {
    return er
  }

  if resp.StatusCode != 200 {
    return errors.New("浇水操作失败!请检查并重新操作")
  }

  defer resp.Body.Close()
  return nil
}

一个方法中。

代码语言:javascript复制
// 执行任务
func (h *HttpClient) TaskRun() error {
  for _, item := range users {
    // 1.登录
    fmt.Println(tools.Timetostr(0), " 登录...")
    if err := h.Login(item["userName"], item["password"]); err != nil {
      return er
    }

    // 2.检查是否可以收茶
    fmt.Println(Timetostr(0), " 检查...")
    status, err := h.checkCanTakeTea()
    if err != nil {
      return er
    }

    // 3.如果可以收茶,则收茶和浇水
    if status {
      if err := h.TakeTea(); err != nil {
        return er
      }

      fmt.Println(Timetostr(0), item["userName"] " 收茶成功...")

      // 延时2分钟
      time.Sleep(time.Duration(120) * time.Second)

      if err := h.Watering(); err != nil {
        return er
      }

      fmt.Println(Timetostr(0), item["userName"] " 浇水成功...")
    }

    // 延时50秒
    time.Sleep(time.Duration(50) * time.Second)

    // 4.操作完毕,退出登录
    fmt.Println(Timetostr(0), " 退出...")
    if err := h.Logout(); err != nil {
      return er
    }
  }

  return nil
}

// 获取当前日期时间
func Timetostr(unixTime int64) string {
  if unixTime == 0 {
    unixTime = time.Now().Unix()
  }
  timer := time.Unix(unixTime, 0)
  return timer.Format(TimeLayoutLong)
}

如下:

代码语言:javascript复制
// 需要监控的账户
var users []map[string]string = []map[string]string{
  {
    "userName": "18*******44",
    "password": "********",
  },
  {
    "userName": "18*******20",
    "password": "********",
  },
}

func main() {
  fmt.Println("开始定时任务...")

  // 10分钟执行一次
  for range time.Tick(time.Duration(600) * time.Second) {
    httpClient := new(HttpClient)
    if err := httpClient.TaskRun(); err != nil {
      fmt.Println(err.Error())
    }
  }
}

0 人点赞