メイン関数の書き方について

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

メイン関数の書き方について

#1

投稿記事 by 井夏 » 12年前

こんにちは、DxライブラリでRPGのゲームを作ろうとしている者です。
http://dixq.net/g/26.html
このページの書き方を参考にして作ろうとしているんですが、
http://dixq.net/g/37.html
こちらのページのメイン関数の書き方を参考にこのシステムを組み込んで作っていきたいのですが、普通のRPGはダンジョン画面が移動したら行ける範囲を変えていかなきゃいけまんよね。でも、毎回行ける範囲を変更するにはどうすればいいんですか?

試しに知識が乏しいですが、自分でやってみたところ、
#include "DxLib.h"

int function_status=0,White;
char KeyBuf[ 256 ] ;

typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;

int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[y/32-1][x/32]==1)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][x/32-1]==1)
return 1;
if(muki==2)//下向きなら
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][x/32+1]==1)
return 1;
return 0;//正常
}

void Opening(){
DrawString(100,100,"オープニング画面 (zをプッシュ)",White);
if(KeyBuf[KEY_INPUT_Z]==1)
function_status=1;
}

void Menu(){
DrawString(100,140,"メニュー画面 (xをプッシュ)",White);
if(KeyBuf[KEY_INPUT_X]==1)
function_status=2;
}

void Danjon(){
DrawString(100,180,"ダンジョン画面 (cをプッシュ)",White);
if(KeyBuf[KEY_INPUT_C]==1)
function_status=3;
}

void attack(){
DrawString(100,220,"戦闘画面 (vをプッシュ)",White);
if(KeyBuf[KEY_INPUT_V]==1)
function_status=4;
}

void Ending(){
DrawString(100,260,"エンディング画面 (bをプッシュ)",White);
if(KeyBuf[KEY_INPUT_B]==1)
function_status=5;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

White = GetColor( 255 , 255 , 255 ) ; //色の取得

SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る

switch(function_status){
case 0:
Opening();
break;
case 1:
Menu();
break;
case 2:
Danjon();
break;
case 3:
attack();
break;
case 4:
Ending();
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}

if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了

ScreenFlip() ; // 裏画面データを表画面へ反映
}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

コピペして作ったのですが、
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

ここの部分を毎回変えたいと思い、いろいろ試したのですがイマイチうまくいきません。
intを抜かして
hantei[15][20] = {
と書いて行くのは間違っているのですか?
caseの後に書いても、void Danjon(){ の後に書いてもダメでした。
素人ですみません。アドバイスよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メイン関数の書き方について

#2

投稿記事 by softya(ソフト屋) » 12年前

コードタグをご利用くださいね。その他利用規約も含めて確認をお願いします。
http://dixq.net/board/board.html

さて、実はここからRPGに本格的に組んでいくのは非常にプログラム的に難しく成ります。
なので、要素要素に分解して勉強しながらRPGを作る練習をすると位置づけてもらったほうが良いと思います。
つまり、RPGの部分部分のテストプログラムを作って練習する形です。
まず、機能を変えずに関数化を目指されてはどうでしょうか?
intを抜かして
hantei[15][20] = {
と書いて行くのは間違っているのですか?
caseの後に書いても、void Danjon(){ の後に書いてもダメでした。
素人ですみません。アドバイスよろしくお願いします。
ココら辺は、C言語の文法レベルの問題ですね。
C言語の知識もまだ怪しい感じでしょうか?

※ RPGの作り方講座ってのも私が書いているのですが、プログラムを組んだ経験やC言語の知識がある程度ないと難しいので今回は紹介しないでおきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

井夏
記事: 3
登録日時: 12年前

Re: メイン関数の書き方について

#3

投稿記事 by 井夏 » 12年前

返信ありがとうございます。
コードタグも使わず、とても適当な質問ですみません。
イマイチ使い方がわかっていなかったです。
今度からはしっかり規約を読んで質問させていただきます。

Cの経験は今年の四月になって始めたばかりなのでほとんど手探りでやっている状態です。
文法もまだまだ意味不明なんです。すみません。
やはりそんな状態じゃまだまだできないのでしょうか?

とはいえ、関数化なるものを調べてみます。
アドバイスありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メイン関数の書き方について

#4

投稿記事 by softya(ソフト屋) » 12年前

関数化というと語弊がありますね。失礼しました。
ファイル分割でしょうか。その前にコード自体を理解できているかが問題になりますね。

【補足】
いや、それよりもマップだけのものを作ったほうが良いかもしれません。
どうしたいでしょうか? 丸投げで申し訳ないですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

井夏
記事: 3
登録日時: 12年前

Re: メイン関数の書き方について

#5

投稿記事 by 井夏 » 12年前

ページの解説を読んだり、自分で調べたりしながらやっていますが大体のコードの意味はわかっているつもりです。
ですが、

コード:

typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;
 
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
この部分がちょっと理解できません。
もしよしければ、解説をよろしくお願いします。

>いや、それよりもマップだけのものを作ったほうが良いかもしれません。
確かにマップだけのものを作ったほうがいいかもしれませんね。
まだまだ戦闘などはできそうにないので、イメージとしてはということでRPGを例に挙げました。説明不足ですみません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メイン関数の書き方について

#6

投稿記事 by softya(ソフト屋) » 12年前

もう少しわからないことを詳しく書いてもらえますか。
上はtypedefされた構造体で、下はint型の2次元配列です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

井夏
記事: 3
登録日時: 12年前

Re: メイン関数の書き方について

#7

投稿記事 by 井夏 » 12年前

typedefの方は今調べて理解できましたが、intの二次元配列というものがわかりません。
int hantei[15][20]は行数と文字の数を入れているのはわかりますが、わからないのはそのあとの部分なんです。”{”の使い方や”,”の使い方で
文を進めていった(マップが変わった)時に変更するにはどうすればいいのですか?
つまり、int hantei[15][20]~のいじり方がわかりません。
変更する際に、hantei[15][20] = {
と書いて行くのは間違っているのですか?さっきの質問と似たりよたったりですがよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メイン関数の書き方について

#8

投稿記事 by softya(ソフト屋) » 12年前

> int hantei[15][20]は行数と文字の数を入れているのはわかりますが、わ

ここに勘違いを感じます。 文字の数はchar型ですね。int型だと数値データです。
行数と列数って考えたほうが良いと思います。Excelを思い浮かべてもらえばよいでしょか。

>変更する際に、hantei[15][20] = {
> と書いて行くのは間違っているのですか?さっきの質問と似たりよたったりですがよろしくお願いします。

代入したいんだと思いますが、{}で書くのは初期化のみに許された構文なので代入には使えません。
こういう切り替え時は、もうひとつの初期化したマップとポインタを使って切り替えます。あとマップはだいたいサイズが可変なのでもっと工夫が必要になります。
となると話は難しくなるので、まずポインタで2つのマップを切り替えるものを作ってみたらどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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