• 追加された行はこの色です。
  • 削除された行はこの色です。
*ぷよぷよプロジェクト [#f2dc0bfe]
**ぷよコードby吉岡 [#t3934187]
O-Camlのプリントを見直しながら、記述したコードを書いておきます。

下記はremove関数を実装するためのものです。

 type color = RED | BLUE | GREEN | YELLOW;;
 type puyo=COLOR of color|JAMA|SEE_THROUGH;;
 type puyo=COLOR of color|JAMA|DEL_COLOR;;

SEE_THROUGHを消す予定ぷよとしています。
DEL_COLORを消す予定ぷよとしています。

 let rec deletecheck' plist y =
 match y with
 0 -> SEE_THROUGH::(List.tl plist)
 0 -> DEL_COLOR::(List.tl plist)
 | y ->(List.hd plist)::(deletecheck' (List.tl plist) (y-1));; 

 let rec deletecheck plist (x,y)=
 match x with
 0 -> (deletecheck' (List.hd plist) y)::List.tl plist
 | x ->List.hd plist::(deletecheck (List.tl plist) (x-1,y));;

消すぷよリスト要素をSEE_THROUGHに置換する関数です。

リストの要素を消す既存関数はあるのでしょうか?

 let rec delete' plist leng=
 match leng with
 | 0 ->plist
 | leng -> if ((List.hd plist)==SEE_THROUGH) then delete' (List.tl plist) (leng-1)
 else (List.hd plist)::(delete' (List.tl plist) (leng-1));;

 let rec delete plist=
 match plist with
 | [] -> plist
 | plist -> (delete'(List.hd plist) (List.length(List.hd plist)))::(delete(List.tl plist));;
 | plist -> (List.filter (fun l -> l != DEL_COLOR)(List.hd plist))::(delete(List.tl plist));;

消す予定ぷよを実際にリストから消去する関数。

 let rec remove t v =
 match v with
 [] -> delete t
 | v ->(remove (deletecheck t (List.hd v)) (List.tl v));;
 
**作成の流れ [#z36d4b81]
+モデル作成
+UIの作成
+対戦する敵のアルゴリズム作成
+テスト&レビュー

こんなとこでしょうか? 1がおおよそ出来れば、2と3は同時並行できると思います。

#comment

**参考 [#m76b1453]
http://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html

もっと他にもあると思う

**モデル [#a8f8f693]
 type color = RED | BLUE | GREEN | YELLOW | SEE_THROUGH
 type kind = NORMAL | JAMA
 type puyo = { color : color; kind : kind }

こんな感じで。あとは空間とぷよの配置の定義すればおしまい。
配置から消えるぷよを求める関数とか作っとくと便利かな。

追記よろしく :)

**空間とぷよ反応 [#c845d6d8]
 type space = puyo list list
 let react (p:ps) = ...

型spaceは空間を表す.

react : space -> option (int, space) を想定.結果がNONEの場合は反応なし/連鎖終了,SOME (pt,ps) の時は反応ありで得点と反応後の空間の対を返す.全体としてかなりでかい関数になると思われる.

あと画面のエフェクトを考えると,消えたぷよの位置のリストも返すようにすれば,消えたときのエフェクトも描きやすいだろうと思う.

ところでどうやって再帰で書くんだろう.

配列を使って破壊的なアルゴリズムを記述するなら,割に簡単にできそう ([[参考:http://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html]]に挙げたページとか).(プログラム全体で配列を管理する必要は無く,あくまでもぷよの連鎖判定に (チェック済み部分を覚えておく為に) 配列を使うということ)

純粋関数的にやるとどうなる? Stateモナドを使うか,継続渡し形式でやるか…?

#ありがとうございます。すばらしいです。とってもいい感じだと思います。

ところで、上記の react 関数をエレガントに記述する為に、それ程難しくない、うまい方法があります。
別にもったいつける訳ではないのですが、皆さん少し考えてみると楽しいと思います。ヒントは「連結」です。

#comment

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS