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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよこ

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

#1

投稿記事 by ひよこ » 16年前

今日あるゲームができたのです。シンプル イズ ベストのゲームですが
サンプルプログラムの館に入れてもらえるにはどうすればいいでしょうか?

kazuoni

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

#2

投稿記事 by kazuoni » 16年前

おっ。
管理人じゃないですけど、中身が気になります・・・w

ひよこ

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

#3

投稿記事 by ひよこ » 16年前

中身は脱出ゲーム?ですね。

脱出の人

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

#4

投稿記事 by 脱出の人 » 16年前

同じく気になりますww
とりあえず斧にUPしてURL張ってみたらどうですか?
個人的な意見ですが。

ひよこ

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

#5

投稿記事 by ひよこ » 16年前

http://down11.ddo.jp/uploader/download/ ... %87%BA.zip
アップさせていただきましたPASSはhiyokoです。
あまりにシンプルに作ったのでそんなに期待しないほうがいいと思います。

kazuoni

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

#6

投稿記事 by kazuoni » 16年前

シンプルです。とてもシンプルです。
が、もう少しゲーム性を追加したほうが良いかと。。

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

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

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

脱出の人

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

#7

投稿記事 by 脱出の人 » 16年前

まさにシンプル イズ ベストですね。
乱数を使って相手の出る位置をランダムにしたらもっと良くなるかも?
ループを使えばもっと良くなるかも?
と言う初心者の感想ですw

ひよこ

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

#8

投稿記事 by ひよこ » 16年前

アドバイスありがとうございます。
乱数はちょっと難しいですがほかはできるだけがんばりたいと思います。

SooA

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

#9

投稿記事 by SooA » 16年前

加えて途中から偽者出現とかあるとゲーム性がUPするかも?

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

とかどうでしょう。

ひよこ

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

#10

投稿記事 by ひよこ » 16年前

SooAさんの偽者出現は面白いかもしれませんね。

木霊

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

#11

投稿記事 by 木霊 » 16年前

ひよこさん

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

木霊

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

#12

投稿記事 by 木霊 » 16年前

 さすがにおやすみのようなので本来の用件だけ

 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です。

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

Dixq (管理人)

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

#13

投稿記事 by Dixq (管理人) » 16年前

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

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

ひよこ

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

#14

投稿記事 by ひよこ » 16年前

こんにちは、返事遅くなりました。
いろいろありがとうございました。いろいろ参考になりました。
木霊さん>ありがたく乱数について使わせてもらいます。
Dixqさん>今回はあくまでシンプルに作ってみたので、
次回は効果音用意しておきます。

ひよこ

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

#15

投稿記事 by ひよこ » 16年前

2代目作ってきました。
http://down11.ddo.jp/uploader/download/ ... %BC%92.zipにアップさせてもらいました。PASSはhiyokoです。

脱出の人

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

#16

投稿記事 by 脱出の人 » 16年前

初見で
104秒
スコア9531でしたw
右腕つるかと思いましたw
気づいた点?↓
偽者と本物が重なることがありました。
偽者に重なってる間音がずっとなってました。
別に修正しなくてもいいようなことですがw

ひよこ

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

#17

投稿記事 by ひよこ » 16年前

早速プレイしていただきありがとうございます。
脱出の人104秒 スコア9531でしたw >すごくないですか。偽者なくてもそんなに早くできなかったです。

kazuoni

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

#18

投稿記事 by kazuoni » 16年前

おぁ、疲れた。。w
ゲーム性は向上していますが、もう一歩です。

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

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

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

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

kazuoni

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

#19

投稿記事 by kazuoni » 16年前

ちなみに、112秒・・・負けた・・・orzそして右腕が・・・orz

ひよこ

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

#20

投稿記事 by ひよこ » 16年前

やっぱり100階は面倒ですか。エンディング画面見るために100階大変でしたね。ご苦労様です。

SooA

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

#21

投稿記事 by SooA » 16年前

お疲れ様です。

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

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

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

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

ひよこ

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

#22

投稿記事 by ひよこ » 16年前

近場に出現してコンボが決まると気持ちよかったので>それって連続で階を進むってことですか?
たしかにそれは気持ちいいですね。

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

#23

投稿記事 by » 16年前

プレイさせていただきました。
シンプルでとても楽しくできました^^

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

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

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

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

木霊

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

#24

投稿記事 by 木霊 » 16年前

 初回で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さんへ質問

#25

投稿記事 by バグ » 16年前

個人的な意見ですが、上下左右でループ移動できるといいかな?と思います。
一番上のマスで上を押すと一番下のマスへ、一番左のマスで左を押すと一番右のマスへ…みたいな感じですね。

ひよこ

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

#26

投稿記事 by ひよこ » 16年前

まずモードを作ろうと思ったらエラーが出て困ってます。どうすればいいでしょうか?
------ ビルド開始: プロジェクト: 脱出, 構成: 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さんへ質問

#27

投稿記事 by 御津凪 » 16年前

エラーの出ている行付近に全角の空白文字が入っています。
それを取り除いてください。

Dixq (管理人)

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

#28

投稿記事 by Dixq (管理人) » 16年前

う、、腕が~!右腕が釣りましたw

>>yuさん

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

>>ひよこさん

GetHitKeyStateAll_2を使っているなら

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

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

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

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

SetFontSize( 20 ) ;

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

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

Dixq (管理人)

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

#29

投稿記事 by Dixq (管理人) » 16年前

上に書いてある事をわかりやすくかくと・・
キーの入力と移動の部分を以下のように書き換えて下さい。

 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さんへ質問

#30

投稿記事 by ひよこ » 16年前

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

バグ

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

#31

投稿記事 by バグ » 16年前

操作性がよくなりましたね(^-^)
そのせいか、余裕で100秒を切ってしまうのがなんとも…(苦笑)
でも、こういうシンプルなゲーム大好きです♪(私が作るのもシンプルなものばかりなんで(笑))

脱出の人

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

#32

投稿記事 by 脱出の人 » 16年前

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

ひよこ

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

#33

投稿記事 by ひよこ » 16年前

さっそく遊んでくださりありがとうございます。
ループ移動やハードモードの改良などやってみました。
ノーマルとレベルの差を結構つけましたよ。

木霊

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

#34

投稿記事 by 木霊 » 16年前

 キー判定のところで
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 )
は一つだけにしておきましょう。今回の変更では逆に増えてます。

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

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

Dixq (管理人)

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

#35

投稿記事 by Dixq (管理人) » 16年前

>>ひよこさん

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

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


>>木霊さん

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

木霊

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

#36

投稿記事 by 木霊 » 16年前

 あれ、そうでしたか・・・自分のにはいつもつけてました。
ご指摘ありがとうございます。

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

Dixq (管理人)

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

#37

投稿記事 by Dixq (管理人) » 16年前

負の数を割ったあまり・・というのは小学校の時習わなかったし、それ以来使った事も無かったので、
こういう事が正式にあってるのかどうかはしりませんが、
VC++で実行するといつも負になるので、いつもそうしているというだけです^^;

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

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

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



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

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

ひよこ

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

#38

投稿記事 by ひよこ » 16年前

サンプルプログラムに入れるのはハードモードしか入ってないゲームでいいですか?
サンプルならシンプルのほうがいいと思いましたので。
ただいま関数の整理などやっております。

ひよこ

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

#39

投稿記事 by ひよこ » 16年前

whileを使わないようにしてみました。
アップローダ様http://down11.ddo.jp/uploader/download/ ... %83%A0.zip PASSはhiyokoです。
あとキー操作をZXCVをWASDにしました。

kazuoni

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

#40

投稿記事 by kazuoni » 16年前

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

ひよこ

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

#41

投稿記事 by ひよこ » 16年前

それは今までのゲームと違ってきれいに完成したのってのもありますけど
やっぱりこんな初心者がこんなの作れたよ、わたしにもできるかなって考
えてもらえるとうれしいからですね。

ひよこ

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

#42

投稿記事 by ひよこ » 16年前

kazuoniさん>>字下げが今のままでは見づらいです。
どのようにすればいいでしょうか。
kazuoniさん>>あとSTAGE_TEKI()はもっと簡単にできそうですね。
ではどうすればいいでしょうか。自作関数をつかって短縮するといいたいのでしょうか。

脱出の人

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

#43

投稿記事 by 脱出の人 » 16年前

プログラムは見てないんですが、
ゲーム内容的には良いと思いますよ。

kazuoni

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

#44

投稿記事 by kazuoni » 16年前

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

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

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

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

kazuoni

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

#45

投稿記事 by kazuoni » 16年前

↑のファイルを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;
	}
のが見やすくないですか?
・・・上手く説明できません。。

BEMANI

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

#46

投稿記事 by BEMANI » 16年前

>>ひよこさん
遊ばさせて頂きました。
気になった所です。

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


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


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

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


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


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

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

ひよこ

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

#47

投稿記事 by ひよこ » 16年前

BEMANIさん一マスだけ移動しようとすると >>
WASDで1マスだけ動けます。

BEMANI

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

#48

投稿記事 by BEMANI » 16年前

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

バグ

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

#49

投稿記事 by バグ » 16年前

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

ひよこ

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

#50

投稿記事 by ひよこ » 16年前

BEMANIさん>>確かにそうですけど技術不足・・・・・・だと。
バグさん>>シフトキーでもいいですね。

lbfuvab

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

#51

投稿記事 by lbfuvab » 16年前

0.5秒(30フレーム)以上押しっぱなしなら連続移動と言う風に実装できると思いますよ。

バグ

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

#52

投稿記事 by バグ » 16年前

それをやるなら、『0.5秒以上押されている、もしくは今押された場合に移動させる』としないと、チョン押しでの1マス移動が難しくなりますね(^_^;)

ひよこ

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

#53

投稿記事 by ひよこ » 16年前

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

SooA

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

#54

投稿記事 by SooA » 16年前

とにかく一行に詰め込みすぎ?な感があります。
参考になるものがあった方が良いと思い
ある程度ソースを変更させてもらいました。

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

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

SooA

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

#55

投稿記事 by SooA » 16年前

追記
これも直してませんが、変数名を統一したほうがいいですよ。

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

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さんへ質問

#56

投稿記事 by ひよこ » 16年前

なるほどこういう風に書けばいいのですか。
KEY関連には便利ですね。

SooA

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

#57

投稿記事 by SooA » 16年前

隙間無く書かれたプログラムよりも、

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さんへ質問

#58

投稿記事 by ひよこ » 16年前

Dixqさん最終的に最後にアップしたのじゃ、だめですかね?

Dixq (管理人)

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

#59

投稿記事 by Dixq (管理人) » 16年前

またまた私がこんなことをいえる立場では無いですが、掲載するからには、人の手本となるものとなると思います。
言い換えれば人に教える立場だと言うことですよね。
ですから間違いがあると、間違いまで人に一緒に教えてしまうことになりますし、
改善点の指摘が出ているならそれを直すべきだと思います。

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

ひよこ

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

#60

投稿記事 by ひよこ » 16年前

改善点って言うのはソースのみやすさだけでしょうか?

Dixq (管理人)

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

#61

投稿記事 by Dixq (管理人) » 16年前

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

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

ひよこ

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

#62

投稿記事 by ひよこ » 16年前

一通り直そうとしたら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はどういう意味なのですか?

Dixq (管理人)

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

#63

投稿記事 by Dixq (管理人) » 16年前

まず、どういう意味なのかな?と思ったら聞く前に意味を理解してみようとしてみて下さい。

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

より

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

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

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

count%3

これは2/3実行され、

count%3==0

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

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


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

ひよこ

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

#64

投稿記事 by ひよこ » 16年前

やっぱり試行錯誤ですか。
サンプルになれるようがんばります。
ソースは添付しておきました。

ひよこ

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

#65

投稿記事 by ひよこ » 16年前

試行錯誤で上のソース作りました。
アドバイスお願いします。

kazuoni

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

#66

投稿記事 by kazuoni » 16年前

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

ひよこ

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

#67

投稿記事 by ひよこ » 16年前

分割ファイルは技術的に無理ですね。

kazuoni

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

#68

投稿記事 by kazuoni » 16年前

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

fatens

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

#69

投稿記事 by fatens » 16年前

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

ひよこ

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

#70

投稿記事 by ひよこ » 16年前

kazuoniさん>>
分割って調べました。
externを使ってソースを見やすくって意味でしょうか?

kazuoni

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

#71

投稿記事 by kazuoni » 16年前

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

なんて感じです。

ひよこ

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

#72

投稿記事 by ひよこ » 16年前

extern int とextern void の違いは何ですか?

SCI

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

#73

投稿記事 by SCI » 16年前

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

ひよこ

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

#74

投稿記事 by ひよこ » 16年前

つまりextern int 変数  extern void 関数と考えればよろしいのでしょうか?

kazuoni

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

#75

投稿記事 by kazuoni » 16年前

そう言われればそうなんですが^^;
例えば

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

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

fatens

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

#76

投稿記事 by fatens » 16年前

もしかして、変数はすべて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さんが仰ったことだと思います。

SCI

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

#77

投稿記事 by SCI » 16年前

なんか分かりにくくてすみません(笑)
fatensさんの通りです。

ひよこ

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

#78

投稿記事 by ひよこ » 16年前

では型+変数(関数)にexternを型の前につければよろしいのですか?

fatens

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

#79

投稿記事 by fatens » 16年前

そういうことになります。

ひよこ

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

#80

投稿記事 by ひよこ » 16年前

一応分割にしてみましたが、なぜか最初の文字がでなくて上の時間と敵も表示されないのですが、
どこが原因でしょうか?
Zipにはソースしか入っておりませんので以前のファイルを使ってください。

fatens

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

#81

投稿記事 by fatens » 16年前

文字は表示されていますが、初期化する関数が呼ばれていないので、黒で書かれています。
そのため表示されないように見えますが、移動してみれば分かります。
また、画像をロードする処理も行われていないようです。

ひよこ

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

#82

投稿記事 by ひよこ » 16年前

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 ;
}

Dixq (管理人)

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

#83

投稿記事 by Dixq (管理人) » 16年前

解りました。
こちらで字下げ、改行など部分的に修正してもよろしいでしょうか?
部分的に統一させていただき、アップロードさせて頂けたら有り難く思います。

ひよこ

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

#84

投稿記事 by ひよこ » 16年前

Dixqさんにプログラムの字下げ、改行の修正して下さるなんて光栄です。
サンプルになったら私もそのサンプルを参考にさせて頂きたいと思います。

ひよこ

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

#85

投稿記事 by ひよこ » 16年前

Dixqさんへ>>
もしサンプルできてアップロードできたら一言ほしいです。(掲示板に完成の報告?)
みたいなものを入れてほしいです。

キリ

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

#86

投稿記事 by キリ » 16年前

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

キリ

この作品の仕様

#87

投稿記事 by キリ » 16年前

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

kazuoni

Re:この作品の仕様

#88

投稿記事 by kazuoni » 16年前

^^;
基本ここは質問・回答中心の場なので、ちょっと場違いかと。。

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

もぐりん

Re:この作品の仕様

#89

投稿記事 by もぐりん » 16年前

既に他の掲示板で色々指摘されているのに直す気は無いのですか?

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

Dixq (管理人)

Re:この作品の仕様

#90

投稿記事 by Dixq (管理人) » 16年前

マルチポストは「両方の掲示板の規約で許されていたら可」としています。

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

---

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

Ban

Re:この作品の仕様

#91

投稿記事 by Ban » 16年前

アチラでもレスしてますが、
意味の分からない変数名、特にグローバル変数書き換えまくりだったので、
それ以上に手を出す気がそげてしまいました。

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る