ゲーム開発の技術

日記書くの久しぶりです。最近はゲーム開発から遠ざかっていてWebアプリを作っていたんですが、また久しぶりにゲームを作ろうかと思っていろいろwebを巡回していました。


 それで思ったんですけどゲーム製作者のコミュニティみたいなものってあんまりないですね。ゲーム作りたいという人は結構いるものだと思ってたし、なんというか以外な感じです。アマチュアのゲーム製作者はあまりwebで情報交換とかしないのか、それとも単にノベル系以外でのゲーム製作者の人口が少ないからなのか。まあ人口が少ないこと自体は無理もないかもしれません。私も結構途中で投げたりしてるし、すごくエネルギーを使います。


 でもゲーム製作って割とやるべきプロセスは固定的だと思うし、素人が簡単に情報に辿り着けるならもっと人口は増えるような気がする。私自身もゲーム製作のプロセスのまずさによって開発の進み方が遅いというのがあるような気がしてます。まあこれは主に反復作業的な部分の効率化とかそういう類の話ですが。まあそんなことを言って自分は何もしていないという状況なので今度私もゲーム製作について自分なりに知ってることを書いてみようと思います。それで人目につくようになったら自分でコミュニティみたいなのを作るのもいいかもしれません。

C#の勉強

ちょっとC#の仕様書を読んでみました。Visual Studio(Express以外)をインストールしたらあるフォルダの中にある、ということを知ったので。後はC#の言語仕様とかに対しての無知を感じたので。


やっぱ知らないこといろいろとありますね。checkedとかuncheckedとかまったく知らなかったし。ジェネリックあたりのことも読みたいけどそっちはC#2.0の仕様書のほうに書いてあるので今は置いておきます。


ところで今度はwebサービスで何かを作ってみたいと思ってます。そのためにはJavaScriptとかを勉強しないと。一応少しばかりのアイディアがあるので軽くプロトタイプを作成してみて、面白いかどうかを見極めたいと思います。

まあ開発技法とか

 プログラミング以外での開発の方法とか無知な部分でしたが、ちょっと会社とか見て最近いろいろわかったので書いておきます。


 まずはツールとかまああたり前の話なんですが、Visual Source Safeとか使うべきですね。以前学校での共同開発的なものをやったとき最初はみんながそれぞれ改変したものをVisual Studioのプロジェクトごとアップロードしてその後一つのコードにまとめる、というありえないことをやってました。途中でCVSなど使うべきだなあと思ってたのですが、なぜか(記憶が曖昧により)全員のパソコンにWinCVSとかCVSとかインストールできなくて断念しました。あの時は断念しないで何が何でも入れさせるべきだった。


 ところでVisualSorceSafeって管理しているデータに関して誰かが改変してると触れなくなっちゃうんですね。調べてみるとSubversionとかではそういうことはないということがTortoiseSVNのドキュメントに書いてありました。SubversionはVisualStudioに組み込んで使えるツールとかもあったので個人でやるなら高い金払ってVSSを買うよりいいんじゃないかと思いました。


 それとテストのこととか、普段ろくなテストしてなかったけどやっぱりバグを減らすためにやらないと。単体テストってやつはVisual Studioでもできるようになってたとはまったく知らなかったです。Junitは使ったことあったんだですが。あとは普通に想定の挙動リストみたいなのでチェック項目を作って調べるってのも描画系のテストでは重要だと思いました。面倒だけど。


 まあとりあえずこんな感じことはわかりました。しかしこういうことは学校とかでも教えてもらえれば上で言及した共同開発で生かせたのになあと。まあ他にも教えることもあるだろうししょうがないといえばしょうがないけど。

choose

久々にCodeGolfやろうとがんばってました.とりあえず一番新しい問題であるChoose について今日一日とりかかっていました.なんとか100byteくらいで書けてるなと思っていたものの,パラメータを大きくするとうまく結果がでないことが判明.つい公式の通りのアルゴリズムを使って計算していて値が大きくなりすぎてしまったようです.


高校の時に教科書でやった組み合わせのほうの式をすっかり失念していて,ヒントでリンクされてるwikipediaのページを眺めてて気づきました.とりあえずこれでまともに結果がでるようにしてからループとか制御の無駄を削ることを考えたいと思います.


それにしてもまともにはてなで書いてなかったせいで細かい書き方とか全然覚えてないです.また勉強しないといけないなあ.

忙しい日々

 最近とても忙しいです.とはいえ作りかけのゲームとかそういうものに手をつけられないほど時間がないわけではないけど,家に帰ったら眼が疲れてきついです.普段学校でもPC漬けで今は卒論とか書いてるので特にそんな感じです.まあなんにせよ脳は疲れないそうなのでどうにかして眼を回復させるか,もしくはあまり酷使しないようにするかどうにかしたいです.私は今後も間違いなく眼を使ってばっかりの人生を送るので眼は大事にしたいと思います.ほんと見えなくなったりとかしたら大変ですから.


 さてそれはそうとして最近どうにも就職どうするかとかそんなことを良く考えます.私は情報系の大学に行っているので順当に行けばIT系,(まあ微妙な表現方法なんですがとりあえず大雑把にわかりやすいので)の企業に就職することになります.自分の適性とか興味関心とかの点で考えても間違いなくそういった方向です.でも日本で蔓延ってるITってやつはどうにもげんなりしてしまうようなのが多いというか,なんか面白くなさそうというか。世の中で堅実なことってのはそう面白いわけじゃないとは思うけど,それでもやっぱりプログラマとして楽しめそうなところがいいなあ.就職先の選択にはまだ多少猶予があるのでいろいろ考えていきたいと思います.

不精

 Haskellいじりを止めて2ヶ月、結構時間がたってます。今は新しくまたゲーム作りのほうをやっています。
今週はサボりぎみでしたが。言語はC#を使ってライブラリとしてYaneSDKを使っています。これより以前にはHSPなどでゲームを作ろうとがんばっていましたがまあいろいろあって挫折しました。その時は将棋みたいな盤上で戦うゲームという程度のことしか考えてなかったのですが、今回はゲーム自体のルールについてもちゃんと考えてあるので完成させたいと思ってます。


 それにしてもメモ程度にせよ書くネタはたくさんあるのにどうにも筆不精でめんどくさくなってしまいます。なんかもっと楽にメモ程度のことを残せるような方法ないかなあ。
なんらかのツールを使うとか作るとかにしても、結局考えていることとかだったら言語化してパソコンとか携帯とかで打ち込まざるおえないし。ノートに書いてカメラで撮ってどうにかするというのも同じことだし。全部を言語にせずにもっと楽に考えていることを保存できるようになればいいんだけど。なんかうまい方法があればいいんだけど。よくわかんないです。

htmlパーサ一応完成

なんとかGoogleのトップページぐらいは全部パースできるようになりました。というわけで作った分を公開します。

-- //////////////////////////////////////////
-- 2007/10/28 LIBERTY
-- html parser
-- /////////////////////////////////////////
import System
import Text.Regex
import Text.ParserCombinators.Parsec
import System.IO.UTF8

main = do cs <- System.IO.UTF8.getContents
          printDomNodeList $ run cs

data DomNode = Element String [DomNode]
                 | Attribute String String
                 | DataString String

printDomTree :: DomNode -> IO()

printDomTree (Attribute s1 s2) = do System.IO.UTF8.print s1
                                    System.IO.UTF8.print s2

printDomTree (DataString s1) = System.IO.UTF8.print s1
printDomTree (Element s x) = do System.IO.UTF8.print s
                                printDomNodeList x

printDomNodeList :: [DomNode] -> IO()                               
printDomNodeList (x:xs) = do printDomTree x
                             printDomNodeList xs

printDomNodeList [] = System.IO.UTF8.putStr ""

run :: String -> [DomNode]
run input = case (parse htmlPars "" input) of
		Right html -> html
                Left err -> [DataString ((show err))]          

htmlPars :: Parser [DomNode]
htmlPars =  do c <- many1 ((try elementPars) <|> (try oneElementPars) 
                 <|>  (try commentPars) <|> stringPars)
               return c  
              
           
elementPars :: Parser DomNode
elementPars = do char '<'
                 b <- many1 letter
                 an <- many attributePars
     	         char '>'
	         c<- many ((try elementPars) <|> (try oneElementPars) 
                   <|> (try commentPars)   <|> stringPars)
                 char '<'
                 char '/'
                 string b
                 char '>'
                 return (Element b (an++c))
             

oneElementPars :: Parser DomNode
oneElementPars = do char '<'
                    b <- many1 (letter <|> (char '!'))
                    as <- many attributePars
                    char '>'
                    return (Element b as) 
               

stringPars :: Parser DomNode
stringPars = do s <- many1 (noneOf "<>")
                return (DataString s)
               

attributePars :: Parser DomNode
attributePars = do try (many1 (char ' '))
                   name <- try (many (letter <|> char '-'))
                   do char '='
                      value <- (partValueAttribute 
                        <|> many (noneOf " >")) 
                      return (Attribute name value)
                     <|> return (Attribute name name)         

partValueAttribute :: Parser String
partValueAttribute = do char '"'
                        s <- many (noneOf ['"'])
                        char '"'
                        return s

commentPars :: Parser DomNode
commentPars = do char '<'
                 char '!'
                 char '-'
                 char '-'
                 com <- many (try twoHypenPars <|> try (noneOf "<>"))
                 char '>'
		 return (DataString com)

twoHypenPars :: Parser Char
twoHypenPars = do char '-'
                  char '-'
             

 コピーや改変については私の許可なしで好きに使ってください。このコードがプログラムに組み込まれていたとしてもコード全体を公開する必要はありません。まあそのまま使えるようなものでもないのでもし使うとすればコードをいじることになると思います。


 動作についてですが、標準入力からhtmlファイルを読み込んで要素、属性、文字列を分割して表示するようにしています。分割方法に関してはDomTreeが一番わかりやすく良さそうなので採用させてもらいました。DomTreeを作るのにHaskellで使える再帰的な代数型で表現できたことはすごいと思いました。


 さてこのコードについてですが、Googleのページ以外ではどのページをパースできるかよくわかりません。調べてないので。適当ですいません。


 またxhtmlの終了タグがない要素に対する"/>"は受け付けないようになってます。mixiのトップページで試してみて気づきました、が直しませんでした。実用というっよりは習作なんでそこは妥協点としておきました。


 しかしhtmlパーサというものは本当にめんどうでした。変な書き方が許容されすぎです。要素名だけで=と要素値がない場合、例えば ""というものがあったとき""というように解釈されるとか、要素値を""でくくることは特定の文字が含まれていなければ省略できるとか、面倒でした。あと以外にめんどくさかったのがコメント部分の最後の--が2回続いたらコメント終わりという部分でした。区切りが一文字ならtryを使えば簡単に済むのですが、文字列ではうまくできません。結局コメントの最後に余計な-が入るようになってしまってます。


 心残りなのが、utf8-stringパッケージを使ってみたのに日本語をうまく表示できなかったところです。googleソースコードUTF-8だったはずなんですが。結局良くわからないです。utf8-stringに関してですが、printなどは一般的に使われているものと衝突してしまうので、完全修飾名で書く必要があります。これはふつうのHaskellプログラミングにのってました。完全修飾名でしかアクセスできないようにすることも可能なようです。


 このコードに関してはこれぐらいにしてまた別のなにかを作ろうと思います。