仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

2009年06月

ついに自作ゲーム2作目公開?

技術解説「ぽんこつ自動車」のコーナーもネタが尽きました、一通り終わったので

次回から「地下鉄でGO」の技術解説を始めます


ちなみにババドン開発(黒)裏話 後編 は未だに記事編集中です(!)


この「地下鉄でGO」のゲームは2008年HSPコンテストに参加させたことがあります。


一応標準命令だけで擬似3Dを作ってみたという、自分にとっては画期的なシステムなのですが、


審査員の目にはとまらなかったみたいですね・・・


まちょっと考えてみれば、当たり前です。


そんな大したプログラムでもないし・・


いい加減そろそろ本格3Dでも勉強してみるかな・・




ゲームタイトル


「地下鉄でGO!」

1d7f5758.png

プロデュース 自分

プログラム 自分

グラフィック ?


製作期間

不明


開発言語

HSP


操作

↑↓→←、スペースキー


説明

↓でマスコンを下げる(加速)

↑でマスコンを上げてブレーキ(減速)

→でマスコン、ブレーキ解除(惰性走行)

←でマスコンを一番下に下げる(加速)

スペースキーでオートマチック運転ON OFF

電車でGO!の景色が無いバージョンだと思ってください

あとカーブもなくてずっとまっ直線です。

速度制限もありません


グラフィックは、部で昔の先輩が作ったらしきゲームのやつのを、無断で

転用してきました・・

多分問題なしです。


ちなみにゲームオーバ-、ゲームクリアもありません


