/* 簡単なプログラムをウプしよう */
■ このスレッドは過去ログ倉庫に格納されています
0001まだ初心者なの
02/06/27 02:02ID:HvMYma0gゲームやアルゴリズムをUPしたり
語り合ったりするスレッドです。
勉強用ですので、言語の選択についてや
ゲームが面白いかどうかの議論は禁止の方向で。
UPする方は使用言語を明記してください。
どうか盛り上がってください。おながいします。おながいします。
0031名前は開発中のものです。
02/06/27 06:21ID:???/  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ /
/ このスレは無事に /
/ 終了いたしました /
/ ありがとうございました /
/ /
/ モララーより /
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/
∧_∧ / /∧_∧
( ・∀・) / /(・∀・ )
( )つ ⊂( )
| | | | | |
(__)_) (_(__)
0032名前は開発中のものです。
02/06/27 06:49ID:???0033名前は開発中のものです。
02/06/27 07:51ID:???重複禁止のルールを知らない時点で終わっていると思われる。
しかし、「古いから」という理屈があるとは予想していなかっただけに大収穫。
どこの駄板の習慣だろね。<古いから
0034名前は開発中のものです。
02/06/27 10:34ID:???┌― | |‖│|| ―┬────
| | |‖│|| |
| | | ̄ ̄ ̄
| / ̄ ̄∨ヽ. | |
| / ∨. | |___
| /___________ヽ |ガシャン
| / | \/_|ヽ |
| | | ゚| □| \.|
| | | ゚| |\__|つ
| | | ゚| | |
_ ______________│
\ /
\/
∫ フー
∧,,∧ ∬ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ミ,,゚Д゚ノ,っ━~ < 1よ、昔こ〜ゆ〜事されたのか?
_と~,,, ~,,,ノ_. ∀ \ まぁいい、昔の事は聞かねぇから削除依頼出して来い
.ミ,,,/~), .| ┷┳━ \ ________
 ̄ ̄ ̄ .し'J ̄ ̄|... ┃
