プログラミングの館24章について

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

プログラミングの館24章について

#1

投稿記事 by 双嗣 » 17年前

24章を応用してパズルゲームを作ろうと思っているのですが
説明しづらいので、添付の絵を使いながら説明します。
赤い矢印がキャラクターが進む方向です。(キャラは自動に進むようにしたいのですが^^;)
そして、番号が各ブロックです。各ブロックを入れ替えてキャラクターの
進む方向を入れ替えたいのですが、ブロックの入れ替え方法とキャラクターの進む方向を
変える仕組みをどうやってプログラミングすればいいのかさっぱりわかりません><
添付で具体例を言うと、キャラクターが1→2→3と進むのを2と5を入れ替えて
1→5→4と進むようにしたいのですが・・・・・
ブロックの入れ替え方法とキャラクター移動のプログラミングをどのようにするか
アドバイスや提案だけでもいいので教えてください。よろしくお願いいたします。m(_ _)m

管理人

Re:プログラミングの館24章について

#2

投稿記事 by 管理人 » 17年前

これはコンピュータがパズルを解くんでしょうか?

それともプレイヤーが道を作ってやるとキャラが勝手にそちらに移動するのでしょうか。
もしそうなら、分岐点に差し掛かったらどうするのでしょう?

このパズルは取り外しとか出来ない仕様でしょうか?図の5が移動するにはまず3が左に移動しなければ5は左に移動できないとかそういう仕様でしょうか?

もし前者である場合。
パズル系は結構アルゴリズムが難しいですよ。
一番単純な方法は再帰関数とかを使って端から全てのパターンを調査していき、方法に各点数でも付けておき、一番いい方法を取る・・といった具合でしょうか。

調べたある方法で通れたら10点。行き止まりなら-10点、みたいな。ゴールできたら確定フラグをオン。
みたいにすれば、ゴールできなくても一番いい方法で近くまでいけると思います。

後者である場合、左、上、右、下の壁がどのようになっているか状態は16種類あると思いますので(違ったらすみません)それぞれの数字を壁の状態に対応させて格納してやればいいでしょう。
つまり0ならどこも壁無し、1なら左に壁アリ、など。
もしそれが難しいなら
typedef struct{
    BOOL left,up,right,down;
}block_t;
 
などで構造体を作って、情報を入れ込んでやってもいいと思います。

ibis

Re:プログラミングの館24章について

#3

投稿記事 by ibis » 17年前

//向きの定数
#define 0 UPPER //上
#define 1 RIGHT //右
#define 2 LOWER //下
#define 3 LEFT //左

//2を加算して4で剰余すると、逆向きになる。
inline int reverse(int direction){
 return (direction + 2) % 4;
}

typedef struct{
 int direction[2]; //向き
}block_t;

例えばこういうのとか。
直前に動いた方向の逆には多分動けないでしょうから、
向きを計算できると、次に進むべき方向が見つけやすいかな、と。

双嗣

Re:プログラミングの館24章について

#4

投稿記事 by 双嗣 » 17年前

ごめんなさい、言葉が足りませんでしたね^^;
プレイヤーはただ単にブロックを入れ替えるだけにしようと思っています。
ブロックを入れ替えて道を作りキャラクターはその上を1マスずつ進むと
いう風にしていこうと思っています。そして、ブロックはどんなに離れていても
入れ替えられるというようにしようかと・・・・・・

言われてみれば16の数字が必要ですね>< (24章を応用するなら)
ところで、数字を壁の状態に反応させるということはキャラクターは
4次方向のどれかいけるところに進むようにプログラムして、
壁は進めないところを作るということでしょうか?
それと、

typedef struct{
BOOL left,up,right,down;
}block_t;

というのはどこに使うということなのでしょうか?
たとえば添付の絵のブロックでキャラが1つ左に進むようにしたいと思ったら
typedef struct{
BOOL left;
}left_block_t;

というようにすればいいのでしょうか?

そういえば、一番肝心な事を聞くのを忘れてました><
ブロックを選択して移動させるようにするヒントを
いただけませんか?たぶん33章の選択画面の作り方を応用すればいいのかと思われますが
そうなると、元のブロック配列(数字)を入れ替える事になると思うので・・・・・・

ややこしい事いってごめんなさい><
同級生や周りの人はc言語スラ氏ら無い人ばかりなので・・・・・

管理人

Re:プログラミングの館24章について

#5

投稿記事 by 管理人 » 17年前

いや、変数が一つなのなら構造体にする意味がないでしょう。
もし、ブロック情報を

typedef struct{
BOOL left,up,right,down;
}block_t;

で定義したいのなら、10x10のブロックがある場合

block_t block[10][10];

とかで宣言しておき、初期化で、壁情報を代入していく必要があります。

一番左上のブロックが下側だけ通行可能なら

block[0][0].left=1;
block[0][0].up=1;
block[0][0].right=1;
block[0][0].down=0;

などと入れる必要があります。これをマップにあわせて100回やるわけです。
マップデータは外部データにしておいて、自動で読み込んで自動で格納するようにした方が拡張性が高いでしょう。
後、そこにブロックが無い場合もあるわけですから、

typedef struct{
BOOL flag;
BOOL left,up,right,down;
}block_t;

等として、そこにブロックがあるかどうかを示すフラグも用意したほうがいいかもしれません。

後、せっかくパズルにするなら、道はスライドさせて移動する方がパズルっぽくなりません??

双嗣

Re:プログラミングの館24章について

#6

投稿記事 by 双嗣 » 17年前

なるほど!
ブロックを定義しておいた後にブロックの座標を指定するわけですね。
これで、構造体の使い方がやっとわりました。

typedef struct{
BOOL left,up,right,down,img;
}block_t;

画像は最初の定義したとおりプラス
10x10マスの一番右上なら

block_t =[0][0]
LoadDivGraph( "char.png" , 16 , 1 , 1 , 32 , 32 , image );//画像を分割してimage配列に保存
DrawGraph( block_t.img , TRUE ) ;//[12]の画像を描画

であってってますよね?
的外れな事を言っていたらごめんなさい><

それと、道のスライドはキャラクターを単にゴールへ導くためにするなら
いいのですが、敵もメインと同じようにプログラミングしようと思っているので
スライドではなくて入れ替えのほうがいいのですが・・・・・
その方法を教えてください。
よろしくお願いいたします。

双嗣

Re:プログラミングの館24章について

#7

投稿記事 by 双嗣 » 17年前

それと、もうひとつ質問があるのですが
ibisさんの投稿で

>  //向きの定数
   #define 0 UPPER //上
   #define 1 RIGHT //右
   #define 2 LOWER //下
   #define 3 LEFT //左

   //2を加算して4で剰余すると、逆向きになる。
   inline int reverse(int direction){
   return (direction + 2) % 4;
   }

   typedef struct{
   int direction[2]; //向き
   }block_t;

   例えばこういうのとか。
   直前に動いた方向の逆には多分動けないでしょうから、
   向きを計算できると、次に進むべき方向が見つけやすいかな、と。


というのはキャラクターのプログラムということなのでしょうか?

管理人

Re:プログラミングの館24章について

#8

投稿記事 by 管理人 » 17年前

今一度、構造体を含め、C言語についておさらいされた方がいいと思います。
構造体の使い方と、関数の作り方位はしっかり身につけてからゲームを作ったほうが効率的に作れると思います。

また、DXライブラリの使い方についても、もう少しじっくりおさらいされた方がいいと思います。

構造体はタグ名が変数になるわけではないので、

typedef struct{
BOOL left,up,right,down,img;
}block_t;

と定義したのならblock_tは変数ではありません。
よって

block_t = [0][0]

という書き方は出来ません。配列の意味にもなりません。
[0][0]を代入・・というのは何を意味したかったのでしょうか?

構造体を使った配列の宣言の仕方は先ほど私がお話したとおりです。


そして

LoadDivGraph( "char.png" , 16 , 1 , 1 , 32 , 32 , image );//画像を分割してimage配列に保存

imageが何をさすのかわかりませんが、imageが何故

