ゲームの基本設計に関して

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

ゲームの基本設計に関して

#1

投稿記事 by kazu » 14年前

最初に・・・自分の知識はC言語の入門サイトに載っていることと新・旧ゲームプログラミングの館、龍神録の館を一読した程度の知識です。

これからチェスや将棋のようなボードゲームを試しに作ってみて、できたらキャラが個人の能力などを持つシミュレーションゲームを作りたいと思っています。

人間VSコンピューターはコンピューターの思考ルーチンなどを作るのはまだまだ自分にはできそうに無いので後回しですが、
人間VS人間のゲームが作れたら良いなと思っています。

そこで二つ質問させてください。

一番最初に躓いたのがmain関数の構造?を考えることです。

龍神録の館では、
第9章より引用

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessLoop()==0){//メインループ
        switch(func_state){
            case 0:
                load();        //データロード
                first_ini();//初回の初期化
                func_state=100;
                break;
            case 100:
                calc_ch();      //キャラクタ計算
                ch_move();      //キャラクタの移動制御
                graph_main();//描画メイン
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }

        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}
と、「キャラクター」をロード(load.cpp)→計算(char.cpp)→描画(graph.cpp)と異なるcppファイルで分けていますが、
新プログラミングの館では、
d.1より引用

/*player.cpp*/

コード:

#include "DxLib.h"
#include "Player.h"

// このファイル内でしか使えないグローバル変数
static int m_Image; //画像ハンドル
static int m_y;     //y座標

// 初期化をする
void Player_Initialize(){
        m_Image = LoadGraph("画像/キャラクタ01.png");
        m_y = 0;
}

// 動きを計算する
void Player_Update(){
        m_y++;
}

// 描画する
void Player_Draw(){
        DrawGraph( 0, m_y, m_Image, TRUE );
}

// 終了処理をする
void Player_Finalize(){
        DeleteGraph( m_Image );
}
のように「キャラクター」を一つのcppファイルでロード→計算→描画としています。

結果的にはどちらを使っても動きには大差はないという風に想像していますが、
他のプログラミングをするときにも役に立ちそうなのでどちらが良いのか教えていただけるとありがたいです。

二つ目の質問は、シミューレーションの対戦画面(実際にチェスの駒などを動かす場面)の基本的な流れについてです。
チェス・将棋を例に考えてみると、

画像等のロード(初回)→(ルール等を決める)(初回)→駒を動かす(移動可能かの判定、移動計算、駒を取る等)→勝利・敗北の判定→ターンを移すかの判定→描画

と、自分なりに考えてみたのですが、なかなかシミュレーションゲームを専門に取り扱っているサイトが無くてどのようにしたら良いのか分からず困っています。

是非教えていただけるとありがたいです。

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

Re: ゲームの基本設計に関して

#2

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

龍神録と新ゲーム館のコードの違いは、前者が機能的なファイル分割で、後者がオブジェクト指向・カプセル化につながるオブジェクト単位のファイル分割と言う事になるのではとおもいます。
グローバル変数を使うプログラムはバグの危険性が高いくなりますので、データの隠蔽性が高い後者である新ゲーム館の分割をおすすめします。
画像等のロード(初回)→(ルール等を決める)(初回)→駒を動かす(移動可能かの判定、移動計算、駒を取る等)→勝利・敗北の判定→ターンを移すかの判定→描画
ボードゲームでもアクションでも基本のところは変わりません。
処理→描画の組み合わせである点です。
ただ、ボードゲームだと状態によりやることが変わるので、その点を考慮して設計すべき物となります。

mainを擬似コードで書くとこんな感じになるでしょうか。

コード:

switch( state ) {
case コマの移動:
	駒を動かす(移動可能かの判定、移動計算)
	移動終了ならstateを移動の確定へ
	描画
	break;

case 移動の確定:
	これでokか確認。
	OKならstateを攻撃処理へ。
	描画
	break;

	以下略
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kazu

Re: ゲームの基本設計に関して

#3

投稿記事 by kazu » 14年前

回答有難うございます。

一つ目の質問に関しては新ゲームプログラミングの館の方法を採用してみたいと思います。

二つ目の質問ではコード例まで出していただいて有難うございます。
これを参考にプログラムを書いてみたいと思います。

今のところの疑問は解決しましたのでこのトピックは解決としたいと思います。
また、質問する機会がありましたら宜しくお願いします。

閉鎖

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