纸片游戏 clojure写法

这篇博客介绍了基于纸片的策略游戏数据结构设计,包括游戏地图、玩家行为如移动、攻击、调查和停留等功能实现。文章通过定义一系列函数来创建游戏地图、更新玩家位置、检查胜利条件等,展示了游戏逻辑的详细过程。此外,还包含了一个检查通关和进行下一轮的函数,以及一些辅助函数用于处理相邻格子和玩家操作。

纸片玩法数据结构

数据

  1. 每一格的信息:[ 0 1 {:player 0 :paper:0 movebox:0} ]
  2. 位置获胜信息:[本关的胜利位置 呆了几次],比如[6 1 0]表示6 1呆了0次,3次获胜
Papergame {
:levelmap [每一格的信息] ;游戏地图
:currentmap ;当前关
:winpoint; [获胜位置信息] 
:actionpoint ;行动点数
:turn ;已进行回合数。默认为1
:mapsize [[5 5]] ;每轮地图大小

逻辑
;生成游戏函数
Defn Createmap [turn]
	Let [Papergame (CreateBaseData turn)] ;生成最基础的游戏数据 
	Do [CreateBox [Papergame] ;生成推盒
		CreatePaper [Papergame] ;生成纸
		CreatePlayer [Papergame] ;生成玩家
		CreateWinPoint [Papergame] ;生成获胜点
		Papergame] ;返回数据

;玩家行为:移动函数 启动检查:是否有足够的行动点数,并扣除点数,加上回合
Defn move [x y Papergame]
	Do [UpdatePaperPos Papergame ;更新Paper的位置,根据推盒和边界移动
		If (CheckPlayerCanMove Papergame) ;检测玩家移动的位置可以移动
[(UpdatePlayerPos Papergame) ;移动玩家位置
(CostActionPoint Papergame) ;消耗一点点数
Papergame] ;返回数据

;玩家行为:调查函数 
Defn lookup [x y Papergame]
	Do [UpdatePaperPos Papergame ;更新Paper的位置,根据推盒和边界移动
		(If (CheckPlayerCanLook Papergame) ;检测玩家攻击的位置中有盒子
(If (Lucky?)
(Println (Papergame : winpoint);打印出获胜点的位置
(Println “废话一句”)) ;打印出一句废话或者故事
Papergame] ;返回数据

;玩家行为:
Defn stay [Papergame]
	Do [UpdatePaperPos Papergame ;更新Paper的位置,根据推盒和边界移动
	(if (IsInWinPoint Papergame) ;玩家是否在获胜点上
(AddPlayerWinPoint Papergame) ; 增加1个玩家在某个位置上的获胜点数
Papergame] ;返回数据


;玩家行为:攻击函数 
Defn kill [x y Papergame]
	Do [UpdatePaperPos Papergame ;更新Paper的位置,根据推盒和边界移动
		If (CheckPlayerCanAttack Papergame) ;检测玩家攻击的位置中有盒子
			[(DestroyPaper Papergame) ;消除paper
			(AddActionPoint Papergame)] ;增加行动点数10点
Papergame] ;返回数据


;在玩家行动之后,检查是否通关
Defn AfterAction [Papergame]
	Do [if (CheckIfWin Papergame)	;查看是否赢了
(LoadNextLevel Papergame)]	;进入下一关
	(printLn Papergame);打印新的Papergame

Defn TurnOver [Papergame]
	(AddTurn Papergame) ;对game增加一个turn

Defn DoSomething [name Game & x y]
	If (Inlist? name [stay move])
		Do [
if (ActionPointIsEnough(Game))
	(name Game x y)
PrintIn (“点数不够了,move和stay都需要消耗点数”)
 	:else
		(name Game x y)

;每次要做什么事情,大概要这样输入才可以。
(Defn Game (DoSomething ActionName Game x y))

一个随便想的小游戏。
接下来就是实现出来。

笔记:

(defn neighbors
  ([size yx]
     (neighbors [[-1 0] [1 0] [0 -1] [0 1]] size yx))
  ([deltas size yx]
     (filter (fn [new-yx] (every? #(< -1 % size)
                                  new-yx))
             (map #(vec (map + yx %)) deltas))))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值