DrawGraph( block_t.img , TRUE ) ;//[12]の画像を描画

ここで[12]をさすのでしょう?そしてBOOL型はTRUEかFLASEを入れる変数ですので、画像の識別番号を入れるべきではありません。
そしてDrawGraphの第一引数はx座標、第二引数はy座標でなければなりません。

>スライドではなくて入れ替えのほうがいいのですが・・・・・
>その方法を教えてください。

と言う事ですが、基本的な部分をもう少し勉強されてからじゃないと、毎回質問して、あれでもない、これでもないというやり取りが続いてしまいかねないと思います。
きっと「こうして下さい」とアドバイスを受けても、結局コードを書いてくれないとわからないので、コードを書いて下さい。という事になると思います。
かわりにサンプルをお作りする事は簡単なのですが、人が作ったコードは理解しないと全く拡張が出来ないので、是非ご自分で作っていただきたいですし、そのほうが今後の為にもなると思いますので。

C言語については
http://www.google.co.jp/search?hl=ja&q= ... %96%80&lr=

こちらで勉強できます。
DXライブラリについては館でもいいですし、リファレンスページやサンプルプログラムなどで勉強されるといいと思います。
秘訣はただ読むだけじゃなく、一つ一つ実行してみて内容が少しでも理解出来なければ次に進まず調べる事、そしてサンプルを自分でいじって自分が期待した動作になることを確認することです。


ゲームについて、パネルを交換するなら、選択したとき、そのパネル番号を保持しておき、
選択した交換先のパネルを決定した時点で交換するだけでいいと思います。
プレイヤーの状態が遷移する場合、状態を示す変数をキャラクタ情報の構造体の中にいれておけばいいでしょう。
0なら選択可能。
1なら選択中・・といった具合です。

双嗣

Re:プログラミングの館24章について

#9

投稿記事 by 双嗣 » 17年前

確かにおっしゃるとおりです。
あるサイトのc言語入門でほとんど理解できたつもりだったのですが、
まだまだだったようですね。言われてる事はわかっているのに変数や
構造体のつくりがいまいち理解できていなかったので意味不明の事を
いっていたようです。

1からc言語を勉強して出直したいと思います。
ある程度勉強して人のコードがある程度読めるようになったら
戻ってこようと思うのでそのときはよろしくお願いいたします。

双嗣

Re:プログラミングの館24章について

#10

投稿記事 by 双嗣 » 17年前

C言語を改めて勉強し始めて、自分があまりにも的外れな事を言っていたのがよくわかりました。
例であげるなら、管理人様が例であげてくださった構造体の
typedef struct{
BOOL left,up,right,down;
}block_t;

のBOOL型のTRUEかFLASEを入れる変数、つまりleft,up,right,downが真か儀かを
判別するたと、またはTRUEは1.FLASEは0という変数を構造体(left,up,
right,downをまとめたもの)にしたものだったんですね。ほんとに今まで
無駄な時間をすごしてしまった。orz

それから、C言語の勉強をしている時に出てくる変数で、この変数はゲームだとどこに使われているんだろうと
思うことがあるのですが、フリーで配布されているゲームなどをソースに直して(戻して)見る事は
可能なのでしょうか?方法があるのであれば教えてください

後、管理人様の貴重なお時間を無駄にさせてしまって本当に申し訳ありませんでした。
ですが、c言語を勉強していると今まで教えていただいた事が反映されてより理解しやすく
覚えやすくなりました。
本当にありがとうございましたm(_ _)m

管理人

Re:プログラミングの館24章について

#11

投稿記事 by 管理人 » 17年前

いえいえ、私の言葉は冷たい言葉のようにお感じになったと思います。
ホントは一から手取り足取りアドバイスを差し上げたいところですが、
基本がわかって作り始めるのと基本がわからず作り始めるのでは、ご自分の後の苦労が
格段に違いますので、是非基礎を固めていただきたかったのです。

質問・回答もそのほうがスムーズに行えますしね。
例えば微分積分の質問をしているときに、A「2次関数が・・」B「2次関数って何?」A「方程式が・・」B「方程式って何?」A「掛け算が・・」B「掛け算って何?」
となってしまうと、回答が困難になってしまうという感じです。

BOOLはTRUEかFALSEを入れるものですが、実際この2つの値しか入らないわけではなく、
容量もBYTE型と同じなので、なじみにくければBYTE型でもいいと思います。
もっと言えば別にint型でも・・。

>この変数はゲームだとどこに使われているんだろうと 思うことがあるのですが、フリーで配布されているゲームなどをソースに直して(戻して)見る事は 可能なのでしょうか?

すみません、よく意味が把握出来ませんでした。
どこのソースの事ですか?
もしかして実行ファイルをプログラムソースコードに変換する事が出来るか、といった事でしょうか?
実行ファイルからプログラムコードに変換する事は出来ません。
実際には少し処理を追ってみる事は出来ますが、最初は出来ないという理解でいいと思います。
もしそれが出来るといくらでもゲームの改竄やプログラムの改竄が出来てしまうので・・。

>この変数はゲームだとどこに使われているんだろうと

もしも私の理解できる範囲内でしたらお答えします。

ibis

Re:プログラミングの館24章について

#12

投稿記事 by ibis » 17年前

遅くなりましたが、以前に私が挙げた方法は、ブロックの一例でした。
まぁキャラにも使えますがね。
ただ、この方法では行き止まりや分岐ができないです。

双嗣

Re:プログラミングの館24章について

#13

投稿記事 by 双嗣 » 17年前

いえいえ、管理人様が冷たいだなんて思っていませんよ^^
むしろ、管理人様がここまでサイトの利用者に一人ひとり丁寧に
教えているほうが珍しいし、やさしいと思いますと思います。

ところで、フリーゲームのプログラムの事なのですが実行ファイルを
プラグラムソースに直すというより何かソフトを使ってプログラムが
読めるようになればいいのですが・・・・・
誰かが作ったプログラムを少しだけ見る事は可能じゃないんでしょうか?
たとえば、RPGのキャラクターの壁の識別方法とか行動制御とかのプログラムの一部とか、
敵の攻撃ダメージの乱数とか・・・・・
上げたらきりが無いのですが^^;
プログラム解析ソフトみたいなのものがあれば一番いいのですが。
何かいい方法があれば教えてください。よろしくお願いいたします。

バグ

Re:プログラミングの館24章について

#14

投稿記事 by バグ » 17年前

実行ファイルからソースを完全に復元する事は不可能です。

管理人

Re:プログラミングの館24章について

#15

投稿記事 by 管理人 » 17年前

あ~言っている意味がわかりました。
もしかしてプログラムソースファイルと実行ファイルが同じものだと思っていらっしゃいますか?

私達がプログラムコードを書くという作業は何をしているかわかりますか?
コンピュータは0か1の信号しか理解出来ません。
人間は0か1の信号では理解できません。

えーと、解りやすく言う為に、人間で例えてみると

ドイツ人
・日本人の言葉はわからない
・ドイツ人の言葉はわかる

日本人
・日本人の言葉はわかる
・ドイツ人の言葉はわからない

という二者間で意思疎通をするなら、その二者間で翻訳作業が必要ですね?
この事はコンピュータと人間の間にもいえます。

コンピュータ
・人間の言葉はわからない
・0か1の信号はわかる

人間
・人間の言葉はわかる
・0か1の信号はわからない

という二者を仲介する為に、コンパイルという翻訳作業が必要なわけです。
人間が書いた人間に理解する事の出来るプログラムコードを「翻訳(コンパイル)」して実行ファイルという0と1の信号で出来たファイル(厳密にはそうではないですが)を作ります。
すると人間がコンピュータにさせたい動作を書いたコードがコンピュータに理解出来る言葉に変換され、ファイルとなるわけです。
この実行ファイルを実行することでコンピュータに期待する動作をさせられるわけです。

ドイツ人と日本人間での翻訳はどちら方向にも可能ですが、
人間とコンピュータとの言葉で翻訳作業をする時は、もっぱら人間からコンピュータの方向にしか翻訳しません。
厳密には苦労すれば少々出来ますが、最初は出来ないと思っておいて差し支えないと思います。

つまりプログラムコードを実行ファイルにコンパイルする事はで来ますが、
一度ゲームとしてリリースされている実行ファイルからプログラムコードに逆変換する事は出来ないのです。

このような誤解をされているのではと思い、回答しましたが、もし私の誤解ならすみません。

双嗣

Re:プログラミングの館24章について

#16

投稿記事 by 双嗣 » 17年前

そうだったんですかwww
やっとコンバイルの意味がわかりました。
コンバイルというのは、たとえば、typedef struct{}aaa_t;という命令を
0と1に直してコンピューターに理解させなおかつ人間が理解できる表現に直す
(音楽や画像を映すなど)命令だったったのですね。
そして、コンピューターは人間のように思考が無いから人間の指示通りにしか動けない。
それと、

プログラムコード → 実行ファイル       ○
実行ファイル   → プログラムファイル    ×

になるのはプログラムコードは人間語、実行ファイルは機械語だから
機械語をプログラムコードに直せない(0と1を人間語に訳せないから)
であってますよね?

c言語って本当に奥が深いですね。
コンピューターは0と1でしか理解していないのに人間は
数百という言葉を使って示してやら無いといけない・・・・・・
c言語は自由度が高いけど、自由に扱えるようになるまでは時間がかかるんですね^^;

ひとつ質問なのですが、ほとんどのc言語入門サイトはDirectXを使ってないと思うのですが
管理人様はどのように関数や引数をゲームのプログラミングに関連つけたのでしょうか?
差し支えなければ教えてください。

後、管理人様、丁寧な説明をありがとうございました。とてもわかりやすかったです^^

管理人

Re:プログラミングの館24章について

#17

投稿記事 by 管理人 » 17年前

コンバイルではなく、コンパイルです。ハにマルです。

>0と1に直してコンピューターに理解させなおかつ人間が理解できる表現に直す

別に結果が人間に理解出来ないものである可能性もありますが、まぁそういう解釈でもいいかもしれません。

まぁ厳密に話をしだすと矛盾が生まれてきますし、厳密に理解する必要も無いと思います。
最初は、基本的にプログラムコードから実行ファイルには変換出来ても、逆は出来ないと覚えておいていいと思います。
例えば
方法は数種類あっても、結果は1つしかない場合。
例えば原材料が中国製で、加工は台湾で、日本で完成された製品があったとしても、製品を見ただけではその元がどうなっているかはわからない。
加工がドイツであろうがアメリカであろうが、同じ製品になったのならその過程を正確に予測する事は不可能ですよね。
でもまぁ、ものすごい詳しい人がみたら若干の違いがわかるから、少しだけその過程を予測出来る人がいると・・。
それと同じだと思っていて差し支えないと思います。


別にプログラムの勉強はウェブでする事を前提とされているわけでもなく、ウェブでの勉強が十分出来るようになってきたのはごく最近の話ですよね。
今でもまだDirectXやOpenGLなどの参考サイトは少ないほうですし、本格的に勉強するなら本を購入するのが普通だと思います。

どうやって関数や引数をゲームに関連付けたのか・・という意味は
どうやってC言語をゲームに応用したのかということでしょうか。
別に描画を除けばC言語なんて基本的に何のライブラリを使わない状態と同じですし、
描画をさせたいならそのライブラリのリファレンスを見たら解るので、特に難しい事はないと思います。
3Dプログラムなどの複雑なものはそれなりに勉強する必要があると思いますが
DXライブラリに限ってはそんな必要もありませんし。
DXライブラリなら本を読むまでも無いですし、何も特に勉強することなく私は書き始めました。
全部我流なので非効率なプログラムを書いている可能性は十分にありますが、
私は本にしがみついて勉強するのが好きではなく、自分で色んなものを作りながら勉強するのが好きなので
リファレンスを見ながら色んなものを作って使い方を覚えました。
コレに限っては本や参考サイトが無いと勉強できないって事は無いと思います。

閉鎖

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