「忠犬もちしば」のAIボットを作ろう!

こんにちわ。
C言語を使ってドラゴンクエストと同じ戦闘シーンを作成している最中なんですが、戦闘シーンで敵をラリホーで眠らせてから、敵が約3ターンで目を覚ますようにプログラムを組み込みたいんですが。
プログラムで3ターンで目を覚ますようにする方法ってなんですか?
解答をお待ちしております。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

状態異常に眠りというもの作り、カウンタ変数を用いて眠りの状態なら毎ターン1加算していき、3になったらカウンタ変数を0にすると共に眠りを解除したらいいのでは。

    • good
    • 0
この回答へのお礼

分かりました。要するに、カウント関数を使ってターンをカウントするってことですね。
分かりやすい説明有難うございました^^

お礼日時:2014/01/13 16:39

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRPGの戦闘アルゴリズムについて

このジャンルでお願いします。

例えば、ドラゴンクエストモンスターズ
http://way78.com/gb/dqm2/mgc.html
のような戦闘システムを再現したいと考えているのですが、
単純な攻撃特技なら耐性と照らし合わせてダメージを算出するだけだと思います。
ただ補助特技や補助特技の

・たかくとびあがる(次のターンに攻撃)
・うけながし(自分が受けた攻撃を敵か味方に受け流す)
・ふういんのいのり(自分の受けた特技を敵味方一切使えなくする)
・まねまね(敵から受けた攻撃をそのまま跳ね返す)
・きあいをためる(ターンの最後に通常の1.5倍の打撃を与える)
・せいしんとういつ(次のターンの攻撃が2回連続になる)

ここらへんの処理を実装するとなるとかなり複雑になりそうです・・・(他にもややこしそうなのがありますが)
自分では考えられそうもないので、
ネットなどで戦闘システムを検索したり関連の書籍を探したりしたのですが、
簡単な戦闘システム(1対1で単純な攻撃だけとか)の説明しか今のところ見つかりませんでした・・・
少し考えてみたのですが、キャラの状態が
・飛んでるとき
・気合を溜めてるとき
・何らかの状態異常のとき(混乱や麻痺)
は攻撃ができなくて、混乱してる時は麻痺をかけられても効かないとすると、
有限ステートマシンなどのアルゴリズムを利用した方がいいのかな?と
思ったりして、でもそもそも上の3つの場合を一まとめにできるものなのか
とにかくわけがわからず想像ができないです・・・

みなさんならどのようにクラス分けして処理していくか知りたいです。
またはこのような戦闘のアルゴリズムが書かれてる書籍などありましたら
紹介して頂けないでしょうか?

このジャンルでお願いします。

例えば、ドラゴンクエストモンスターズ
http://way78.com/gb/dqm2/mgc.html
のような戦闘システムを再現したいと考えているのですが、
単純な攻撃特技なら耐性と照らし合わせてダメージを算出するだけだと思います。
ただ補助特技や補助特技の

・たかくとびあがる(次のターンに攻撃)
・うけながし(自分が受けた攻撃を敵か味方に受け流す)
・ふういんのいのり(自分の受けた特技を敵味方一切使えなくする)
・まねまね(敵から受けた攻撃をそのまま跳ね返す)
・き...続きを読む

Aベストアンサー

鉄則は「深く考えるな」です。

「状態」と言うステータスがあるなら、そのステータスを「すべて書き出し」して下さい。1つも漏らさず、考える限りのすべてを書き出します。

そして「そのステータスの時に、どの行動が出来るか?」を、ステータスごとに全て書き出して下さい。

そして「出来る行動を選んだ時、どういうステータスになるか」も、行動ごとに全て書き出して下さい。

深く考えずに、とにかく、思い付く限り、全部書き出して下さい。

例えば、

○ステータス
・通常
・死亡している
・飛んでいる
・麻痺している
・混乱している
・気合を貯めている
・気合を貯め終わっている(前のターンで気合を貯めた)
・祈っている
・祈り終わっている(前のターンで祈った)
・特技使用不可
・精神統一している
・精神統一し終っている(前のターンで精神統一した)
・精神統一後の1回目の攻撃をした
・まねまねしている

○行動
・通常時
 飛ぶ(攻撃キャラで飛べるキャラのみ)
 気合を貯める(気合が使えるキャラのみ)
 祈る(祈れるキャラのみ)
 敵を攻撃する(攻撃キャラのみ)
 防御する
 回復薬で回復する(薬を持っている時のみ)
・死亡時
 死亡し続ける
・飛んでいる時
 攻撃する(攻撃キャラのみ)
 攻撃し終わったら通常状態になる
・麻痺時
 麻痺から自動回復(乱数?一定ターン過ぎたら?) 
 麻痺し続ける
・混乱時
 敵に回復をかける(乱数?回復魔法の使えるキャラのみ)
 味方を攻撃する(乱数?攻撃キャラのみ)
 味方に状態異常の魔法をかける(乱数?魔法の使えるキャラのみ)
 何もしない
・気合を貯めている
 何もしない。気合を貯め終わっている状態になる
・気合を貯め終わっている
 気合入り特殊攻撃をして、通常状態になる。
・祈っている
 何もしない。祈り終っている状態になる
・祈り終っている
 特技を敵味方一切使えなくして、特技使用不可になる
・特技使用不可
 特技以外の行動をして、一定のターン後、通常状態になる
・精神統一している
 何もしない。精神統一し終っている状態になる
・精神統一し終っている
 攻撃し、精神統一後の1回目の攻撃をした状態になる
・精神統一後の1回目の攻撃をした
 ターン後にもう一度攻撃し(連続攻撃)、通常状態に戻る
・まねまねしている
 敵と同じ事をして、通常状態に戻る

のように。

もれなく全部書き出したら、「状態」と「行動」と「行動の結果、なる状態」に、抜けが無いか確認しましょう。

例えば「体力が低下している状態」があって、その状態で選べる行動に「回復薬を飲む」と言う行動があるのに「回復薬を飲んだ結果」が書いて無かったりすると困ります。そういう「抜け」が無いかチェックしましょう。

チェックして抜けが無いと判ったら、あとは「書き出した通りにプログラムするだけ」です。

鉄則は「深く考えるな」です。

「状態」と言うステータスがあるなら、そのステータスを「すべて書き出し」して下さい。1つも漏らさず、考える限りのすべてを書き出します。

そして「そのステータスの時に、どの行動が出来るか?」を、ステータスごとに全て書き出して下さい。

そして「出来る行動を選んだ時、どういうステータスになるか」も、行動ごとに全て書き出して下さい。

深く考えずに、とにかく、思い付く限り、全部書き出して下さい。

例えば、

○ステータス
・通常
・死亡している
...続きを読む

QRPG等のゲームの作り方を紹介したサイトは?

先ほどの投稿がよくなかったようですので、改めました。

C言語でRPGやシューティングゲームのようなゲームを作りたいのですが、
画像や音声を扱う扱い方がわかりません。

C言語でゲームの作り方を「わかりやすく」紹介したサイトありませんでしょうか。
よろしくお願いします。

Aベストアンサー

RPGやシューティングを作るには確かに画像や音声を扱う必要がありますね。
DXライブラリというライブラリを使うとものすごく簡単にRPGやシューティングゲームなどをC言語で作る事が出来ます。

http://l.huu.cc/g/

こちらのサイトには本当に「わかりやすく」ゲームプログラムの方法が書かれています。

一度参考にされてみてはいかがでしょうか?

参考URL:http://l.huu.cc/g/

Qドラクエ4の戦闘のAIが知りたい

どのジャンルで質問するのがベストなのか迷いましたが
C言語をやっている方なら詳しいんじゃないかと思いました。宜しくお願いします。

条件として
・敵が4人、プレーヤー4人(例えばわかりやすく、戦士、戦士、戦士、賢者とします)
・AIとして、ドラクエ4では「ガンガンいこう」や「呪文を使うな」などありますが、
今回は「みんながんばれ」で(要は、回復呪文、攻撃呪文、攻撃を均等に行う)
・賢者の呪文は「ヒャド(攻撃系)、ホイミ(回復系)、スカラ(守備系)、ルカニ(攻撃補助系)」が使えるとします

実際にプログラムを組んでいて分からないところは、呪文を使う時で、
その時、その時で何の呪文を使えば良いのか決める基準が分からないのです。
例えば、味方1人(戦士)のHPが70の時(MAXは100)、
1、その時点で回復した方がベストなのか?
2、敵にダメージを与えた方がベストなのか?
3、スカラを唱えて味方の守備を上げてこれから続く戦いに備えた方がベストなのか?
など、何がベスト(ベストじゃなくても限りなくそうなるように)なのかが分かりません・・・
例えば3だったら敵全員のHPや見方の攻撃力などを調べて、普通に攻撃してたら
あと何ターンで倒せるのかを計算しなくてはなりません(たぶん)
いやそれ以上に調べる個所があるかも・・・
そういうの(攻撃系、回復系、守備系、攻撃補助系)を全部ひっくるめて評価関数
みたいなのにかけれないでしょうか?攻撃した場合の評価(ヒャドなどの攻撃、ルカニなどの間接攻撃)
と守備に徹した時の評価(ホイミなどの回復、スカラなどの防御力UP)を分けるんじゃなくて、
全部一緒に評価して、その返ってきた1番大きい値のものを実行するみたいな。。
自分で言っててなんですが、その評価関数自体の内容もあまりイメージできていませんけど・・・

どのジャンルで質問するのがベストなのか迷いましたが
C言語をやっている方なら詳しいんじゃないかと思いました。宜しくお願いします。

条件として
・敵が4人、プレーヤー4人(例えばわかりやすく、戦士、戦士、戦士、賢者とします)
・AIとして、ドラクエ4では「ガンガンいこう」や「呪文を使うな」などありますが、
今回は「みんながんばれ」で(要は、回復呪文、攻撃呪文、攻撃を均等に行う)
・賢者の呪文は「ヒャド(攻撃系)、ホイミ(回復系)、スカラ(守備系)、ルカニ(攻撃補助系)」が使える...続きを読む

Aベストアンサー

★どうやら本格的にRPGゲームを作っていますね。
・『AI』はいろいろな方法があります。→質問者さんの自由ですよ。最終的にはね。
・今回は『みんながんばれ』のアルゴリズムですね。

●評価関数のアルゴリズム(一例)
・まず、味方1人(戦士)の HP が 70 の時に、最大攻撃(平均攻撃)であと何回で
 『敵パーティ』を全滅させられるかの回数をはじき出します。→サブ関数で。
・それで、現在のターンで全滅させられるのならば、(2)番の『敵にダメージ』を
 与えると評価します。→残りの仲間の攻撃数も考慮して。
・もしも、回数が数ターンの場合は、敵の中で一番攻撃力が高い、最大攻撃以下に
 HPが下回っているか調べ、下回っていたら(1)の『回復系呪文』と評価します。
 でも、『回復系呪文』が唱えられない場合も考えて MP の関係で『スカラ系』の
 呪文を行うようにも評価させます。→残りの MP も調べて。
・上記以外で戦闘が長引きそう(敵の攻撃力が仲間よりも平均的に大きい場合)は、
 スカラ系(攻撃補助呪文)がある時は、(3)の『攻撃補助呪文』と評価します。
・よって、『味方パーティ』と『敵パーティ』の平均攻撃から何ターンで敵を全滅
 させられるかを中心に『敵に攻撃』か、『味方の守備力UP』そして、『味方回復』
 と評価させていきます。→HP に余裕がある場合には『攻撃』、少なければ『回復』
 戦闘が長引きそうならば『攻撃補助』の順に評価させます。でも残り MP も考えて
 さらに、魔法を唱えられない場合の第二評価関数をサブ関数として作ります。

まとめ:
・何ターン(何回)で『敵パーティ』を全滅させられるかのサブ関数。
・HP を調べ『攻撃』か、『守備・回復』かの判定サブ関数。
・MP を調べ『回復』か、『守備(スカラ)』かの判定サブ関数。
・MP を調べ『魔法』か、『攻撃・防御』かの判定サブ関数。
・上記のサブ関数を呼び出しメイン評価関数。
・以上。最適でも 5 の関数(処理)に分ける必要がありそうです。

補足:
・また、味方の職業(戦士・賢者)でも判定サブ関数の状態を変化させるように、
 職業別に処理を定義させると、さらに賢い『AI』システムを構築できます。
 この場合は職業別にサブ関数を作って、関数のポインタで切り替えたりします。
 つまり、転職(パーティ入れ替え時)のときに関数ポインタを切り替えるのです。
・素晴らしい『AI』システムを作るには、まず、人間(質問者さん)ならばどれが、
 一番よい『攻撃・回復・守備』かを考え、それを元に判定サブ関数と評価関数を
 作り上げていきます。→ソースファイルを分けて1つの『評価システム』という
 感じで作っていきましょう。
・以上。おわり。参考にして下さい。→昔、RPG 作ったときのアルゴリズムです。

★どうやら本格的にRPGゲームを作っていますね。
・『AI』はいろいろな方法があります。→質問者さんの自由ですよ。最終的にはね。
・今回は『みんながんばれ』のアルゴリズムですね。

●評価関数のアルゴリズム(一例)
・まず、味方1人(戦士)の HP が 70 の時に、最大攻撃(平均攻撃)であと何回で
 『敵パーティ』を全滅させられるかの回数をはじき出します。→サブ関数で。
・それで、現在のターンで全滅させられるのならば、(2)番の『敵にダメージ』を
 与えると評価します。→残りの仲間の攻撃数も考慮し...続きを読む

QRPGのサンプルプログラム

こんにちは。
私は現在ゲーム(特にRPG)を作りたくプログラミングの勉強をしており、参考にするためサンプルプログラムを探しています。

パズルやシューティングのサンプルでしたらいくつも見つけたのですが、RPGとなるとなかなか見つかりません・・・

どなたかよいRPGのサンプルプログラムをご存じないでしょうか?

最終的にはiphoneのRPGアプリを作りたいと考えているので、できれば言語はobjective-C、C言語、C++あたりが望ましいです。

よろしくお願いいたします。

Aベストアンサー

RPGは極端に少ないと言って良いと思います。

Windows、C言語、DXライブラリですが、どうでしょうか?
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2

QC言語で簡単なゲームを作る方法

僕はC言語を学び始めた程度ですが、一番簡単に作れるゲームとその作り方(ソース)を教えて下さい。お願いします。

Aベストアンサー

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP_KATI : TYP_MAKE);
  case JKN_CHOKI:  return ((computer == JKN_PA) ? TYP_KATI : TYP_MAKE);
  case JKN_PA:  return ((computer == JKN_GOO) ? TYP_KATI : TYP_MAKE);
  default:   return -1;
 }
}

// じゃんけんゲーム
int main( void )
{
 // ゲーム変数
 int count;  // 勝負回数
 int kati = 0; // 勝ちカウンタ
 int make = 0; // 負けカウンタ
 // 一時変数
 int human;  // キー入力の一時変数(人間用)
 int computer; // 乱数発生の一時変数(コンピュータ用)
 
 // (6)じゃんけん勝負を10回行う
 printf( "★じゃんけんゲーム(10回勝負)\n\n" );
 for ( count = 1 ; count <= 10 ; count++ ){
  // (1)人間:3つの状態を入力
  printf( "%2d回目…[1]グー [2]チョキ [3]パー を入力して下さい:", count );
  do {
   // (2)キー入力
   switch ( getche() ){
    case '1': human = JKN_GOO; break;
    case '2': human = JKN_CHOKI; break;
    case '3': human = JKN_PA; break;
    default: human = -1; break;
   }
  } while ( human == -1 );
  
  // (3)コンピュータ:3つの状態を乱数で決める
  computer = (rand() % 3);
  // (4)人間vsコンピュータの勝負
  switch ( check(human,computer) ){
   case TYP_KATI:
    kati++;
    printf( "⇒勝ち。\n" );
    break;
   case TYP_MAKE:
    make++;
    printf( "⇒負け。\n" );
    break;
   case TYP_AIKO:
    printf( "⇒引き分け。\n" );
    break;
   default:
    printf( "⇒エラー。\n" );
    break;
  }
 }
 // (7)結果表示
 printf( "\n★じゃんけんゲームの結果\n" );
 printf( "人間    :%d 回勝ち\n", kati );
 printf( "コンピュータ:%d 回勝ち\n", make );
 printf( "※引き分け回数は %d 回でした。\n", (10 - kati - make) );
 return 0;
}

注意:全角空白をタブ文字に変換して下さい。

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP...続きを読む


人気Q&Aランキング