永遠に続きます。(ぇ


もっと勉強して、3Dが扱えるようになったら、このゲームエンジンを使って完成させたいと思ってます。


オートマチック運転は、存在意義が不明ですが、まぁ0cm停車できるプログラムなので(たまに外します)

うまく停車できない人は残り距離、速度とブレーキの強さの参考にはなると思います。




嗚呼、誰か3Dのプログラム教えて~

技術解説「ぽんこつ自動車」その4 見えないところに手をかけない

お待たせしました!

久々の技術解説ですね!


とはいえ、そもそもこのコーナー楽しみにしている人はいるのでしょうか・・・(泣)



ま自分のためにやってる部分もあるんで別に寂しくなんかないです・・・・全然・・(ノ_-。)



さて今日は技術解説というより、プログラミングしているときのちょっとしたコツみたいなものを書いてみます。


以下のプログラムはポンコツ自動車のタイトル画面のプログラムです。


マウスポインタをかざすと「GAME START」の文字が大きくなるプログラムです。



repeat -1
await 25
redraw 0
pos 0,0:gcopy 11,0,0,640,480
ifrvdhus=0
if mousex<270:if mousey<373:if mousex>120:if mousey>350:ifrvdhus=2
color 255,255,255:font "MS ゴシック" , 18+ifrvdhus*4 , 1
pos 120-ifrvdhus*5,350-ifrvdhus*2:mes "GANE START"
font "MS ゴシック" , 15
pos 230,460:mes "ハイスコア "+最高+""
getkey key,1:if key:if ifrvdhus:break
redraw 1
loop


ま、人のプログラムなんで見にくいと思いますが・・・


マウスポインタが一定の範囲内にあるとifrvdhusって変数が2になるプログラム


if mousex<270:if mousey<373:if mousex>120:if mousey>350:ifrvdhus=2

という部分に注目してください


これは、文字が大きくなっても小さくなっても、ポインタ当たり判定の範囲が同じ大きさである、ということを意味してます。


実はこれ、手抜きなんです!


本当は、文字が大きくなったら、その分だけポインタの当たり判定範囲を大きくしないといけないのですが、

ちょっとくらいなら誰も気づかないだろう、と思って・・・手を抜きました(笑)



でもこれはプログラマーにとって必要なスキルでもあります。


納期が迫っているのに、誰も見ないようなどうでもいいところに時間をかけているようでは


作業の遅いプログラマーと思われてしまって、いいことが一つもありません。


これでは肝心なところが完成せずに結局ゲーム開発中断、ということになりかねません!


面倒なところや時間がかかる割には誰も評価してくれなさそうなところは(自己満足のためなら別です)


迷わず手を抜きましょう!


しかし、それでは手抜きばっかの必要最低限のことしかできないプログラマーと思われてしまうので

自分の得意分野とするところには時間をかけて、ゲームのクォリティを上げることも大切です。


次回:ついに自作ゲーム2作目公開?

新コーナー、「縛りプログラム」(ネタが無いとき)

昨日は新歓という名の新歓でした!(?)


なんと3次会はカラオケで5時まで盛り上がってました!


歌える曲のレパートリーが中島みゆき以外あまり無いもので、苦肉の策で「セガサターン、シロ」を歌ったら、下手ながらも先輩にウケてました(多分・・・)


さて今日は新しいコーナー開設


「縛りプログラム」です。


様々な条件を自分に課して、かつ動くプログラムを作るというものです。

例えば、たった1行のプログラムで動くゲームを作る、プログラムソースに絶対半角数字を使ってはならない(代入命令も)、見た目がアスキーアートなのにちゃんと動くプログラム・・・などなど


なんかネタが無いときは縛りプログラムを乗っけたいと思います。


他にも、技術解説をするのが面倒で先延ばしするときにも使えそうです



では早速、1行プログラムを乗っけたいと思います!


screen 0,10*48,10*20:buffer 1,48,20,0:font "MSゴシック",20,1:mes "ピッピ":sdim c,64,2:c="ぴ"," ゚":repeat 48:a=cnt:repeat 20:gsel 1:pget a,cnt:b=limit(ginfo_r,0,1):gsel 0:pos 10*a,cnt*10:mes c.b:gsel 0:loop:loop



はい


って1行じゃないじゃんって思うかもしれません!


いやいや、HSPスクリプトエディタにコピペしてみてください!


絶対1行になります


超長い1行に

1億桁×1億桁の開発状況報告②

1億桁×1億桁の開発状況報告2



前はkaratsuba法の名前が出てくるところまで話が進んだんですよね?


前も言いましたがlognint.dllとは、ものすごいながい桁数の数値も計算できるようにするためのプラグインです。


これを使います。


HSPユーザーでこれを使ってる人はなかなか見ないもんで、その技術解説をしているホームページなども見ないので、このブログがHSPユーザーとして一番最初に詳しくlognintについて技術解説することになりそうです!!


なんかうれしい!!


もともと私は四則演算とか(自称)とても得意なんで、一般の人には負けないつもりです!


さてkaratsuba法のプログラムについてですが
ちょっとプログラム的な話ではなく、ほんと数学的な話になりそうですが、まぁ仕方ないですが、許してください


karatsuba法は一言で言うと、とても長い桁数を演算するときに使え、計算手順を効率よくすることで計算時間を短くするという方法の一つです。


実はもっと効率のいい高速フーリエ変換という方法もあるのですが、自分の技術不足でkaratsubaが限界です・・・・


さて実際の手順ですが、



まず四則演算の計算で一番時間がかかるのが掛け算、割り算。


桁数に比例して時間が伸びます。


足し算引き算は、掛け算と比べほとんどゴミのようなものです。


なので、効率化するべきは掛け算です。(割り算は置いておく)



ここでちょっと分かりやすく、10桁×10桁の掛け算を考えます。

本当は千桁くらいから使わないと意味がないのですが


例えば1384501239×5678221098の計算


このとき、普通


a=1384501239


b=5678221098


c=a*b


とこうやりますね?


ここで、桁数を最大5桁に制限し変数を分割することを考えます。


a1=13845

a2=1239


b1=56782

b2=21098


とし


c=a1*b1*10^10+(a1*b2+a2*b1)*10^5+a2*b2


とこうするとします。


ここで*10^10と*10^5は、変数上でも後ろに0がつくだけなので計算時間がまったくかからないものとします


一つ一つの掛け算が5桁×5桁になったので、10桁にときと比べると4分の1になったにですが、これでも、掛け算が合計4つになり、結局計算時間的にはなにも変わりません。


ここでやっとkaratsuba法の登場

括弧でくくりまくって


c=(a1*b1)*10^10+(a2*b2)-((a1-a2)*(b1-b2)+(a1*b1)+(a2*b2))*10^5


とこうします。


一見掛け算が増えたように見えますが、a1*b1とa2*b2のところが2箇所ずつあります


だからそこの計算はしなくていいのです。


簡潔に書くと


c1=a1*b1

c2=a2*b2

c=c1*10^10-((a1-a2)*(b1-b2)+c1+c2)*10^5+c2


とこうなります!


よく見てみると*10^10とか省くと、掛け算が3回に減っています!


これが計算の効率化です。


さっきまでずっと、*10^10をの計算時間を省くのを気にしている人がいるかもしれません


が、実際の計算で、計算結果を一つの変数にまとめなければいけないというルールはありません。


1億桁の計算結果を出力するプログラムでは、1万桁ずつ1万個の変数に区切って出力する方法をとっても


なんら問題はおきないのです(当然繰り上がり処理は別途必要になります)


だから、「この変数は10^10が本来かかっている数」として自分の中で考えておけば、わざわざコンピューターに


*10^10の計算をやらせる必要はなくなるのです。



このようにして掛け算が効率化されました。



次のハードルは、karatsuba法の帰納的活用法です。


4回から3回に減った掛け算の中でさらにまたkaratsuba法を適応して計算時間を4分の3に減らします

プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