1 :
まだ初心者なの :
02/06/27 02:02 ID:HvMYma0g 比較的規模の小さい ゲームやアルゴリズムをUPしたり 語り合ったりするスレッドです。 勉強用ですので、言語の選択についてや ゲームが面白いかどうかの議論は禁止の方向で。 UPする方は使用言語を明記してください。 どうか盛り上がってください。おながいします。おながいします。
削除依頼だしました。 糞スレ認定。
3 :
まだ初心者なの :02/06/27 02:03 ID:HvMYma0g
o /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / / このスレは無事に / / 終了いたしました / / ありがとうございました / / / / モララーより / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ∧_∧ / /∧_∧ ( ・∀・) / /(・∀・ ) ( )つ ⊂( ) | | | | | | (__)_) (_(__)
>>2 そこを何とか。
プログラムを積極的にうpする
スレッドが無いのは寂しいので…
>>1 諦めるなよ。ちゃんとレスを付けて育てていけば、どこかの誰かがいっぱ
しのレスを付けてくれる。
それまで何とかジサクジエンでもいいからレスを付け続けろ。
諦めたらそこでおしまいさ。
8 :
名前は開発中のものです。 :02/06/27 02:24 ID:HvMYma0g
とりあえず
>>1 は(必要な時以外は)名無しになります。
>>7 がんばります。
いきなり終了ってのは
新手の「2げっとズザー」なんでしょうか。
今日は(日付変わってるけど)もう寝るので
明日からは日々の勉強の成果を
少しずつ上げていこうと思います。
レベルの高い人も、自信の無い人も気軽に参加してくださーい。
俺は伝統ある
>>9 のスレを支持。ていうかスレ立てる前にちとためらってクレヨン。
ただでさえ人もカキコも少ない板なのに、同様の主旨のスレが 乱立して情報があちこちに散らばるのは良くないよ。
>>># 一種の隔離スレです。<<< あっちは最初にこんな風に書いてあるから感じ悪いし、 鯖に負荷が掛かるし、タブやらスペースが消えちゃうからダメダメ
再利用かよ。最終カキコが02/04/28か・・・ 誰が利用すんだよ。そんなの・・・ そりゃ気がつかねーぞ。 こっちを本スレにすりゃいいじゃんよ。
>15 この板ではすんごい遅レスをたまに見かけたりするし、 問題ないと思う。 それはいいけど、普通スレ立てる前に検索くらいはするだろ。
んじゃー聞きたいがこのスレはどうするつもり? 削除依頼か?
18 :
名前は開発中のものです。 :02/06/27 03:40 ID:Dm9fIHXU
>>17 削除依頼されて何のデメリットがあるのかね。
このスレを失うことで、一体誰が損をするというのかね。
君はそもそも何のために闘争しているのかね。
今日は削除依頼どころじゃない騒ぎになってるね。 多分、例のコピペが貼られる→自然に下がるっていういつもの パターンになっちゃう。 んでスレの存在を皆が忘れた頃に誰かが空age→「上げんなヴォケ」と 誰かが罵倒→再び下がる みたいないつものパターンも考えられる。
やっぱり終了AAウザいっす。 禁止にしてほスィ
終了AA張ってるの一人でしょ アクセス制限しろよ
>>18 そりゃー誰も損はしないさ。
>>1 以外は。
一体、その古いスレに情報を書き込んで何がどうなる?
誰も見ていないスレに情報を集約してどうなるんだ?
事実、「古くなったスレの情報」に誰も興味が無くなったから書き込まな
かった。だから落ちた訳だろ?
誰だかは知らんが、古いスレに誘導してどうなるんだよ。
>>23 どのみち意味などないと知っていて君は意味を求めている。
同じなんだよ。何もかも。
くだらない事はくだらない事であると気付いているなら
2chのあらゆる板の過去に習い、慣習に従えばいいだけなのよ。
無駄なエネルギーロスは賢明じゃない。新しい試みをするなら
もっと重要な物事に対してやればいい。
ワケワカラン方向へ逝っちゃダメ!
んで? 古いレスを上げてどうすんの?
別段、この会話に意味を見出すつもりは一切ないが。
>>1 をそっちに誘導すんの?
>どのみち意味などない
なんだそりゃ。結局、どっちでもいいって事か・・・ この会話の意味って奴は本当になかったんだな。じゃあ上げるなよ・・・ まぁ、、、 どうでもいいがな
今我々にできるのは、1が2chに繋ぐまでやきもきする事だけだ。
>>29 了解した。
これを見て
>>1 がどういう反応するか今から楽しみだ(W
楽しみは今日の夜だな。(WWWWW
o /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / / このスレは無事に / / 終了いたしました / / ありがとうございました / / / / モララーより / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ∧_∧ / /∧_∧ ( ・∀・) / /(・∀・ ) ( )つ ⊂( ) | | | | | | (__)_) (_(__)
激しくジサクジエン臭いレスがいっぱいだな
>>32 重複禁止のルールを知らない時点で終わっていると思われる。
しかし、「古いから」という理屈があるとは予想していなかっただけに大収穫。
どこの駄板の習慣だろね。<古いから
| |‖│|| ┌― | |‖│|| ―┬──── | | |‖│|| | | | | ̄ ̄ ̄ | / ̄ ̄∨ヽ. | | | / ∨. | |___ | /___________ヽ |ガシャン | / | \/_|ヽ | | | | ゚| □| \.| | | | ゚| |\__|つ | | | ゚| | | _ ______________│ \ / \/ ∫ フー ∧,,∧ ∬ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ミ,,゚Д゚ノ,っ━~ < 1よ、昔こ〜ゆ〜事されたのか? _と~,,, ~,,,ノ_. ∀ \ まぁいい、昔の事は聞かねぇから削除依頼出して来い .ミ,,,/~), .| ┷┳━ \ ________  ̄ ̄ ̄ .し'J ̄ ̄|... ┃
35 :
名前は開発中のものです。 :02/06/27 13:53 ID:bF0gGlDs
>>3 のプログラムをコンパイル(って言うんですよね)
したのも上げてホスィんですけど・・・プログラムに興味は
あるんですけど、C++はまだよく分からないので・・・お願いします・・・
goto(sine);
>>35 コンパイルだけならC++の知識はいらんぞ。フリーなのもあるから金もいらん。
>>37 >35は>1が自スレを上げるために書いたレスだと気付け。
>1の文面を読めばこの糞素人が「自分の」スレに
どれだけ執着を持つタイプか伝わってくるだろ?
39 :
名前は開発中のものです。 :02/06/27 19:42 ID:ko7YyeNE
bra $-2
とりあえずスレ違いの話題には
あまりレスを付けない方針でいきましょう。
>>35 実行してもあまり楽しいものではないですが…
FLASHへの移植を検討中ですので、期待せずに待っててください。
足し算するプログラム。モード切替機能付 #include <stdio.h> void main(){ int a,b,c; char m; printf (" *select mode* \n"); m=getchar(); if(m = '+'){ printf(" +tasizan+ \n"); scanf ("%d",&a); scanf ("%d",&b); c = a+b; printf ("%d\n",c); } else{ printf ("kaihatutyuu.."); } }
43 :
名前は開発中のものです。 :02/06/27 23:49 ID:mqIF8vG.
モード切替機能がすごすぎるですね! 配列の勉強中。理想は式を打ち込んだら構文を解析して勝手に計算してくる奴作りたいdeath!
44 :
名前は開発中のものです。 :02/06/28 00:56 ID:xUNqH2JY
ごめん、漏れ1に萌えちゃった。
45 :
名前は開発中のものです。 :02/06/28 01:26 ID:81Hj0kfA
モード切替機能最高にかっこよすぎです。参考にさせていただきます
異次元スレ
異次元配列の勉強中です!
>>43 の式の構文解析って逆ポーランド記法だっけ?
y=ax+bが
yax*b+=に変換して計算するやつ。
再帰下降じゃないのかなぁ・・・内部で式を逆ポーランドにするけども。
51 :
名前は開発中のものです。 :02/06/28 21:11 ID:tpZVIR7w
>>48-49 イヤ、なんと呼ばれるのかは知らないが、そんな高級なのじゃないと思う。
入力を配列に入れて、その配列の要素が数字か文字か判定していくニダ
たとえば「15*3」と入力する。プログラムはそれを配列に入れ、まず変数aに15を入れ、*を読み込んで掛け算モードにして、
3を読み込んで変数bにいれて計算。配列の中身を一つずつ調べてそれが数字か文字か判定するって感じかな!
しかし、「{(10+3)*5}/5」とかはどうやってやるのかなあとか思うので、みんな考えてチョ
まあコンピュータにやらせるなら逆ポーランドは便利な記述法なのかなと思う
>>51 僕はまだ、クイックソートやマージソートが
何をやっているのか、ってのがやっと解りはじめた
程度のヘタレなんですが…
難しいですね。
全くと言っていいほど、やり方が思いつかないです。
()内の式を再帰で渡す形でバラバラにしていくのかなぁ?
頭の体操になりそうなので、毎日ちょっとずつ考えよう…
53 :
名前は開発中のものです。 :02/06/28 21:39 ID:tpZVIR7w
俺は51だが、俺のレベルもそのくらいだYo!>52 のほほんと頑張ろうぜ
逆ポーランド記法は、スタックを使って実現。 まず、逆ポーランド記法に数式をなおす。 {(10+3)*5}/5 → 10 3 + 5 * 5 / と言うようになる。 まずは、数式を逆ポーランド記法になおす関数をつくり、結果を配列A[]にいれる。 次に、逆ポーランド記法の計算をする関数を作る。 A[]から一つずつ要素を取り出して、演算子かどうかを判断しながらスタックに格納していく。演算子だった場合は、計算を行う。 動作1:数字がきているので、そのままスタックに積む。 |10| 動作2:数字がきているので、そのままスタックに積む。 |10| 3| 動作3:演算子"+"がきているので、A[0] + A[1] をして、A[0]に代入。 |13| 動作4:数字がきているので、そのままスタックに積む。 |13| 5| 動作5:演算子"*"がきているので、A[0] * A[1] をして、A[0]に代入。 |65| 動作6:数字がきているので、そのままスタックに積む。 |65| 5| 動作7:演算子"/"がきているので、A[0] / A[1] をして、A[0]に代入。 |13| 動作8:要素がなくなったので、A[0]を出力して終了。
勉強になりますた
>>50 不覚にもハマッタよ。>>ポーカー
でも、もしかしたら
ロイヤルストレートってところで
入力をミスってオジャンにナターヨ。
入力ミスのチェックはしないのかな?
57 :
50 :02/06/29 16:08 ID:???
すいません、ポーカーclassにバグがありました。
>>56 さんの書き込みを見て、何となくソースを
見直してみたんですけど、Flashの判定でバカなミスをかましてました。
コッソリ修正しておきましたので報告です。URLは
>>50 と同じです。
>>56 僕がヘタレだからエラーチェックが入っていないってのも
あるんですけど、後で再利用したり、手を加えることを考えて、余計な
コードは書かないようにしています。暇があったら改良してやって下さい。
あと、すいませんが遊ぶ時は修正版をダウンロードし直して下さい…
58 :
50 :02/06/29 16:13 ID:???
>>54 >逆ポーランド記法に数式をなおす。
これがえらい難しいですね…
難しいというか、ただ面倒くさいだけなのかもしれませんが。
検索すれば答えはあるんでしょうけど、なんとか
自分で作ってみたいなぁ。
逆ポーランドに直すのはかなり簡単だろ。 構文解析でも基礎中の基礎じゃないか。 優先順位と括弧にだけ気をつければ良いんだから。
とりあえずここまで… 残りは後で考えます #! /usr/bin/env ruby def infix_to_postfix(expr) stack = ['('] result = [] operator_priority = { '*' => 50, '/' => 50, '+' => 20, '-' => 20, '(' => 10, ')' => 10, } expr.each{ |x| if '+ - * /'.split.include?(x) # operator while operator_priority[stack.last] >= operator_priority[x] result.push(stack.pop) end stack.push(x) else result.push(x) # operand はそのまま出力 end } while not stack.empty? and operator_priority[stack.last] >= operator_priority[')'] result.push(stack.pop) end result.pop # 最後は'('が入ってるので捨てる result end puts infix_to_postfix(ARGV[0].split).join
逆ポーランドが終わったら正規表現をやると良い。 たぶん、コレも興味が持てるだろう
期待age 上にあるのは糞スレばっかり。 健闘を祈ります。
kusosure washo-i
プログラマの卵がんがれー
メタセコイアっぽいマウスによるカメラの制御方法です。 回転にはクォータニオンを使ってます。 void CMouseListener::RotateCameraPosition() { int dx = mouseoldx - mousex; int dy = mouseoldy - mousey; float dtheta1 = dx*D3DXToRadian(1)/2; float dtheta2 = dy*D3DXToRadian(1)/2; D3DXVECTOR3 axis1 = D3DXVECTOR3(0.0f,1.0f,0.0f); //x-z平面上で見たときの角度を取得 float thetaaxis2 = (float)atan2(-vCameraPos.x,-vCameraPos.z); //π/4回転させる D3DXVECTOR3 axis2 = D3DXVECTOR3(cosf(thetaaxis2),0,-sinf(thetaaxis2)); //続く
D3DXQUATERNION q1,q2, qi1,qi2;//逆クオータニオン //dthetaだけaxisに対して回転 D3DXQuaternionRotationAxis(&q1,&axis1,dtheta1); D3DXQuaternionRotationAxis(&q2,&axis2,dtheta2); //逆クォータニオンを設定 D3DXQuaternionInverse(&qi1,&q1); D3DXQuaternionInverse(&qi2,&q2); //元のカメラの位置ベクトル成分を持つクォータニオン D3DXQUATERNION qPos = D3DXQUATERNION(vCameraPos.x,vCameraPos.y,vCameraPos.z,0.0f); D3DXVECTOR3 vNewPos1,vNewPos2; //それぞれの軸についてカメラの位置を回転させたものを求めて D3DXQUATERNION qNewPos1 = q1*qPos*qi1; D3DXQUATERNION qNewPos2 = q2*qPos*qi2; //ベクトルとして合成 vNewPos1 = D3DXVECTOR3(qNewPos1.x,qNewPos1.y,qNewPos1.z); vNewPos2 = D3DXVECTOR3(qNewPos2.x,qNewPos2.y,qNewPos2.z); //正規化 D3DXVec3Normalize(&vCameraPos,&(vNewPos2 + vNewPos1)); //元の大きさを持たせる vCameraPos*= Dist; //変換行列を作成、IDirect3DDeviceに与える ApplyNewCameraPosition(); }
69 :
68 :02/07/05 14:43 ID:???
ゴメソ訂正 ×//ベクトルとして合成 ○//ベクトルとする です。んでは学校行ってきます
>>67-69 3Dですか〜。ゲーム製作の香りがしますねぇ。
僕は、どちらかというとゲームのルール自体は
2D前提で考えますね。(表示には3Dも使ってみたいですが)
ローグみたいなゲームを製作中です。
細かいデータをチマチマといじるのが好きなので。
あと、書き忘れましたが
>>70 はC++です。
>>71 実行してないから分からないんだが、生成した迷路データで
3D迷路を探索するゲーム作ったら?
Wizとか女神転生とかみたいな感じの。
73 :
67 :02/07/06 22:09 ID:???
>>71 どうもです。一人でちまちまコード打ってると気分が滅入ってくるので
これからもちょくちょく貼り付けさせてもらいにくるかもしれません。
役立たずかも template<typename T, typename U> T co_interface_cast(U from) { T ret; HRESULT result; result = from->QueryInterface( __uuidof(T), reinterpret_cast<void**>( &ret ) ); if ( FAILED( result ) ) { ret = NULL; } return ret; }
>>74 ゲーム作るのにCOM使うのってどんなときですか?
xファイルを読み込むのぐらいにしか使ったことないyo
>>70 少しソースを見たけど
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<new>
は良くない無いなぁ、拡張子はきちんとつけようよ。
>>76 最近、
#include<hoge>
ってくっつけて書くのが流行ってるのかなぁ?
関数呼び出しと同じ感覚なんじゃない? include が関数名で(笑)。
× #include<hoge> ○ #include <hoge> ですか? コンパイラによっては正しく認識されなかったり するのでしょうか…(僕はVC++6.0しか使ってないです)
#inluce<hege> でも問題なしなんだろうけど、気になるね。 #include <hoge.cpp> とか #include <hoge.c> で直接コンパイルしちゃう方法もあるから、ヘッダーファイルって事を明らかにする為にも #include <hoge.h> の方がいいとおもうよ。
#include<iostream> #include<cstdlib> #include<ctime> #include<new> でもコレはC++標準じゃねーか
>>83 スマン、俺の知識が古かったのかもしれん。「C++標準」って言葉の意味が分からん。
VC++ではそうなるってこと?
それとも全てのC++で共通ってことなのか?
余計なこと言ったかもしれんな、逝ってくるよ・・・。
すべてのC++で共通。 Standard C++規格のライブラリで規定されている
>>84 調べてみましたが、C++ではファイル名の
重複を避ける為、拡張子を付けない形になっている
とのことでした。(違うのかもしれませんが)
ちなみに、conio.hはcconioってのが無いみたいなので
適当に#includeしちゃいました。
>>72 遅レスですが
実際にRPGみたいなゲームを作るときは
僕はランダムマップにはしないと思います。
出現する敵、アイテムに加えてマップまでランダムだと
バランスを取るのが大変ですし、1000回遊べる〜とかには興味がないので…
1〜2回でも満足できるゲームにするつもりです。
あと、
>>78 はFLASH5です。書き忘れでした。
88 :
名前は開発中のものです。 :02/07/12 10:58 ID:3cFLSzxg
よくわかんないけどSTGの弾幕の数式書き出すプログラム作ってよ。おながいします。
while(1) { printf("88逝ってよし\n"); }
今… 88が… … 逝 く ! ! ! ! ! ! !
>>90 ギャー!! これじゃー!! たぶん…
サンクスコーヽ(´д`)ノ
いやね、当方プログラマじゃないしなる気もないのでなんかスクリプトっぽいので
ミーシューでSTGを作ろうと思ってたのですよ。そしたら逝ってよしとか言われてるんです。
もうね、逝くかと、死ぬかと。
ごめんなさい。
93 :
3D太郎 :02/07/12 20:37 ID:0q0E/8gY
ぷよぷよ消しアルゴリズムです。2回再帰しなくても良いようお知恵をお貸し下さい。 #define BX 6 #define BY 10 for( int x = 0; x < BX; x ++){ for( int y = 0; y < BY; y ++){ if( block[ x][ y].getActived()){ int cnt = checkEraseBlock( x, y, block[ x][ y].getColor()); if( cnt > 4) EraseBlock( x, y, block[ x][ y].getColor()); } } } int checkEraseBlock( int x, int y, int color, int cnt) { if( color == block[ x][ y].getColor() && block[ x][ y].getActived()){ cnt ++; cnt = checkEraseBlock( x - 1, y + 1, color, cnt); cnt = checkEraseBlock( x - 1, y - 1, color, cnt); cnt = checkEraseBlock( x + 1, y + 1, color, cnt); cnt = checkEraseBlock( x + 1, y - 1, color, cnt); } return cnt; } void eraseBlock( int x, int y, int color) { if( color == block[ x][ y].getColor() && block[ x][ y].getActived()){ eraseBlock( x - 1, y + 1, color); eraseBlock( x - 1, y - 1, color); eraseBlock( x + 1, y + 1, color); eraseBlock( x + 1, y - 1, color); block[ x][ y].setErase(); } }
94 :
名前は開発中のものです。 :02/07/12 20:57 ID:ta2l.s0c
すいませんgetActived()ってなんですか? で,分岐してからcolor調べずに分岐する前に調べたらどうでしょう?
フィールドと同じ配列を用意して、 状態を保存しておけば?
そう。 > int cnt = checkEraseBlock( x, y, block[ x][ y].getColor()); > if( cnt > 4) EraseBlock( x, y, block[ x][ y].getColor()); つながってる個数を調べるのと消すのを同時にやってるのが悪い。 cntは、各ブロックに覚えさせておいて、全ブロックのcntを計算してから 4以上のブロックのぷよを消せば、2回目の再帰は要らない。 再帰を使わないやり方もあるけど、ぷよぷよの場合は、返って効率悪いかな。
ちなみに、配列で状態を保存しておけば一度捜査したところの無駄な再帰は無くなる
98 :
3D太郎 :02/07/12 22:33 ID:0q0E/8gY
>>94 各blockにstateflgを記録し、Actived(存在する)ならtrueを返します。
isActivedに変えました^^;colorを調べる順番変更させていただきました。
>>95 >>97 blockの中に状態保持フラグがあり、そこで同動作を実現しております。
>>96 再帰の途中では、cnt<4の状態があり、この状態で2度と訪れない場合が
存在します。cnt>4条件で消していると、これらが消されないように思うのですが、
どうでしょうか?
再帰なんだけど、末尾再帰ではなく、 関数から戻るフェーズで一番下の層からの戻り値(カウント)をセットすれば?
というか、このコードって動いてるの? 斜めにつながるぷよぷよ? 無限再帰してるようにも見える。 get*()関数はもしかして内部状態を変化させていますか?
101 :
3D太郎 :02/07/12 23:11 ID:0q0E/8gY
>>100 cnt = checkEraseBlockの下に状態変化関数を入れ忘れておりました。
上記は妄想関数です。アルゴリズムだけでも伝わればと思ったのですが、
本末転倒しております。
いくつか落ちゲーに必要なアルゴリズムがそろったらきちんと
コーディングしたいと思っております。
>>98 だから、
> int cnt = checkEraseBlock( x, y, block[ x][ y].getColor());
> if( cnt > 4) EraseBlock( x, y, block[ x][ y].getColor());
をそれぞれ別のループの中で行えということ。
こんな風に。
for(...) { for (...) { block[x][y].setCnt(checkEraceBlock(x, y, ...)); } }
for(...) { for (...) { if (block[x][y].getCnt() >= 4) { block[x][y].setErace(); } } }
これだと前半のループが効率悪いから、
>>97 みたいなことをすると良い。
103 :
名前は開発中のものです。 :02/07/13 01:01 ID:.X0DkgxQ
ちょうど3D太郎さんと同じような処理を作ってたんで、 自分のものっけてみようかと。 分けわかんない型や関数があると思いますが、 そのへんは想像か、見なかったことにしてもらう方向で。 こんなもんのっけるんじゃねーって人は無視してください。
104 :
大学1年生 :02/07/13 01:02 ID:.X0DkgxQ
ちょうど3D太郎さんと同じような処理を作ってたんで、 自分のものっけてみようかと。 分けわかんない型や関数があると思いますが、 そのへんは想像か、見なかったことにしてもらう方向で。 こんなもんのっけるんじゃねーって人は無視してください。
105 :
大学1年生 :02/07/13 01:03 ID:.X0DkgxQ
Sint32 CBoard::EraseBall() { Sint32 point = 0; Sint32 i, erasenum, eraseline = CGameInfo::GetInstance()->GetEraseLine(); Sint32 idxbox[SELLNUM]; for(i=0; i<SELLNUM; i++) { if(Table[i] != NULL) { Table[i]->SetSearchFlag(False); Table[i]->SetEraseFlag(False); } }
106 :
大学1年生 :02/07/13 01:04 ID:.X0DkgxQ
for(i=0; i<SELLNUM; i++) { if(!Table[i]) continue; erasenum = EraseSearch(i % RETU, i / RETU, Table[i]->GetElement(), 0, idxbox); if(erasenum >= eraseline) { //#得点処理 point += erasenum * 10; for(Sint32 j=0; j<erasenum; j++) { Table[idxbox[j]]->SetEraseFlag(True); Table[idxbox[j]] = NULL; //#消去処理 } } } return point; }
107 :
大学1年生 :02/07/13 01:05 ID:.X0DkgxQ
Sint32 CBoard::EraseSearch(Sint32 x, Sint32 y, const CElement &element, Sint32 num, Sint32 idxbox[]) { Sint32 idx = y * RETU + x; if(!Table[idx] || Table[idx]->GetSearchFlag() || Table[idx]->GetElement() != element) return num; Table[idx]->SetSearchFlag(True); if(x < RETU - 1) num = EraseSearch(x + 1, y, element, num, idxbox); if(x > 0) num = EraseSearch(x - 1, y, element, num, idxbox); if(y < GYOU - 1) num = EraseSearch(x, y + 1, element, num, idxbox); if(y > 0) num = EraseSearch(x, y - 1, element, num, idxbox); idxbox[num] = idx; return num + 1; } 2重カキコすいませんでした。
処理の流れやアルゴリズムの簡単な説明くらい 書いてホスィね。作ろうとしているものがイマイチ分からんです。 もしくは、一部だけじゃなくて全部を上げるとか。もちろん動く形でね。
再帰させないアルゴリズムってどうするの?
#include <list> struct group { int _num, *num, color; group(int c) { num = &_num; color = c; } void link(group *g) { if (g != this) { int n = *num; num = g->num; *num += n; } } } *block_g[6][6]; int block[6][6] = { {1, 1, 1, 4, 4, 0}, {1, 0, 1, 0, 4, 4}, {1, 1, 1, 2, 2, 4}, {0, 3, 3, 0, 2, 2}, {3, 3, 1, 2, 2, 4}, {3, 1, 1, 1, 0, 4} }; void erace() { std::list<group*> glist; for (int i = 0; i < 6; i++) for (int j = 0; j < 6; j++) { if (j > 0 && block_g[i][j-1]->color == block[i][j]) (*(block_g[i][j] = block_g[i][j-1])->num)++; if (i > 0 && block_g[i-1][j]->color == block[i][j]) { if (block_g[i][j]) block_g[i][j]->link(block_g[i-1][j]); else (*(block_g[i][j] = block_g[i-1][j])->num)++; } if (!block_g[i][j]) { (*(block_g[i][j] = new group(block[i][j]))->num)++; glist.push_back(block_g[i][j]); } } for (std::list<group*>::iterator i = glist.begin(); i != glist.end(); ++i) delete *i; } int main() { memset(block_g, 0, sizeof(block_g)); erace(); for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) printf("%02d,", *block_g[i][j]->num); printf("\n"); } }
112 :
111 :02/07/13 23:00 ID:???
おっと、#include <stdio.h> がないとだめかも。 gccで動作確認しますた。
113 :
大学1年生 :02/07/14 01:47 ID:6shM2PBs
>>108 すいませんでした。
Bool == bool, True == true, False == false, Sint32 == int
Table[] == 消える対象(CElementのポインタ)がはいってるテーブル
RETU == 列, GYOU == 行, SELLNUM = Table[]のサイズ == RETU * GYOU
ぷよぷよみたいな感じで。
処理の流れ
EraseBall()
idxbox[] == 削除予定のTable[]のIndexを保存するための配列
SetSearchFlagとSetEraseFlagで検索したか、削除対象かのフラグをFalseで初期化
Table[]をすべてEraseSearchで何個つながってるか数を検索
つながってた個数が一定数(eraseline)以上なら削除決定
idxbox[]を使い削除対象のインデックスを習得
SetEraseFlagを使いTrueに設定
Table[] = NULLでテーブルから削除
EraseSearch(列の座標,行の座標,ぷよの色みたいな感じ,何個つながってるか,検索したIndexを入れる配列)
テーブルに存在するか、検索済みか、同じ属性かの判定
SetSearchFlag(True)で検索済みに設定
上下左右で再帰して検索
idxbox[]に検索したアイテムのTableのIndexを設定
自分がつながってたことを表すようにnumに1つ足してreturn
つまり3D太郎さんと同じアルゴリズムです。
動く形で全部(一部でも)アップするのはいっぱいファイルがいるので無理です。
かなりわかりにくい説明だと思いますけど、これが限界なんで。
分からなかったらすいません。
ぷよぷよとかテトリスは(タイトルを変えても) 実行可能な状態でUPすると著作権侵害に触れるんだっけ? 確か、ブロック崩しはOKだったよね。
>>114 ほんと?著作権なの?
意匠権とか、特許じゃなくて??
116 :
名前は開発中のものです。 :02/07/14 09:55 ID:fsyX9X4c
>>114 でも著作権って、アイデアは保護されないはず。
ソースコードには著作権があるので、
1から作れば問題ないとかあるとか…。
結局のところどうなんだ?
>>114 の話もよく聞くし・・・
117 :
114 :02/07/14 10:36 ID:???
>>115-116 「アルゴリズム」自体には著作権は
認められていないと思うけど、ゲームの
ルール自体には認められているから…
普通に考えて、商用のゲームのコピーを勝手にUPするのはNGかな、と。
2chでは、「ぷよぷよ作ろう」みたいなスレッドが普通に立って
普通にUPされているからちょっと気になった。
でも、このスレには関係の無いことだったかな。汚してスマソ。
>>116 なるほど。
|2chでは、「ぷよぷよ作ろう」みたいなスレッドが普通に立って
|普通にUPされているからちょっと気になった。
同意。なんか、違和感を覚えた。
誰もスレで指摘していなかったような感じで。
ルールに著作権が認められてるって本当? 判例とかあるのかな?
120 :
114 :02/07/14 12:11 ID:???
すいません、これで最後にします。
>>119 ゲーム関係の裁判は様々な主張が入り乱れていて
絶対的な判例ってのは、まだ無いと思います。
ルールって表現はマズかった。
だが、ぷよぷよのルール(ゲーム)はプログラムと
何らかの視覚表現があって成立するものだから
プログラムに視覚表現を含めてUPするのは危険だと思う。
というか、著作権云々じゃなくて、製作者としての姿勢的にとか道義的にまずいだろ。
<<続きです>>
アルゴリズムは () 内の式を再帰で渡していく
というものです。括弧の前のマイナスは
-(8 + 7) → -1 * (8 + 7) という風に変換して渡してます。
自力で無理やり作ったものなので、無駄が多いと思います。
誰か、より完璧なアルゴリズムをご存知でしたら教えていただきたいです。
どちらかと言えば、マ板向きの話題なのかもしれませんが…
また、
>>122 のプログラムの動作について指摘がありましたらお願いします。
ぷよぷよの話題に関しては、僕の効率の悪い、初心者気合アルゴリズムで
場を荒らしてしまうような気がするので、ROMさせていただきます。口惜しや…
>どちらかと言えば、マ板向きの話題なのかもしれませんが…
ム板に訂正…
しかも
>>78 で自爆レスしてる…
>>76 に訂正です。
125 :
名前は開発中のものです。 :02/07/18 02:25 ID:VUqV/Vc.
>>117 ほか
同人誌と同じようなものだし、別に責められるほどのものではないんでは?
ただ、ぷよぷよアルゴリズムの権利者(って今どこが持ってるんだ?)から
クレームがあるかもしれないことを認識しておく必要があるとは思うが。
今はセガがもってるんだっけ?
アルゴリズムに認められるのは特許権。 しかも、プログラムをただ公開しただけじゃ、特許権侵害にはならないんじゃなかったっけ?
いろいろと入力してみたけどコンピューターで 計算できる形になってるみたいだしいいんじゃない? ソースについてのコメントは控える。(w
130 :
名前は開発中のものです。 :02/07/18 21:01 ID:eG1jD3wM
>>130 落としてみたのですが、エラーが出て実行できませんでした。
あと、何かを貼り付ける時は簡単なコメント・説明を添えるように
してください…おねがいします。
133 :
名前は開発中のものです。 :02/07/18 23:33 ID:KrSipdXM
ちょっとソースが汚いかも。 GetPriorityOperator関数でcase文使っているけど、この使い方だったら、 if文使った方がまとまると思うよ。あと、再起してる関数じゃないなら、 部分部分にreturn入れないで、retとかいう変数つくって、 そこに戻り値入れて最後に返してやるようにする。 int GetPriorityOperator(char op) { int ret = 0; if(op == '*') ret = 10; else if(op == '/') ret = 10; else if(op == '+') ret = 8; else if(op == '-') ret = 8; else if(op == '\0') ret = 0; else if(op == ')') {printf(")"); ret = 0;} else printf("GetPriorityOperator(char op); 不正な引数\n"); return ret; }
生成されるコードを考えると、そこのソースは元のままでいい。 出来れば、defaultは除去してその前の段階でキャラクタ検査をした方が良い。
>>133-134 レスありがとうございます。
まずは、見やすいプログラムを書くように心がけます。
僕は、まだ生成されるコードの効率とかを
考えるレベルには至っていないのかもしれません…
効率について検索してみたのですが、
>switchは if - elseif …のチェイン(cmp xx jz xx ...)に展開されることもしばしばで、
>こんなものになってしまったらジャンプテーブルに比べて圧倒的に速度が低がするのは想像に硬くありません。
>例えば、switch文の最後に
> default:
> __assume(0); // (VCの拡張機能、ここに来ることは有り得ないと言う事)
>等としてやるとVCに於いてはほぼ確実にジャンプテーブルに展開されるようになります(なるそうです…)。
というのがありました。
というか、生成されるコードならテーブルに展開するのが一番速いけどな
C言語。オセロ。某所より。見て氏ね。 #include <stdio.h> int*i,p,t,a,d,v,m[91]={-10,-9,-8,-1,1,8,9,10},s;void k(){if(m[p]==0)for(i=m;*i ;i++){for(v=p+*i;m[v]==9-t;v+=*i);if(v-p-*i&&m[v]==t&&(s=a=v=p,d))do m[v]=t,v +=*i;while(m[v]-t);}}main(){for(m[40]=m[50]=s=t=3,m[41]=m[49]=6;s-1;a=d=0){for (p=8;++p<82;printf("・\0○\0●\0\n"+m[p]))p%9?k():m[p]=9;for(a?d=a=p=9:s?s=0, puts("pass"):s++;a==9;k())t-6?scanf("%d%d",&p,&v),p+=v*9:++p;t=9-t;}return 0;}
>>137 すごいですね。
俺が授業で書いたオセロは200行ちょい。
このプログラムを改行とかしたら40行弱。
・・・あと4年間で何とかしないとな。
つーか、このオセロはかなり上級者の書いた物だろ 7行スレでも有名な人が書いた物。
140 :
名前は開発中のものです。 :02/07/21 00:04 ID:VfOHqT.A
言語の仕様を熟知していれば
ある程度は可能だと思うが。
別にレベルがどうこうじゃないような。
>>137 みたいなのはオジさん同士で見せ合うのは
たのしいんだけど、若い人は興味無いんじゃないか?
基本的に「実用テクニック」にはなり得ないから。
>>140 勝手に言ってくれるなー
俺もいいかげんおじさんなのか。
sou desu YO!
あのオセロは割り切り方が凄いんだよ。 実装範囲を選んで、機能を限定してそれ専用にチューニングしてる。 こういうことは結構重要で、出来ない奴は結局ここの技術にこだわりすぎて 全体的に効率悪い物しか作れない。 小手先のテクニックも使ってるけど、それだけだと思ったら大間違いだよ。
>>142 10代でおじさんと言われるとは思わなかったYO!
145 :
140 :02/07/21 00:42 ID:???
>141=138か?
>137のは実行してないからよく分からんが
オセロを満たすのに必要最低限のことしかやってないだろ。多分。
そんなのに興味を持つくらいなら思考ルーチンのひとつやふたつ
を作ってみた方がいいですよ。何年かやってれば自然に出来るようになるし。
駆け出しのうちは手に届くものを優先。
>>143 まあ、これが出来なければあれが出来ない、みたいな話は止めましょうや。
>>145 >141=138か?
違う
>のは実行してないからよく分からんが
実行しろよタコ
何もしないで人のプログラムを語るな。
PC対戦付きだボケ
140は、「あんなの凄くねぇ。俺のほうが凄いYO!」って自慢したいだけなんだから、そっとしとこうや。
148 :
140 :02/07/21 09:20 ID:???
>PC対戦付きだボケ その位は見ただけで分かるよ。 でも、どの程度のチェック漏れがあるのかは分からない。 相変わらず実行はしていないから分からないが おそらく比較的、遭遇頻度の低いバグは無視しているのだろう。 七行スレって言うくらいだからそんなことを言うのは野暮なんだろうが。 トイプログラムとして見れば面白いし、レベルも高いと思う。 煽る人が居るし、これで最後にする。
まぁ、なんつーか、思考ルーチンなんて何年やっても自然に出来るもんじゃないよな 簡単な(要するにテキトーな)思考ルーチンや単なる総当たりなら出来るかも知れないが、 有名なαβ法なんかは自然に思いつくたぐいの物でもないしな。 理論的な思考ルーチンなんかはひとつやふたつなんて言うほど簡単に作れるもんでもない。
口を動かすくらいなら手を…ってことじゃないか? 若い人って”出来ないからやらない”じゃん。それはイクナイ。
151 :
138 :02/07/26 03:09 ID:???
>>145 オセロの思考は趣味のほうで作りましたね。
自分よりは強いけど、どの程度かは分かりませんです。
まだ137のプログラムが読める程度なので4年後が心配だったけど、
上級者と知って少し安心です。
でもプロのレベルがいまいち分からないからやっぱりかなり不安・・・。
学生に
>>137 を見てほしいからage
>>140 むしろ若い人ほど7行でどんなことができるかとか燃えそうな気がするなぁ
64kメガデモみたいなもんですかな
見たいのでage。
見たい見たいと騒ぐだけで何も作らないクレクレ厨が発生したので sage。
>>149 普通のオセロは通常読みと必勝読みと完全読みの3ルーチン持ってると思う
>>131 のアルゴリズムって
あれで正しいのですか?
実行してみたんですけどちゃんと動いるみたいでした。
今までノベルゲームくらいしか作ったことが無く
こういうプログラムやったこと無いので興味を持ちました。
RPG風ダンジョン。DOS/Win用。2468で移動、数字なのが敵、 たおしてくと階段 '/' がでてきて、接触で次フロアへ。終わりはq。 int m[9801],X,Y,a,b,i,j,k,l=99,U[99],V[99],W[99],g,h;E(x,y){for(k=1;k<99;++k)if (U[k]==x&&V[k]==y&&W[k])return k;return 0;}D(){printf("\n%dHP M=%d %dF\n",l,g,h );for(j=-3,i=0;i<49;++i){a=X+j;b=Y+i/7-3;putchar(i==24?64:E(a,b)?W[E(a,b)]+48:G (a,b));j=i%7<6?j+1:(putchar(10),-3);}}G(x,y){if(E(x,y))return (l-=W[E(x,y)])<=0 ?exit(puts("YOU LOST\n")):0,--W[E(x,y)]?0:++g,(m[R(49)*2+R(49)*198+g%2*198]=47) ,35;return x<0||x>98||y<0||y>98?35:m[x+y*99];}R(n){return rand()%n;}N(){++h;g=0 ;for(i=0;i<99;++i){U[i]=R(99)*2,V[i]=R(99)*2,W[i]=R(8)+1,m[R(49)*2+R(49)*198+i% 2*198]=35;for(j=0;j<99;++j)m[i+j*99]=(i%2+j%2)>1?R(4)<3?35:46:46;}}M(x,y){i=x+X ;j=y+Y;G(i,j)==47?N():G(i,j)==35?0:(X=i,Y=j);}main(){N();for(;;){D();k=getch(); k==56?M(0,-1):k==54?M(1,0):k==52?M(-1,0):k==50?M(0,1):k==113?exit(0):0;}}
>>157 マップ広すぎ。
あと、視野(見える範囲)はもっと広くていいと思うぞ。
159 :
( ○ ´ ー ` ○ ) :02/10/14 13:41 ID:oQUDul00
ちょっと太っちゃった…
( ○ ´ ー ` ○ )
161 :
名前は開発中のものです。 :02/12/20 00:56 ID:TnNLuwnN
ざっと読んでみたんですが少し勉強になりました。 期待ageさせて下さい!
< < 終 了ーーーーーーーーーーーーーーーー!!!! < ∨∨∨∨∨∨∨∨∨∨∨\ /∨∨∨∨∨∨∨∨∨∨ /:|. | | /:| / .:::| ∨ / :::| | ...:::::| / ::::| i  ̄ ̄⌒゙゙^――/ ::::::::| /_,,___ . _,,,,__,_ :::::::::::\ / ゙^\ヽ.. , /゙ ¨\,.-z ::::::::::\ 「 ● | 》 l| ● ゙》 ミ.. .::::::\ /i,. .,ノ .l| 《 ..|´_ilト ::::::::::\ / \___,,,,,_/ .'″ ^=u,,,,_ v/.. :::::::::::::l! |  ̄ ,,、 i し./::::::::.} | / ,,____ _,/ ̄ \ \ ノ ( ::::::::::| | |.. | /└└└└\../\ \ '~ヽ ::::::::::::::} | .∨.|llllllllllllllllllllllllllllllllllllllll| ::::::::::{ | |.|llllllllllll;/⌒/⌒ 〕 :::::::::::} | |.|lllllllll; ./ . . | ::::::::::[ .| |.|llllll|′ / . | .| :::::::::::| .| |.|llll| | .∧〔 / :::::::::::::/ / }.∧lll | ../ / / :::::::::::::::::\ / /| \┌┌┌┌┌/./ /::: :::::::::::::::::\ ( ゙゙^^¨^¨゙゙¨  ̄ ̄ ̄ /::::::::::: ::::::::::\ ヽー─¬ー〜ー――― :::::::::::::
age
164 :
名前は開発中のものです。 :03/09/16 17:36 ID:rZAhYual
探知キボーヌ ネタ
空AGE やめーい!
このスレで聞くもんでもないと思うんだが、 sageててもIDが出る人と出ない人がいるのは何故?
167 :
名前は開発中のものです。 :03/10/25 16:28 ID:w+myaAmJ
168 :
名前は開発中のものです。 :03/11/14 15:17 ID:4meSYN3s
>>131 のソース
if(GetPriorityOperator(stack[stack_pos]) >= GetPriorityOperator(str[i])){
newstr.str[newstr_pos++] = stack[stack_pos--];
newstr.str[newstr_pos++] = ' ';
}else if(GetPriorityOperator(stack[stack_pos]) < GetPriorityOperator(str[i])){
stack[++stack_pos] = str[i];
break;
}
プライオリティが等しいときも演算子スタックにつまなきゃだめじゃない?
上記だと計算結果はあうけど逆ポーランド法表記的にまずくない?
>>157 うおお、初心者の俺からしてみればすごい・・・。
少し前に長方形領域の移動プログラム(ただ単に移動するだけ)つくってみたけど、
それなんか200行以上もあるよ・・・(
>>157 は見やすいように整えて60行ほど)。
まだまだだなぁ・・・。ってまだCの教科書を1冊も終わらせてないんだけどね。
ポインタの恐ろしさもまだぜんぜんわかんないし。
170 :
169 :04/08/01 21:51 ID:V3JnTtE5
解読しようと思っても今の俺の知識じゃ無理だな
171 :
名前は開発中のものです。 :04/08/01 22:00 ID:V3JnTtE5
うわっ。過疎スレということに今気づいた。 age
172 :
名前は開発中のものです。 :04/08/03 14:15 ID:pwgXpzV7
173 :
名前は開発中のものです。 :04/08/04 18:06 ID:2FqsG8xs
>>172 おつ!見やすい!役立たせていただきます!
174 :
172 :04/08/04 19:12 ID:k/+0Z3FN
お。見てくれた人がいてヨカタ
ささ、愉快な短いプログラムきぼんぬ。
おいらが解読します。
>>137 のオセロは遊び方がわからないので断念しました。
俺そんな人に見せるほどのものは作ってないなぁ。ごめん。 って別に俺に言ってるのかは知らんけど。
176 :
172 :04/08/04 20:05 ID:k/+0Z3FN
いやぁもう誰でもおk
>>174 >>137 のオセロソース、斜め読みしかしてないのでアレだけど
横1桁縦1桁の数字(46とか)で打つ場所を入れるんジャネーノ?
178 :
172 :04/08/05 01:21 ID:yhEwSVU3
>>177 4[enter]
6[enter]
で一手やね。
一応解析してみますかな。
Now Analyzing...
179 :
172 :04/08/05 21:43 ID:muG+oZLA
180 :
172 :04/08/05 21:53 ID:muG+oZLA
ささ、次の7行プログラムをどなたかもってきてください。 当方CかJavaかJavaScriptしか読めまてん。 よろちくおながいします。
ほ
キャベツage
hosu
185 :
名前は開発中のものです。 :2006/09/22(金) 08:30:34 ID:seYHxo/2
ハ,,ハ ( ゚∀゚) おいらをどこかのスレに送って! 〜(ouub お別れの時にはお土産を持たせてね! 現在の所持品:たばこ他48品圧縮.zip・どようび・ドエット 糞スレ・rigel・ギコペ・Jane・ニンバス2000
以下,このスレは私がもらいます.
作成開始
保守
保守
保守するよ
ミ,,゚Д゚彡 < スレ落ちそうやで
192 :
名前は開発中のものです。 :2007/12/30(日) 15:53:16 ID:zzg7G+NL
さらしあげ
新年あけましておめでとうご保守
保守,それはロマン
保守から始まる恋
保守の波動に目覚めたリュウ
もう保守以外愛せない
きれいな保守してるだろ? 死んでるんだぜ
printf("Hello 2ch");
200 :
名前は開発中のものです。 :2011/12/26(月) 19:44:56.10 ID:SWW2uGtW
WinMainで始まり終わる、サブルーチン作る意思さえ全く感じない潔いプログラム見て感動したのは何年前だったか 500行弱+画像数枚のベーマガプログラムだったが、なかなかおもしろかった記憶。
201 :
名前は開発中のものです。 :2011/12/26(月) 23:44:27.85 ID:829V4x+T
保守することが俺の使命
1年半も放っといて何言ってんだか
保守せんでも消えんだろ、この板
title "" repeat dialog "" mouse rnd(1200),rnd(1200) loop
205 :
名前は開発中のものです。 :2012/01/11(水) 16:20:48.31 ID:hRVbo0tD
math.h を使うと著作権法違反になるので使わない #include<stdio.h> //円周率を16桁計算 (VC++) double s(double x){double n=1,i=0;for(;++i< 30;)n=(x/n+n)/2.0;return n;}void main(){for (double n=0,i=1;;i++){n+=1/(i*i*i*i*i*i*i*i );printf("\r%.15f",s(s(s(n*9450))));}}
うpないな
207 :
名前は開発中のものです。 :2013/12/13(金) 22:08:41.97 ID:ZjyASuYa
ゴクリ
208 :
名前は開発中のものです。 :
2014/01/02(木) 00:57:58.02 ID:PykqJcQX 00010001011010101010100101010101000100011101010101000100110000101111101010101010010101010101000