0035名前は開発中のものです。
02/06/27 13:53ID:bF0gGlDsしたのも上げてホスィんですけど・・・プログラムに興味は
あるんですけど、C++はまだよく分からないので・・・お願いします・・・
0036名前は開発中のものです。
02/06/27 14:04ID:???0037名前は開発中のものです。
02/06/27 15:37ID:???コンパイルだけならC++の知識はいらんぞ。フリーなのもあるから金もいらん。
0038名前は開発中のものです。
02/06/27 17:22ID:???>35は>1が自スレを上げるために書いたレスだと気付け。
>1の文面を読めばこの糞素人が「自分の」スレに
どれだけ執着を持つタイプか伝わってくるだろ?
0039名前は開発中のものです。
02/06/27 19:42ID:ko7YyeNE0040名前は開発中のものです。
02/06/27 23:02ID:???あまりレスを付けない方針でいきましょう。
>>35
実行してもあまり楽しいものではないですが…
FLASHへの移植を検討中ですので、期待せずに待っててください。
0041名前は開発中のものです。
02/06/27 23:04ID:???検索とか使わないで今までの勉強の成果のみでやってみます。
いちおうポーカーが遊べる状態にはなりました。
あとは役の判定とかを作ればいいと思います。
1つのファイルにまとめて書いてしまっているので
見にくいでしょうが…
C++です
ソースのみ
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/poker01.txt
実行ファイル込み
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/poker01.zip
0(替える)と1(残す)をスペースで区切って5つ入力後Enterです。
<例>
0 1 0 0 1 (1,3,4番目のカードを替える)
変な入力をするとバグりますので
その時は、Ctrl + C で終了してください。
0042名前は開発中のものです。
02/06/27 23:46ID:???#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..");
}
}
0043名前は開発中のものです。
02/06/27 23:49ID:mqIF8vG.配列の勉強中。理想は式を打ち込んだら構文を解析して勝手に計算してくる奴作りたいdeath!
0044名前は開発中のものです。
02/06/28 00:56ID:xUNqH2JY0045名前は開発中のものです。
02/06/28 01:26ID:81Hj0kfA0046名前は開発中のものです。
02/06/28 01:29ID:???0047名前は開発中のものです。
02/06/28 13:31ID:???0048名前は開発中のものです。
02/06/28 19:24ID:???y=ax+bが
yax*b+=に変換して計算するやつ。
0049名前は開発中のものです。
02/06/28 19:56ID:???0050名前は開発中のものです。
02/06/28 21:00ID:???変な入力をするとバグるのは相変わらずです…
カードの交換操作は>>41と同じです。
C++です。
ソースのみ
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/poker.txt
実行ファイル込み
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/poker.zip
相変わらず見難いソースですが…
他のテーブルゲームのclassをいくつか作れば
カジノになりますねー。
0051名前は開発中のものです。
02/06/28 21:11ID:tpZVIR7wイヤ、なんと呼ばれるのかは知らないが、そんな高級なのじゃないと思う。
入力を配列に入れて、その配列の要素が数字か文字か判定していくニダ
たとえば「15*3」と入力する。プログラムはそれを配列に入れ、まず変数aに15を入れ、*を読み込んで掛け算モードにして、
3を読み込んで変数bにいれて計算。配列の中身を一つずつ調べてそれが数字か文字か判定するって感じかな!
しかし、「{(10+3)*5}/5」とかはどうやってやるのかなあとか思うので、みんな考えてチョ
まあコンピュータにやらせるなら逆ポーランドは便利な記述法なのかなと思う
0052名前は開発中のものです。
02/06/28 21:23ID:???僕はまだ、クイックソートやマージソートが
何をやっているのか、ってのがやっと解りはじめた
程度のヘタレなんですが…
難しいですね。
全くと言っていいほど、やり方が思いつかないです。
()内の式を再帰で渡す形でバラバラにしていくのかなぁ?
頭の体操になりそうなので、毎日ちょっとずつ考えよう…
0053名前は開発中のものです。
02/06/28 21:39ID:tpZVIR7wのほほんと頑張ろうぜ
0054名前は開発中のものです。
02/06/29 09:50ID:???まず、逆ポーランド記法に数式をなおす。
{(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]を出力して終了。
0055名前は開発中のものです。
02/06/29 13:34ID:???0056名前は開発中のものです。
02/06/29 14:26ID:???不覚にもハマッタよ。>>ポーカー
でも、もしかしたら
ロイヤルストレートってところで
入力をミスってオジャンにナターヨ。
入力ミスのチェックはしないのかな?
005750
02/06/29 16:08ID:???>>56さんの書き込みを見て、何となくソースを
見直してみたんですけど、Flashの判定でバカなミスをかましてました。
コッソリ修正しておきましたので報告です。URLは>>50と同じです。
>>56
僕がヘタレだからエラーチェックが入っていないってのも
あるんですけど、後で再利用したり、手を加えることを考えて、余計な
コードは書かないようにしています。暇があったら改良してやって下さい。
あと、すいませんが遊ぶ時は修正版をダウンロードし直して下さい…
005850
02/06/29 16:13ID:???>逆ポーランド記法に数式をなおす。
これがえらい難しいですね…
難しいというか、ただ面倒くさいだけなのかもしれませんが。
検索すれば答えはあるんでしょうけど、なんとか
自分で作ってみたいなぁ。
0059名前は開発中のものです。
02/06/29 20:37ID:???構文解析でも基礎中の基礎じゃないか。
優先順位と括弧にだけ気をつければ良いんだから。
0060名前は開発中のものです。
02/06/29 23:23ID:???#! /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
0061名前は開発中のものです。
02/07/01 04:10ID:???+ - * / 演算に対応しています。小数の使用可です。
()は使えません。入力時にスペースとタブを入れても大丈夫です。
今回はC言語です。
ソース
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/MtoB.txt
実行ファイル込み
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/MtoB.zip
なんか、ソースのコメントからして駄目さがにじみ出ていますが。
>>59
とりあえず、自分の理解した範囲で挑戦しました。
いずれ、完璧なものが出来たらUPさせていただきます。
>>60
rubyなのですか?僕には読めません…スマソ
0062名前は開発中のものです。
02/07/01 05:21ID:???たぶん、コレも興味が持てるだろう
0063名前は開発中のものです。
02/07/01 14:52ID:???上にあるのは糞スレばっかり。
健闘を祈ります。
0064名前は開発中のものです。
02/07/01 16:47ID:???0065名前は開発中のものです。
02/07/04 13:25ID:???0066名前は開発中のものです。
02/07/05 01:55ID:???UPする(意味がある)ものが少ないです。というわけで
>>3をFLASHに移植してみることに。
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/Maze.swf
(IEならF5で)リロードしてみてください。
毎回違った迷路が作成されるはずです。今はこれだけです。
これをもとに、ちょっとしたミニゲームを作る予定…(未定ですが)
ソース(ファイルを開くのにFLASH5が必要です)
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/Maze.zip
なんか、FLASHだと(C/C++と比べて)混沌としてしまいますね。
でも、ActionScriptが分かる人なら簡単に改造できると思います。
ソースの80%ほどは、>>3のC++のソースからのコピペで済みました。
次回のUPまでに、もう少しコメントをしっかりと書いておきます。
0067名前は開発中のものです。
02/07/05 14:32ID:???回転にはクォータニオンを使ってます。
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));
//続く
0068名前は開発中のものです。
02/07/05 14:37ID:???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();
}
006968
02/07/05 14:43ID:???×//ベクトルとして合成
○//ベクトルとする
です。んでは学校行ってきます
0070名前は開発中のものです。
02/07/06 13:05ID:???>>3の迷路生成クラスを、少し改良しました。
コンストラクタに二つの仮引数を渡すことで、迷路の大きさを自由に決定できます。
ソース
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/newMEIRO.txt
実行ファイル込み
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/newMEIRO.zip
変数名、コメントなども少しだけ改めました…精進します。
0071名前は開発中のものです。
02/07/06 13:12ID:???3Dですか〜。ゲーム製作の香りがしますねぇ。
僕は、どちらかというとゲームのルール自体は
2D前提で考えますね。(表示には3Dも使ってみたいですが)
ローグみたいなゲームを製作中です。
細かいデータをチマチマといじるのが好きなので。
あと、書き忘れましたが>>70はC++です。
0072名前は開発中のものです。
02/07/06 15:12ID:???実行してないから分からないんだが、生成した迷路データで
3D迷路を探索するゲーム作ったら?
Wizとか女神転生とかみたいな感じの。
0074名前は開発中のものです。
02/07/07 10:11ID:???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;
}
0075名前は開発中のものです。
02/07/07 17:29ID:???ゲーム作るのにCOM使うのってどんなときですか?
xファイルを読み込むのぐらいにしか使ったことないyo
0076名前は開発中のものです。
02/07/09 14:54ID:???少しソースを見たけど
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<new>
は良くない無いなぁ、拡張子はきちんとつけようよ。
0077名前は開発中のものです。
02/07/09 16:07ID:???ネタはageて書こうぜ
0078名前は開発中のものです。
02/07/11 17:40ID:???迷路ばっかりいじくっててナンですが
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/mimiMaze.html
↑↓←→キーで移動できます。ミミズです。壁(固い土)も掘り進めます。
スクリプトの処理が多少重いので、環境によっては動きが悪いかもしれません。
これから、どんなゲームにしようか考えます。
>>78
大体は本で読んだとおりに書いているのですが…
ヘッダーファイルの拡張子は付けた方がいいのでしょうか?
ちょっと、検索してみます。すみませんが、まだ言語の理解が足りてないので…
0079名前は開発中のものです。
02/07/11 18:18ID:???最近、
#include<hoge>
ってくっつけて書くのが流行ってるのかなぁ?
0080名前は開発中のものです。
02/07/11 18:25ID:???include が関数名で(笑)。
0081名前は開発中のものです。
02/07/11 18:37ID:???○ #include <hoge>
ですか?
コンパイラによっては正しく認識されなかったり
するのでしょうか…(僕はVC++6.0しか使ってないです)
0082名前は開発中のものです。
02/07/11 19:07ID:???でも問題なしなんだろうけど、気になるね。
#include <hoge.cpp> とか #include <hoge.c>
で直接コンパイルしちゃう方法もあるから、ヘッダーファイルって事を明らかにする為にも
#include <hoge.h>
の方がいいとおもうよ。
0083名前は開発中のものです。
02/07/11 19:59ID:???#include<cstdlib>
#include<ctime>
#include<new>
でもコレはC++標準じゃねーか
0084名前は開発中のものです。
02/07/11 20:28ID:???スマン、俺の知識が古かったのかもしれん。「C++標準」って言葉の意味が分からん。
VC++ではそうなるってこと?
それとも全てのC++で共通ってことなのか?
余計なこと言ったかもしれんな、逝ってくるよ・・・。
0085名前は開発中のものです。
02/07/11 20:39ID:???Standard C++規格のライブラリで規定されている
0086名前は開発中のものです。
02/07/11 21:14ID:???調べてみましたが、C++ではファイル名の
重複を避ける為、拡張子を付けない形になっている
とのことでした。(違うのかもしれませんが)
ちなみに、conio.hはcconioってのが無いみたいなので
適当に#includeしちゃいました。
>>72
遅レスですが
実際にRPGみたいなゲームを作るときは
僕はランダムマップにはしないと思います。
出現する敵、アイテムに加えてマップまでランダムだと
バランスを取るのが大変ですし、1000回遊べる〜とかには興味がないので…
1〜2回でも満足できるゲームにするつもりです。
0087名前は開発中のものです。
02/07/11 21:16ID:???0088名前は開発中のものです。
02/07/12 10:58ID:3cFLSzxg0089名前は開発中のものです。
02/07/12 11:06ID:???{
printf("88逝ってよし\n");
}
0090名前は開発中のものです。
02/07/12 12:06ID:???数式じゃなくて、書き出すプログラム?
余り関係ないが、参考になるかも。
http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/index.html
0091名前は開発中のものです。
02/07/12 12:08ID:???今…
88が…
… 逝 く ! ! ! ! ! ! !
0092名前は開発中のものです。
02/07/12 13:11ID:???ギャー!! これじゃー!! たぶん…
サンクスコーヽ(´д`)ノ
いやね、当方プログラマじゃないしなる気もないのでなんかスクリプトっぽいので
ミーシューでSTGを作ろうと思ってたのですよ。そしたら逝ってよしとか言われてるんです。
もうね、逝くかと、死ぬかと。
ごめんなさい。
00933D太郎
02/07/12 20:37ID:0q0E/8gY#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();
}
}
0094名前は開発中のものです。
02/07/12 20:57ID:ta2l.s0cで,分岐してからcolor調べずに分岐する前に調べたらどうでしょう?
0095名前は開発中のものです。
02/07/12 21:08ID:???状態を保存しておけば?
0096名前は開発中のものです。
02/07/12 21:25ID:???> int cnt = checkEraseBlock( x, y, block[ x][ y].getColor());
> if( cnt > 4) EraseBlock( x, y, block[ x][ y].getColor());
つながってる個数を調べるのと消すのを同時にやってるのが悪い。
cntは、各ブロックに覚えさせておいて、全ブロックのcntを計算してから
4以上のブロックのぷよを消せば、2回目の再帰は要らない。
再帰を使わないやり方もあるけど、ぷよぷよの場合は、返って効率悪いかな。
0097名前は開発中のものです。
02/07/12 21:29ID:???00983D太郎
02/07/12 22:33ID:0q0E/8gY各blockにstateflgを記録し、Actived(存在する)ならtrueを返します。
isActivedに変えました^^;colorを調べる順番変更させていただきました。
>>95>>97
blockの中に状態保持フラグがあり、そこで同動作を実現しております。
>>96
再帰の途中では、cnt<4の状態があり、この状態で2度と訪れない場合が
存在します。cnt>4条件で消していると、これらが消されないように思うのですが、
どうでしょうか?
0099名前は開発中のものです。
02/07/12 22:40ID:???関数から戻るフェーズで一番下の層からの戻り値(カウント)をセットすれば?
0100名前は開発中のものです。
02/07/12 22:53ID:???斜めにつながるぷよぷよ?
無限再帰してるようにも見える。
get*()関数はもしかして内部状態を変化させていますか?
01013D太郎
02/07/12 23:11ID:0q0E/8gYcnt = checkEraseBlockの下に状態変化関数を入れ忘れておりました。
上記は妄想関数です。アルゴリズムだけでも伝わればと思ったのですが、
本末転倒しております。
いくつか落ちゲーに必要なアルゴリズムがそろったらきちんと
コーディングしたいと思っております。
0102名前は開発中のものです。
02/07/12 23:47ID:???だから、
> 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みたいなことをすると良い。
0103名前は開発中のものです。
02/07/13 01:01ID:.X0DkgxQ自分のものっけてみようかと。
分けわかんない型や関数があると思いますが、
そのへんは想像か、見なかったことにしてもらう方向で。
こんなもんのっけるんじゃねーって人は無視してください。
0104大学1年生
02/07/13 01:02ID:.X0DkgxQ自分のものっけてみようかと。
分けわかんない型や関数があると思いますが、
そのへんは想像か、見なかったことにしてもらう方向で。
こんなもんのっけるんじゃねーって人は無視してください。
0105大学1年生
02/07/13 01:03ID:.X0DkgxQ{
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);
}
}
0106大学1年生
02/07/13 01:04ID:.X0DkgxQ{
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;
}
0107大学1年生
02/07/13 01:05ID:.X0DkgxQ{
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重カキコすいませんでした。
0108名前は開発中のものです。
02/07/13 12:20ID:???書いてホスィね。作ろうとしているものがイマイチ分からんです。
もしくは、一部だけじゃなくて全部を上げるとか。もちろん動く形でね。
0109名前は開発中のものです。
02/07/13 20:17ID:???0110名前は開発中のものです。
02/07/13 20:40ID:???スタックとwhileでどうよ?
0111>>109
02/07/13 22:57ID:???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");
}
}
0112111
02/07/13 23:00ID:???gccで動作確認しますた。
0113大学1年生
02/07/14 01:47ID:6shM2PBsBool == 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太郎さんと同じアルゴリズムです。
動く形で全部(一部でも)アップするのはいっぱいファイルがいるので無理です。
かなりわかりにくい説明だと思いますけど、これが限界なんで。
分からなかったらすいません。
0114名前は開発中のものです。
02/07/14 02:08ID:???実行可能な状態でUPすると著作権侵害に触れるんだっけ?
確か、ブロック崩しはOKだったよね。
0115名前は開発中のものです。
02/07/14 02:23ID:???ほんと?著作権なの?
意匠権とか、特許じゃなくて??
0116名前は開発中のものです。
02/07/14 09:55ID:fsyX9X4cでも著作権って、アイデアは保護されないはず。
ソースコードには著作権があるので、
1から作れば問題ないとかあるとか…。
結局のところどうなんだ?
>>114の話もよく聞くし・・・
0117114
02/07/14 10:36ID:???「アルゴリズム」自体には著作権は
認められていないと思うけど、ゲームの
ルール自体には認められているから…
普通に考えて、商用のゲームのコピーを勝手にUPするのはNGかな、と。
2chでは、「ぷよぷよ作ろう」みたいなスレッドが普通に立って
普通にUPされているからちょっと気になった。
でも、このスレには関係の無いことだったかな。汚してスマソ。
0118名前はデバッグ中のものです。
02/07/14 11:06ID:???なるほど。
|2chでは、「ぷよぷよ作ろう」みたいなスレッドが普通に立って
|普通にUPされているからちょっと気になった。
同意。なんか、違和感を覚えた。
誰もスレで指摘していなかったような感じで。
0119名前は開発中のものです。
02/07/14 11:51ID:???判例とかあるのかな?
0120114
02/07/14 12:11ID:???>>119
ゲーム関係の裁判は様々な主張が入り乱れていて
絶対的な判例ってのは、まだ無いと思います。
ルールって表現はマズかった。
だが、ぷよぷよのルール(ゲーム)はプログラムと
何らかの視覚表現があって成立するものだから
プログラムに視覚表現を含めてUPするのは危険だと思う。
0121名前は開発中のものです。
02/07/14 12:45ID:???0122名前は開発中のものです。
02/07/18 01:13ID:???山に登ろうとした日に台風が来て、もうアホかと。
では、気持ちを新たにUPさせていただきます。
以前話題に出た、逆ポーランド記法への変換アルゴリズムです。
>>61のプログラムが少し進化しました。
()に対応しました。
また、 (-(47 + 12) / 8) のように括弧の前のマイナス記号にも対応してます。
それ以外は>>61と同じです。 + - * / の四則演算ができます。
C言語です。
ソース
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/newMtoB.txt
実行ファイル
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/newMtoB.zip
ソースは見るに値しない状態(きたない)ですが一応あげさせていただきます。
<<続きます>>
0123名前は開発中のものです。
02/07/18 01:15ID:???アルゴリズムは () 内の式を再帰で渡していく
というものです。括弧の前のマイナスは
-(8 + 7) → -1 * (8 + 7) という風に変換して渡してます。
自力で無理やり作ったものなので、無駄が多いと思います。
誰か、より完璧なアルゴリズムをご存知でしたら教えていただきたいです。
どちらかと言えば、マ板向きの話題なのかもしれませんが…
また、>>122のプログラムの動作について指摘がありましたらお願いします。
ぷよぷよの話題に関しては、僕の効率の悪い、初心者気合アルゴリズムで
場を荒らしてしまうような気がするので、ROMさせていただきます。口惜しや…
0124名前は開発中のものです。
02/07/18 01:27ID:???ム板に訂正…
しかも>>78で自爆レスしてる…
>>76に訂正です。
0125名前は開発中のものです。
02/07/18 02:25ID:VUqV/Vc.同人誌と同じようなものだし、別に責められるほどのものではないんでは?
ただ、ぷよぷよアルゴリズムの権利者(って今どこが持ってるんだ?)から
クレームがあるかもしれないことを認識しておく必要があるとは思うが。
0126名前は開発中のものです。
02/07/18 09:24ID:???0127名前は開発中のものです。
02/07/18 09:39ID:???しかも、プログラムをただ公開しただけじゃ、特許権侵害にはならないんじゃなかったっけ?
0128名前は開発中のものです。
02/07/18 14:04ID:???()に付いているマイナス記号の判定、スペースやタブで
区切って式を入力した際の不具合を修正しました。
修正した実行ファイル
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/newMtoB2.zip
例えば (9+8*7)/6-(-((5-4)*(3+2))) という式を与えた場合の出力は…
(修正前)9 8 7 * + 6 /-1 -1 5 4 - 3 2 + * * * -
(修正後)9 8 7 * + 6 / -1 5 4 - 3 2 + * * -
と、なっています。
まだバグがありそうですし、汚いのでソースのUPは今回は見送ります…
0129>>128
02/07/18 16:25ID:???計算できる形になってるみたいだしいいんじゃない?
ソースについてのコメントは控える。(w
0130名前は開発中のものです。
02/07/18 21:01ID:eG1jD3wM0131名前は開発中のものです。
02/07/18 21:29ID:???コメントありがとうございます。少しだけ自信がつきました…
今のところはバグが見当たらないので
逆ポーランド記法の式を計算する関数も作ってみました。
入力された式を逆ポーランド記法に変換して表示し、計算結果も表示されます。
C言語です。
ソース
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/calculation.txt
実行ファイル
http://www.geocities.co.jp/SiliconValley-Cupertino/8770/calculation.zip
動作などに関する意見や質問があったらよろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています