ページ 11

初めて作ったシンプルな自作ゲーム

Posted: 2009年3月02日(月) 21:48
by ひよこ
今日あるゲームができたのです。シンプル イズ ベストのゲームですが
サンプルプログラムの館に入れてもらえるにはどうすればいいでしょうか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 21:59
by kazuoni
おっ。
管理人じゃないですけど、中身が気になります・・・w

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 22:00
by ひよこ
中身は脱出ゲーム?ですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 22:01
by 脱出の人
同じく気になりますww
とりあえず斧にUPしてURL張ってみたらどうですか?
個人的な意見ですが。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 22:10
by ひよこ
http://down11.ddo.jp/uploader/download/ ... %87%BA.zip
アップさせていただきましたPASSはhiyokoです。
あまりにシンプルに作ったのでそんなに期待しないほうがいいと思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 22:22
by kazuoni
シンプルです。とてもシンプルです。
が、もう少しゲーム性を追加したほうが良いかと。。

追加してほしいなっと思うものを挙げてみます。

・長押しに対応(毎度キーを押すのは大変)
・スコア(ゴールまでの時間とか、経路とかで)
・ゲーム中に終了できるようにする
・いけない箇所を作る。
・到達地点を一定の出現場所ではなく、ランダムにする。

こんな感じですかね^^;
スコアでは経路がなかなか凝った感じがします。
最短距離を求めて、オーバーした分だけ減点。
何歩以上かオーバーしたらゲームオーバーとかでもいいですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 22:29
by 脱出の人
まさにシンプル イズ ベストですね。
乱数を使って相手の出る位置をランダムにしたらもっと良くなるかも?
ループを使えばもっと良くなるかも?
と言う初心者の感想ですw

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 22:56
by ひよこ
アドバイスありがとうございます。
乱数はちょっと難しいですがほかはできるだけがんばりたいと思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 23:05
by SooA
加えて途中から偽者出現とかあるとゲーム性がUPするかも?

画像を使って少しだけ違う本物と偽者を用意して、
面?が進む毎に増える偽者、迫るリミットタイム!?

とかどうでしょう。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 23:09
by ひよこ
SooAさんの偽者出現は面白いかもしれませんね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月02日(月) 23:39
by 木霊
ひよこさん

余計なお世話かもしれませんが、枠のDrawLineの整理のついでに乱数を使うようにしたんですが、
改変部分だけアップしましょうか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 01:38
by 木霊
 さすがにおやすみのようなので本来の用件だけ

 Danjon関数内でDrawLine文の羅列がありますが、X(Y)が一定間隔で増加してますよね。
 その場合、for文を使うと便利です。
int I = 0;
for ( I = 0; I < 608; I += 32 )
{
	DrawLine ( I, 0, I, 480, GetColor ( 255, 255, 255 ) );
}
 或いは
int I = 0;
for ( I = 0; I < 20; ++ I )
{
	DrawLine ( I *32, 0, I *32, 480, GetColor ( 255, 255, 255 ) );
}
 このどちらかで19本の縦線が引けます。横線も同じ要領で出来ます。

 乱数はそんなに難しくないですよ。
 今回の場合、横20マス、縦16マスとして考えればいいんです。
rand ()%20
で0~19までの値ができます。
 この値に一マスの大きさを掛ければ表示したい座標が求まります。
なので
( rand () %20 )*32
と書いてやればOkです。

最後に長押し対応は%をうまく使ってやればできると思いますので頑張ってください。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 02:32
by Dixq (管理人)
プレイさせて頂きました。ありがとうございます。
う~んと、せっかくでしたらもう少し作りこんでから掲載してみませんか?
「どっかにいく」じゃなくてある規則で追うと相手をある程度追いやれるとか何かもう少しゲーム性が欲しい気がします。
また途中でエスケープを押せばいつでも脱出成功になるのもちょっと気になったり・・。

また、画像や効果音を用意するとグッとクオリティアップすると思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 14:46
by ひよこ
こんにちは、返事遅くなりました。
いろいろありがとうございました。いろいろ参考になりました。
木霊さん>ありがたく乱数について使わせてもらいます。
Dixqさん>今回はあくまでシンプルに作ってみたので、
次回は効果音用意しておきます。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 21:19
by ひよこ
2代目作ってきました。
http://down11.ddo.jp/uploader/download/ ... %BC%92.zipにアップさせてもらいました。PASSはhiyokoです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 21:40
by 脱出の人
初見で
104秒
スコア9531でしたw
右腕つるかと思いましたw
気づいた点?↓
偽者と本物が重なることがありました。
偽者に重なってる間音がずっとなってました。
別に修正しなくてもいいようなことですがw

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 21:45
by ひよこ
早速プレイしていただきありがとうございます。
脱出の人104秒 スコア9531でしたw >すごくないですか。偽者なくてもそんなに早くできなかったです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 21:45
by kazuoni
おぁ、疲れた。。w
ゲーム性は向上していますが、もう一歩です。

不具合について
・キー入力がおかしい。
っというのも、長押しに対応しているようで、うまくしていません。
4つ(?)ぐらいにしか一気に進みません。
また、一度押したつもりが、ループ毎にインクリメントしているせいか、
一気に進んでしまいます。一度押したら一マス、数十ループで長押し状態にし、一気に移動
っとしたほうが操作しやすいです。

あとはプレーヤー希望です。
・スコアの描写ですが、もろにステージ画面とかぶっています。
ここもステージとスコア描写は分けたほうがよいかと。

・100ステージは結構面倒ですw
もう少し減らすか、レベル別に難易度を変えるとかのが良いかも知れません。
例えば、一気にすべてではなくて、レベルごとに回答を減らすとかですかね。
神経衰弱みたいになってしまいますがw

エンディングが付き、効果音もついたことで、一気にゲーム性が付きました。
この調子で、コンティニュー機能や、一時停止機能など、もっともっとゲーム性を
自分なりにつけていってください^^
難易度が次の目標ですかね^^

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 21:47
by kazuoni
ちなみに、112秒・・・負けた・・・orzそして右腕が・・・orz

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 21:48
by ひよこ
やっぱり100階は面倒ですか。エンディング画面見るために100階大変でしたね。ご苦労様です。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 22:43
by SooA
お疲れ様です。

初回
タイム 191
スコア 883 でした。

残り55階くらいになるまで色の違いに気が付きませんでしたw
自分で言い出しておいてなんという… orz

不具合っぽいので気が付いたのは、
他の方が既に出しているような事ですね。

近場に出現してコンボが決まると気持ちよかったので、
今後はその辺りの演出を攻めてみたらどうかな。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月03日(火) 23:23
by ひよこ
近場に出現してコンボが決まると気持ちよかったので>それって連続で階を進むってことですか?
たしかにそれは気持ちいいですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 00:02
by
プレイさせていただきました。
シンプルでとても楽しくできました^^

100階は確かに少し多い気がしましたが、その分チャンスが増えた気もしました。
(50階で55秒とかの時とかの場合)
100階あったおかげで100秒以内でいけましたし・・・(50秒の時点で57秒くらいでしたorz)
ちなみに、初回は140秒くらいかかりました。

不具合に関してはもう出されていることでした。

個人的な意見ですが、間違ったところに行ったときのペナルティーが少し軽すぎるような気がしました。
あと、相手が逃げるモードなんてのはどうでしょうか?

あまりいいことが言えなくてすいません。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 00:30
by 木霊
 初回で108秒、9124点でした

 4秒負けたorz

 最初の方は偽物なしで慣れてきた頃に偽物登場、更に進むと偽物増える
って方が単調にならないのでステージが多くても長さを感じさせないと思います。

 あと、プレイ中は気にする余裕がなかったんですが、偽物を選んだ時のペナルティはあったほうが
面白くなると思いますよ。

 最後にプログラムの事ですが3点ほど気になっているところを。
1・while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 )
  がプログラム中に3回書かれています。
  内、2つがDanjon関数内にありますが、これらをプログラム中に1回だけで済むようにしてみましょう。
  
2・DrawLineをfor文で回すと36行だったものが6~8行に収まります。
  プログラムも見やすくなるのでfor文の練習と思ってやってみてください。

3・キー入力ですが1、5、10の時に反応するように一方向につき3つのif文が書かれていますが、
  これだと反応回数を増やす度にif文が増えていきます。
  これを1、6、11、16、21・・・にして考えてみてください。
  「%」は割ったあまりを求める演算子なので上の数列とうまく組み合わせればとりあえず長押しできるようになります。
  %の例 10 /3 = 3; 10 %3 = 1;

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 08:47
by バグ
個人的な意見ですが、上下左右でループ移動できるといいかな?と思います。
一番上のマスで上を押すと一番下のマスへ、一番左のマスで左を押すと一番右のマスへ…みたいな感じですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 15:32
by ひよこ
まずモードを作ろうと思ったらエラーが出て困ってます。どうすればいいでしょうか?
------ ビルド開始: プロジェクト: 脱出, 構成: Debug Win32 ------
コンパイルしています...
脱出.cpp
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C3861: '  if': 識別子が見つかりませんでした
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C3861: '  if': 識別子が見つかりませんでした
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C3861: '  if': 識別子が見つかりませんでした
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C3861: '  if': 識別子が見つかりませんでした
ビルドログは "file://c:\documents and settings\デスクトップ\脱出4\脱出\Debug\BuildLog.htm" に保存されました。
脱出 - エラー 16、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 15:46
by 御津凪
エラーの出ている行付近に全角の空白文字が入っています。
それを取り除いてください。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 16:12
by Dixq (管理人)
う、、腕が~!右腕が釣りましたw

>>yuさん

き・・九十六・・。
私は初回ですが、129秒でした。比較になりませんね^^;

>>ひよこさん

GetHitKeyStateAll_2を使っているなら

if( Key[○○] == 1 || Key[○○]> 10 ){
  //移動
}

みたいにすれば押しっぱなしの時も一緒に移動出来ますよ。
後、これは以前言ったかもしれませんが、

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 )

こういう処理は一箇所にだけ書いた方が効率的です。
条件分岐させて処理をさせれば一箇所に書いておけば充分対応出来ます。
また、

SetFontSize( 20 ) ;

この関数は毎回呼んではだめです。
今は大丈夫かもしれませんが、いくつか呼ぶとFPSが60保てなくなると思います。
複数の種類やサイズの違うフォントを作りたい時はフォントハンドルを作ってから描画してあげて下さい。

詳しくはリファレンスに書いてあります。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 16:23
by Dixq (管理人)
上に書いてある事をわかりやすくかくと・・
キーの入力と移動の部分を以下のように書き換えて下さい。

 static int count=0;
 if( Key[ KEY_INPUT_LEFT]==1 || ( Key[ KEY_INPUT_LEFT]>10)  && count%2) x-=32;
 if( Key[ KEY_INPUT_RIGHT]==1|| ( Key[ KEY_INPUT_RIGHT]>10) && count%2) x+=32;
 if( Key[ KEY_INPUT_UP]==1   || ( Key[ KEY_INPUT_UP]>10)    && count%2) y-=30;
 if( Key[ KEY_INPUT_DOWN]==1 || ( Key[ KEY_INPUT_DOWN]>10)  && count%2) y+=30;
 count++;

後、配列要素を1つしか作ってないのに2つめにアクセスしているところがあります。

int Xde[1];
↓
int Xde[2];

このように宣言を変えて下さい。
あと、DrawLineはfor文で書いた方が楽ですよ;

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 17:06
by ひよこ
Dixqさん、ほかの方々いろいろご指導ありがとうございます。
いろいろあって第三代目を作れました、ありがとうございます。
アップローダ様http://down11.ddo.jp/uploader/download/ ... 87%BA4.zip
PASSはhiyokoです。
まず、いろいろ変更があるのでREAD MEよんでください。そうしないとがっかりするかもしれません。
Dixqさんこれくらいのゲームじゃだめですかね?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 17:20
by バグ
操作性がよくなりましたね(^-^)
そのせいか、余裕で100秒を切ってしまうのがなんとも…(苦笑)
でも、こういうシンプルなゲーム大好きです♪(私が作るのもシンプルなものばかりなんで(笑))

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 17:24
by 脱出の人
ハード初見で
92秒
スコア5520
でしたw
偽者に引っかかってスコア減りまくったw
偽者にぶつかるとずらされるのは良いと思いました。
(斜めに移動してたら引っかかったw)
一マス移動は良いと思いましたがZXCVの配置は自分的には使いにくかったですね。
どの上とかがどのボタンか分からなくなって結局あんまり使いませんでした。
自分的にはWASDを使った方がやりやすかったと思います。
でも一マス移動と高速移動のボタン違うボタンに変えたのは良いと思いますよ。
なれれば使いやすくなると思いますし。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月04日(水) 17:28
by ひよこ
さっそく遊んでくださりありがとうございます。
ループ移動やハードモードの改良などやってみました。
ノーマルとレベルの差を結構つけましたよ。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 00:21
by 木霊
 キー判定のところで
if( Key[ KEY_INPUT_RIGHT]%3==1)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==6)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==11)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==16)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==21)PlayerX+=32;
とありますが、Key[ KEY_INPUT_RIGHT]%3の結果は0、1、2のどれかにしかなりません。
 「%」は余りを求める時に使うので、後ろに付いた数字より大きい値になることはありません。
 という事は最初の一つ以外無駄になっています。
 先日の例では5で割って余りが1の時に移動していたので11、16という数字を出したのですが・・・

if ( Key [ KEY_INPUT_RIGHT ] %3 == 1 ) { PlayerX += 32; }
 こう書くだけで押し続けた時に3フレームに1度(60FPSの環境で1秒に20マス)進むようになります。
(ひよこさんの書いた一番上の部分だけを見やすくしただけです)

これを長押し対応にするには、管理人さんの書かれているようにKey [ KEY_INPUT_RIGHT ]の値が、
10(ある程度の大きさの数)以上であり、同時にKey [ KEY_INPUT_RIGHT ] %2(こちらも適当な数字)が1であればいいわけです。
if ( Key [ KEY_INPUT_RIGHT ] == 1 || ( ( Key [ KEY_INPUT_RIGHT ] -15 ) > 0 && ( Key [ KEY_INPUT_RIGHT ] -15 ) %5 == 1 ) ) { PlayerX += 32; }
前半部分(赤い所)が押した瞬間に、後半部分が15フレーム以上押している時(緑色の所)
5フレームに1度だけ(青いところ)移動する(if文の判定が真になる)ようにしたものです。
15のところが押しっ放しにした時に動かない時間です。変数に入れておけば変更しやすいです。
(%の数字を大きくした時に判定にムラができるようなのでアレンジしました。すみません。)

また、管理人さんも仰ったように
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 )
は一つだけにしておきましょう。今回の変更では逆に増えてます。

そういえばもう一つ、空白部分が半角スペース、全角スペース、タブの三つが混在してます。
全角スペースは時にエラーが出るので使わないようにした方がいいです。

サンプルへの掲載を目標にしておられるようなので、特にプログラム面をコメントしてみました。
応援してますよ。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 00:53
by Dixq (管理人)
>>ひよこさん

制作お疲れ様です。
私がこんな偉そうなことをいえる立場ではないですが、
やはりサンプルプログラムとして提示するということは、
みんなこれを参考にして下さいといっているということだと思います。
という事は、ソースコードは解りやすく、適切である必要があり、
もしふさわしくない書き方があるなら適切なものにしておかないといけません。

とりあえず指摘されている所は全て直すようにしてみてください。
また、for文なしで沢山書いている部分をfor文などでまとめ、
意味のない部分を削除し、似たような変数が沢山あるものは配列にし、
書き方を効率化してみてください。
後、関数名がX一文字というのも少し気になります・・。
更に、コードを読んでもらう為には注釈が必要ですので、注釈を適度に入れて下さい。
そして、括弧の対応の仕方に一貫性を持たせ、読みやすくし、字下げも統一して下さい。


>>木霊さん

負の数の剰余が正になることはないので、緑の部分は必要ないかもしれませんね。
(追記:VC++での結果)

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 01:04
by 木霊
 あれ、そうでしたか・・・自分のにはいつもつけてました。
ご指摘ありがとうございます。

後、遅ればせながらウィザード昇進おめでとうございます。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 01:38
by Dixq (管理人)
負の数を割ったあまり・・というのは小学校の時習わなかったし、それ以来使った事も無かったので、
こういう事が正式にあってるのかどうかはしりませんが、
VC++で実行するといつも負になるので、いつもそうしているというだけです^^;

なんかこの辺参考になりそうですね。

http://0xcc.net/blog/archives/000083.html

負の数の剰余については処理系定義みたいです。(C99で明確化されたのかな?)
VC++以外での処理も考えるなら木霊さんが仰った方法の方が適切ですね。



>>ウィザード昇進おめでとうございます。

ありがとうございます。
あまりに遠い道のりですが、リアルもウィザードになれるよう精進しますw

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 12:35
by ひよこ
サンプルプログラムに入れるのはハードモードしか入ってないゲームでいいですか?
サンプルならシンプルのほうがいいと思いましたので。
ただいま関数の整理などやっております。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 18:11
by ひよこ
whileを使わないようにしてみました。
アップローダ様http://down11.ddo.jp/uploader/download/ ... %83%A0.zip PASSはhiyokoです。
あとキー操作をZXCVをWASDにしました。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 18:31
by kazuoni
んん~なぜそこまでサンプルプログラムに希望するかは分かりませんが、^^;
とりあえず、字下げが今のままでは見づらいです。
あとSTAGE_TEKI()はもっと簡単にできそうですね。
今のままだとちょっと長いっといったイメージです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 18:39
by ひよこ
それは今までのゲームと違ってきれいに完成したのってのもありますけど
やっぱりこんな初心者がこんなの作れたよ、わたしにもできるかなって考
えてもらえるとうれしいからですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 18:51
by ひよこ
kazuoniさん>>字下げが今のままでは見づらいです。
どのようにすればいいでしょうか。
kazuoniさん>>あとSTAGE_TEKI()はもっと簡単にできそうですね。
ではどうすればいいでしょうか。自作関数をつかって短縮するといいたいのでしょうか。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 18:57
by 脱出の人
プログラムは見てないんですが、
ゲーム内容的には良いと思いますよ。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 19:22
by kazuoni
ちょっと違うスレのコードですか、こんな感じです。
自分のものと比べてみてください。タブが入ってるかいないかですけど^^;
これのほうが{}の対応関係も見やすいと思います。
(決してこれがいい!っと言うわけではないです。)

>もっと簡単に
別に特に重要ってわけではないんですけど、
if(PlayerX==deguchi2X
以下はすべて同じだと思うので、関数化できるかなと。
敵が4→15になったら面倒かつ長いコードになってしまうので。

あと、今のままでもいいのですが、
STAGE_TEKI()のif文は絶対にすべて条件を調べないといけませんか?
敵が重なっているってことがあれば別ですが、すべての敵がバラバラ
っという条件の時は敵あたりの条件にヒットしたら、
それ以外の敵とのあたり判定はしなくてもよいのでは?
まぁ、if....else if....とするだけなんですけど^^;

ただ、これをしてどうこうっということはないですが、
やはり皆さんに見てもらうっということでは、
以前たかぎさんもおっしゃっていましたが、
「コメントを書かないでも理解できるコード」
に近づけるために、やはり簡潔かつ分かりやすく(「簡潔=わかりやすい」ではないですが・・・)
記述するのが良い気がします。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 19:23
by kazuoni
↑のファイルをVC++で開いてみてください。
(ここで見る限りには見づらいです^^;)
・・・うまくみれないですかね。
とりあえず言いたかったことは、
if(PlayerX==deguchi4X && PlayerY==deguchi4Y){
	PlaySoundMem( Sound , DX_PLAYTYPE_BACK );
	Change[0]=Change[1];
	score+=320;
	PlayerX=PlayerX-32;PlayerY=PlayerY+30;
	}
よりは
if(PlayerX==deguchi4X && PlayerY==deguchi4Y){
		PlaySoundMem( Sound , DX_PLAYTYPE_BACK );
		Change[0]=Change[1];
		score+=320;
		PlayerX=PlayerX-32;PlayerY=PlayerY+30;
	}
のが見やすくないですか?
・・・上手く説明できません。。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 19:48
by BEMANI
>>ひよこさん
遊ばさせて頂きました。
気になった所です。

・キー操作
押しっぱなしが利くのはいいのですが、一マスだけ移動しようとすると
ニマス三マスと移動してしまうので、押しっぱなしをあるフレーム以上来たら・・・
という処理に変えてみるといいのではないでしょうか。
(一瞬だけ押せば一マス移動もできなくはないですが、ちょっと疲れます。)


・音
いきなり大きな音が鳴ってびっくりしました。
音量を下げてみるといいかもしれません。(フリーソフトなどで下げる)


・ソースコード
「1」ソースコードが縦一列に並んでいるのは見にくいかと思います。
どのようにするのか分からないのであれば、「インデント」などで調べてみてください。
参考になるサイトはいくらでもありますので、まず真似してみるといいと思います。

「2」同じような変数が連番で定義されているので、配列にしてみては如何でしょうか?
deguchiX[4], deguchiY[4]のように。


「3」同じ処理を関数にまとめるといいと思います。(STAGE_TEKI)


そこまで急いでサンプルに掲載されなければいけないのでしょうか?
「プログラム初心者がこんなの作れました」という気持ちは分からなくはないです。

が、ゲームだけでなく、ソースも参考にされる可能性があるため、
見にくいソースだと参考にならない、出来ないと思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 20:20
by ひよこ
BEMANIさん一マスだけ移動しようとすると >>
WASDで1マスだけ動けます。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 20:45
by BEMANI
>>ひよこさん
失礼しました。書き方が悪かったです。
「READ ME.txt」にWASDで一マス移動できると、書いてあったのでそれはいいのですが、
移動キーを分けているのはなぜでしょうか?
キャラクター移動を十字キーだけにまとめることは可能だったはずです。
特別な理由がない限り、移動処理(一回だけ押す・押しっぱなし)は
まとめる方がいいのではないかと思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 21:02
by バグ
個人的には別キーも有だと思います。慣れてしまえば押し間違えが少なくて済みますし。
ただ、私が同じ物を作るならば、シフトキーを使うかな?
シフトキーを押したままカーソルキーでスロー移動とか…
このへんは作り手の好みの話になってくるので、こういう意見もある程度に流しておいてください(^_^;)

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 21:11
by ひよこ
BEMANIさん>>確かにそうですけど技術不足・・・・・・だと。
バグさん>>シフトキーでもいいですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 21:21
by lbfuvab
0.5秒(30フレーム)以上押しっぱなしなら連続移動と言う風に実装できると思いますよ。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月05日(木) 23:43
by バグ
それをやるなら、『0.5秒以上押されている、もしくは今押された場合に移動させる』としないと、チョン押しでの1マス移動が難しくなりますね(^_^;)

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月06日(金) 23:44
by ひよこ
自分ではソース整理完了ってとこです。
これで掲載させてもらえませんか。
自分なりに精一杯やらせていただきました。
アップローダ様http://down11.ddo.jp/uploader/download/ ... %BC%92.zip PASSはhiyokoです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月07日(土) 01:10
by SooA
とにかく一行に詰め込みすぎ?な感があります。
参考になるものがあった方が良いと思い
ある程度ソースを変更させてもらいました。

更なる注釈の記入と、今後の参考にしてみてください。

あと、直してませんがファイル名に"ENDINGU"としていますが
正しくはENDINGです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月07日(土) 01:37
by SooA
追記
これも直してませんが、変数名を統一したほうがいいですよ。

人様々ですが、私の場合は
グローバル変数の頭には以下のような小文字を付けます。

b bool
c char
r short
i int
g long
u unsigned
f float
d double
m マクロ
a 配列
p ポインタ
s 文字列
t 構造体
h ハンドル

例えば int型の配列であった場合
int iaKey[/url] といった名前になります。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月07日(土) 13:10
by ひよこ
なるほどこういう風に書けばいいのですか。
KEY関連には便利ですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月07日(土) 13:50
by SooA
隙間無く書かれたプログラムよりも、

DrawBox(PlayerX,PlayerY,PlayerX+32,PlayerY+30,BLUE,TRUE);

ある程度空間を入れることで個々の変数が識別しやすくなります。

DrawBox( PlayerX, PlayerY, PlayerX+32, PlayerY+30, BLUE, TRUE ) ;

コメントを行末ではなく上に移動させていますが、
これにも意味があります。

Sleep(1) ; // コメント

// コメント
Sleep(1) ;

編集するために頻繁にEndキー(行末移動)を使いますが
コメントが行末にあるとプログラム行末への移動の妨げになります。
編集する事が少ない場合や、行末にあった方がわかり易い場合は
そうしますが、それ以外は上のほうが良いでしょう。

ループ処理等を使う場合はインデントを入れて
どの部分がループされるのか処理されるのか分かり易くします。
for( i=0; i<4; i++ )
		// for文で繰り返される段落
		if( PlayerX == deguchiX && PlayerY == deguchiY )
		{
			// if文で処理される段落
		}

※この出口判定部分の deguchiX が deguchiX[1]になっていたので
修正して下さいm(_ _)m

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月08日(日) 10:26
by ひよこ
Dixqさん最終的に最後にアップしたのじゃ、だめですかね?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月08日(日) 20:02
by Dixq (管理人)
またまた私がこんなことをいえる立場では無いですが、掲載するからには、人の手本となるものとなると思います。
言い換えれば人に教える立場だと言うことですよね。
ですから間違いがあると、間違いまで人に一緒に教えてしまうことになりますし、
改善点の指摘が出ているならそれを直すべきだと思います。

とりあえず指摘が出たところは一通り直すようにしてみてはどうでしょうか。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月09日(月) 07:42
by ひよこ
改善点って言うのはソースのみやすさだけでしょうか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月09日(月) 22:22
by Dixq (管理人)
>とりあえず指摘が出たところは一通り直すようにしてみてはどうでしょうか。

ということで、とりあえず指摘の出たところは最低限直すようにしてみてはいかがでしょうか。
指摘が出るということは、ひよこさんのコードを参考に誰かがコードを書いたとき、
その人も同じ指摘を受けてしまうことになりますので・・。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月10日(火) 11:47
by ひよこ
一通り直そうとしたらDixqさんの
static int count=0;
if( Key[ KEY_INPUT_LEFT]==1 || ( Key[ KEY_INPUT_LEFT]>10) && count%2) x-=32;
if( Key[ KEY_INPUT_RIGHT]==1|| ( Key[ KEY_INPUT_RIGHT]>10) && count%2) x+=32;
if( Key[ KEY_INPUT_UP]==1 || ( Key[ KEY_INPUT_UP]>10) && count%2) y-=30;
if( Key[ KEY_INPUT_DOWN]==1 || ( Key[ KEY_INPUT_DOWN]>10) && count%2) y+=30;
count++;
のcountはどういう意味なのですか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月12日(木) 08:33
by Dixq (管理人)
まず、どういう意味なのかな?と思ったら聞く前に意味を理解してみようとしてみて下さい。

「何か解らないな」>「聞く」

より

「何か解らないな」>「調べる、考える、試行錯誤してみる」

の方が上達が早いです。
なお、今回の場合は、countの意味が解らないなら、一度count無しで実行してみたり、
「%2」とかいてあるなら、2回に1回処理するわけですから、「%3==0」にして3回に1回処理するようにしたら
どう変化するかなどを見て、何の為にあるのか調べてみて下さい。

なお、条件式は0か0以外かで真か偽かが決まるので

count%3

これは2/3実行され、

count%3==0

これは1/3実行されます。

さて、どういう意味かお解かりになったでしょうか?


トピック名が「Dixqさんへ質問」よりこちらの題名の方がふさわしいと思いましたので変更しておきました。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月12日(木) 18:48
by ひよこ
やっぱり試行錯誤ですか。
サンプルになれるようがんばります。
ソースは添付しておきました。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月16日(月) 18:56
by ひよこ
試行錯誤で上のソース作りました。
アドバイスお願いします。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月16日(月) 19:14
by kazuoni
書き方等はもういいのでは^^;
あとは分割ファイルにして管理しやすくする、
外部変数を減らす(これは二の次でいいと思いますが・・・)
等が考えられますかね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月16日(月) 19:27
by ひよこ
分割ファイルは技術的に無理ですね。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月16日(月) 19:59
by kazuoni
技術的・・・^^;
「C言語 分割ファイル」
っとググればたくさんの解説ページが出てきますが・・・。
今後のゲーム開発でよほど小規模でない限り、
ひとつのファイルにすべてを記述することは現実的ではないと思います。
ここで知識を身につけてみてはいかがでしょうか?
っと余計な事を言わせてもらいました。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月16日(月) 20:06
by fatens
スコアを10000-scoreとして表示していますが、最初の値をscore=10000としておき、
そこから数値を減らしていく方が良いのではないでしょうか。
そうすれば、114, 134行目の処理がその上のコメントと一致するようになります。
表示する際には、DrawFormatString( 400,400, White, "スコア%d",score ) ; となり、見た目にも分かりやすいと思います。
(同様のことがdeguchicounterにも言えます)

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月16日(月) 21:16
by ひよこ
kazuoniさん>>
分割って調べました。
externを使ってソースを見やすくって意味でしょうか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 00:38
by kazuoni
externももちろん必要ですが、
分割ファイルにすれば、いろいろな管理がしやすくなります。
VC++ 2008 EEならば関数・変数はすぐに検索できたり、
関数においては一覧とかも出てきますが、
.cppごとに役割があるともっと管理がしやすいかと。
例えば
main.cpp→ゲームの流れを制御する関数の集合
draw.cpp→描写専用の関数の集合
calc.cpp→ゲーム内のあらゆる計算をする関数の集合

なんて感じです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 06:32
by ひよこ
extern int とextern void の違いは何ですか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 09:35
by SCI
おそらく、
extern int i;
extern void func2();
などを指していると思いますが、「extern」+「int i」のように考えると分かりやすいです。
つまり、externで外部へ参照している変数の型、関数の戻り値の型が違うだけです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 21:43
by ひよこ
つまりextern int 変数  extern void 関数と考えればよろしいのでしょうか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 21:51
by kazuoni
そう言われればそうなんですが^^;
例えば

コードにいきなり
void Function();
なんて書かれたらコンパイラは何のことか分かりません。

でも
extern void Function();
と書けば、もし関数定義がなされる前にFunction()が出てきても、
「あ、Functionは戻り値voidの関数なんだったんだよな」
っと解釈してくれます。
なのでコンパイルエラーにはなりません。
これは分割ファイルをするにあたって必要です。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 22:06
by fatens
もしかして、変数はすべてextern int、関数はすべてextern voidとすると思っておられるのでしょうか。
そうではなく、例えば、

//a.cpp
int a;
float b;
int func() {}
void func2() {}

としていた場合、これを参照するためには、

//b.cpp
extern int a;
extern float b;
extern int func();
extern void func2();

としなければいけません。

これがSCIさんが仰ったことだと思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 22:18
by SCI
なんか分かりにくくてすみません(笑)
fatensさんの通りです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 22:29
by ひよこ
では型+変数(関数)にexternを型の前につければよろしいのですか?

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月17日(火) 22:33
by fatens
そういうことになります。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月18日(水) 15:55
by ひよこ
一応分割にしてみましたが、なぜか最初の文字がでなくて上の時間と敵も表示されないのですが、
どこが原因でしょうか?
Zipにはソースしか入っておりませんので以前のファイルを使ってください。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月18日(水) 17:25
by fatens
文字は表示されていますが、初期化する関数が呼ばれていないので、黒で書かれています。
そのため表示されないように見えますが、移動してみれば分かります。
また、画像をロードする処理も行われていないようです。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月18日(水) 18:17
by ひよこ
fatensさん>>ありがとうございます。なおしてみたら文字も絵も出るようになりました。

Dixqさん>>かなりソースも変わりました。これでよろしいのでしたら新しくUPします。

下に修正したものをおいておきます。
#include "DxLib.h"
#include "GlobalVariable.h"

extern void	Draw();
extern void img_sound_load();
extern void KEY();
extern void Set_Shoki();
extern void stage();
extern void stage2();				   
extern void	STAGE_TEKI();
extern void TEKI_HANTEI();

void Opening()
{	
	//大きい文字にする。
	SetFontSize( 64 ) ;
	
	DrawString(100,100,"脱出ゲーム",White);
	
	DrawString(100,200,"Z ハード",White);
	
	if(Key[KEY_INPUT_Z]==1)
	{
	SetFontSize( 20 ) ;function_status=1;
	}

}
void Danjon()
{
	stage();
	stage2();
	Draw();
	
	KEY();
	
	STAGE_TEKI();
	
	if(deguchicounter==100){function_status=2;}

}
void Ending()
{
	int End=LoadGraph( "ENDINGU" ) ;       
	
	DrawGraph( 0 , 0 , End , TRUE ) ; 
	
	DrawFormatString( 400, 350, White, "%d秒でした", timer/100 ); 
	
	DrawFormatString( 400,400, White, "スコア%d",10000-score ) ;
	
	DrawString(0,350,"Zを押してね",White);
	
	if(Key[KEY_INPUT_Z]==1)
	
	function_status=3;	

}	
int WINAPI WinMain( HINSTANCE hInstance, 
				   HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	
	
	
	ChangeWindowMode( TRUE ) ;
	if( DxLib_Init() == -1 ) return -1; 

	SetDrawScreen( DX_SCREEN_BACK ) ;		   //裏画面を使用する。
	Set_Shoki();
    img_sound_load();
	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない


		
		switch(function_status)
	{
		case 0:
		Opening();
		break;
	
		case 1:
		Danjon();
		break;

		case 2:
		Ending();
		break;

		default:
		DxLib_End() ;                             
		return 0;
		break;
	}



		ScreenFlip() ;
	}

	DxLib_End() ;
	return 0 ;
}

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月18日(水) 18:34
by Dixq (管理人)
解りました。
こちらで字下げ、改行など部分的に修正してもよろしいでしょうか?
部分的に統一させていただき、アップロードさせて頂けたら有り難く思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月18日(水) 18:40
by ひよこ
Dixqさんにプログラムの字下げ、改行の修正して下さるなんて光栄です。
サンプルになったら私もそのサンプルを参考にさせて頂きたいと思います。

Re:「雑談トピ」Dixqさんへ質問

Posted: 2009年3月18日(水) 21:25
by ひよこ
Dixqさんへ>>
もしサンプルできてアップロードできたら一言ほしいです。(掲示板に完成の報告?)
みたいなものを入れてほしいです。

自作のC言語ターミナルゲームをパワーアップさせてください

Posted: 2009年4月03日(金) 17:23
by キリ
どなたかお願いです。自作のC言語アップするんで、パワーアップさせて返してください!
いまは、ステータス異常の表記が上手く行かなくて困っています。
MACのアプリでダイアログとかReseditを使ったリソースで開発してくれると大助かりです。
一緒に組んでやる人がいないので誰か一緒にC言語のゲームを作りませんか?
キャッチボール式戦闘
http://www1.axfc.net/uploader/He/so/212129

この作品の仕様

Posted: 2009年4月03日(金) 17:25
by キリ
.defaultで平均的なキャラクターの生成。
.statsでステータスを均等な値に決定。
.openでステータスファイルを読み込む。
.rmで既に入力したキャラを最戦闘。
.owで体重と身長を決定。
.d1で内部計算数値を表示。
技読み込みのフォーマットは
技名/発動台詞/攻撃修正値/発動相対確率/技消費ポイント/攻撃対象/会心修正/属性/技タイプ/リンク技
です。
攻撃修正は乗算値、修正値、加算値、近似値、絶対率、加算乗算値、絶対乗算値があります。
ダメージに乗算と修正はかけ算、加算はプラス、近似は絶対値に近い値、絶対率は最大HPの割合、加算乗算はプラスとかけ算、絶対乗算は絶対値に攻撃力かけ算です。

Re:この作品の仕様

Posted: 2009年4月03日(金) 18:43
by kazuoni
^^;
基本ここは質問・回答中心の場なので、ちょっと場違いかと。。

>ステータス異常の表記が上手く行かなくて困っています。
どのようにうまくいかないのか明確に示すとよい回答が得られるかも知れません。

Re:この作品の仕様

Posted: 2009年4月04日(土) 11:44
by もぐりん
既に他の掲示板で色々指摘されているのに直す気は無いのですか?

http://www2.realint.com/cgi-bin/tarticl ... intc+32956

Re:この作品の仕様

Posted: 2009年4月05日(日) 10:24
by Dixq (管理人)
マルチポストは「両方の掲示板の規約で許されていたら可」としています。

また、質問掲示板関連は同じ方が見ていらっしゃる場合が多いようですので、
マルチポストをする意味はあまりないという意見が以前出たことがあります。

---

人が書いたプログラムを理解するのは難しいでしょうし、
そこまでせっかく作ったのなら、わからない部分を聞いて、機能追加を自分でやった方が
後々効率的では無いでしょうか?

Re:この作品の仕様

Posted: 2009年4月05日(日) 11:55
by Ban
アチラでもレスしてますが、
意味の分からない変数名、特にグローバル変数書き換えまくりだったので、
それ以上に手を出す気がそげてしまいました。

s:先手、g:後手、k:攻撃、b:防御…などを解読しないと分からないのでは、
(ゲーム的な本質以前の面で)他の人に弄ってもらうソースとしては厳しいです。
「キー入力が少ない」とか「宣言が面倒」とか言うのはありえない。

変数名を見直しながら、グローバル変数を減らして構造体にまとめるのが最初かなという印象です。