• ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★じゃんけんゲームのソースです。 #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; } 注意:全角空白をタブ文字に変換して下さい。

mantis777
質問者

お礼

ありがとうございます。このソースを使って勉強してみます。

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

>ありがとうございます。一日50ページのペースで進んでポインタでつまずきました。このポインタの先が「11.関数の作り方」みたいです。数あてゲームはだいたいわかりましたがvoidというのが本になくてわからりませんでした。 ポインタですか。C言語でつまずく人は多いんですよ。 ポインタ入門をいくつか紹介↓自分なりにわかり易い所を読んでください。 http://itpro.nikkeibp.co.jp/article/COLUMN/20061206/256198/?ST=develop http://www.stackasterisk.jp/tech/program/c01_05.jsp http://www.cda.ics.saitama-u.ac.jp/~maekawa/lect/C/ http://www.binzume.net/library/robo/c08.html voidについて解説します。 void func(void) { //関数の中身 } という関数があった場合、 関数は値を返すのが普通です。intとかfloatとか。でも値を返さなくてよい関数があった場合は関数名の左側にvoidと書きます。この関数は値を返しませんって意味です。 関数名の右側の()なかにあるvoidは、パラメータを一切受け取りませんという意味です。 両方ともvoidだと何も受け取ったり、何も返しませんってことになりますが、紹介した「数あてゲーム」だとグローバル変数でaで情報を関数submに渡してます。 今見ると「数当てゲーム」のソースコードは、あんまり良くない例ですね。もっとわかり易くソースコード書けます。 subm→chiisai→submと関数呼び出しが深くなる必要はないので、whileループを使ったほうがシンプルで分かりやすくなるでしょう。 C言語の理解力アップのために自分なりに書き換えに挑戦してみてください。

mantis777
質問者

お礼

ありがとうございます。やはりポインタはC言語の難関のようですね。ここは急がず落ち着いて勉強しようと思います。voidの説明もありがとうございました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★簡易ゲーム講座。 >一番簡単に作れるゲームとその作り方(ソース)を教えて下さい。お願いします。  ↑  あらら…。とにかくゲームを作りたいんだ。 ・いろいろありますが『じゃんけんゲーム』はどうですか?  仕組みは  (1)キー入力を待つ。→getch() 関数  (2)キー入力から『グー』、『チョキ』、『パー』の3つの状態を得る。  (3)乱数を使ってコンピュータの『グー』、『チョキ』、『パー』を決める。→rand() 関数  (4)(2)の状態と(3)の状態から勝敗を決める。→switch文で条件分岐  (5)『勝ちカウンタ』や『負けカウンタ』を増加させる。→kati++、make++  (6)じゃんけんの勝負を 10 回行ったかチェックする。  (7)10 回以下なら(1)へ戻り続ける。10 回なら終了して結果を表示。  こんな感じでどうですか。 ・テキスト・ベースのゲームですが基本はしっかりとおさえているはずです。  ポイントはキー入力、3つの状態、乱数を使ったゲーム性、終了条件の仕組みなどです。  前回、パズルゲームを作りたいとなっていましたが、パズルを動かすためにキー入力の  処理は不可欠です。そして条件判断も必要です。終了条件はもっと重要です。  C言語のテキスト本には載っていない事ばかりです。  でもこの載っていないことを自分で考えることが重要なのです。→ゲームの『アルゴリズム』と呼ぶ。  前回の『回答へのお礼』にアルゴリズムはどうやって勉強したらいいでしょうか。となっていましたね。  まずは基本の if、else、switch、for、while、関数などをしっかりと理解してから、  それらを使ってコンピュータでどのように処理すれば良いかの手順を考えます。  最初はイメージがわかなかったり、コツがつかめないので難しく感じるでしょう。 ・そこで今回はじゃんけんゲームを通してアルゴリズムを少し紹介したわけです。  上記の(1)~(7)が『じゃんけんゲーム』のアルゴリズムという事になります。  それでは上記の(1)~(7)を元に『じゃんけんゲーム』を作って見ましょう。→簡易ゲーム講座。  まずゲームで必要な変数を整理します。  (1)じゃんけんゲームの勝負回数を管理する『カウンタ変数』→count  (2)勝負したときの『勝ちカウンタ』と『負けカウンタ』を用意→kati、make  (3)人間のキー入力用の変数を用意→human  (4)コンピュータ用の変数を用意→computer  上記の4つの変数を用意すれば出来そうです。 ・次の回答で『じゃんけんゲーム』のソースを載せておきます。  いきなりすべてを理解できるとは思えませんが、次のポイントを持っている C 言語のテキストを  読み直しながら遊んでみて下さい。  サンプルゲームのポイントは  (1)変数の宣言と使われ方(役割)。  (2)for 文による勝負回数。  (3)getche() 関数によるキー入力と do-while 文の使われ方。  (4)switch 文の使い方と処理の記述。  (5)結果表示の printf() 関数の使い方。  (6)main() 関数と check() 関数に処理を分けている点。  (7)check() 関数でグー、チョキ、パーの3つの状態を判定するアルゴリズム。   (a)『human == computer』で引き分け。   (b)switch 文で人間のグー、チョキ、パー状態での勝ち、負け判定。  (8)記号定数を利用してのプログラミング。  (9)check() 関数で使っている条件演算子。→(a ? b : c)という部分。  以上の項目を持っているテキストなどを使って確認して置きましょう。  紹介した『じゃんけんゲーム』は自由に改変して構いません。どうぞ。 ・以上。→コンパイルして少し楽しんでみて下さい。

mantis777
質問者

お礼

長文ありがとうございます。ifなどはちょうど勉強が終わったところです。アルゴリズムは計算とかの手順のことなのですね。それにしてもC言語ってたくさんあるんですね。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

えっ、この間「プログラミング学習シリーズ C言語1 初めてのCプログラミング」を読み始めたばかりで、そこまで進んじゃいました? 急ぐのも良いですが、C言語の基本を身につけていないと人の書いたプログラムを読みこと自体難しいですよ。 私の紹介した苦Cの練習問題で、最低でも「11.関数の作り方」までの練習問題が簡単に答えられるぐらいの知識はほしいところです。 http://homepage3.nifty.com/mmgames/c_guide/ とりあえず何点か紹介しときます。 http://www5f.biglobe.ne.jp/~ymlab/program/c/kazuatec.htm http://www5f.biglobe.ne.jp/~ymlab/program/c/denntakuc.htm http://www5f.biglobe.ne.jp/~ymlab/program/c/blackc.htm http://homepage3.nifty.com/aokura/src/janken.html http://homepage3.nifty.com/aokura/src/puzzle.html http://www.c-production.com/contents/c/sec07.html さらに複雑ですが、オセロゲーム。 http://www.geocities.jp/civiltool/index/osero/osero.html まず見てみて理解できそうか教えてほしいです。

mantis777
質問者

お礼

ありがとうございます。一日50ページのペースで進んでポインタでつまずきました。このポインタの先が「11.関数の作り方」みたいです。数あてゲームはだいたいわかりましたがvoidというのが本になくてわからりませんでした。

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.1

作り方  1)ゲームの種類を決める  2)プレイヤーへの報酬/ペナルティを決める  3)終了方法を決める 大雑把にこんな感じです。 簡単なゲームであれば、テーブルゲームが良いでしょう。 「1から10までの数字から一つをランダムに選び、それを当てさせる」 「1から13までの数字から一つをランダムに選び、それが 7より大きいか小さいかを当てさせる」 「二つのサイコロを振り、合計が偶数か奇数かを当てさせる」 など、実際にあるゲームを思いつくままに作成してはどうでしょう。 報酬や、終了時はその状態を記憶させるかなどは自身のセンスに任せて良いですよ。 ソースを示され、それをそのまま入力しただけではプログラムを組めるようにはなりません。 何をしたいのか、何をさせたいのかを自分で理解したうえでプログラムを組まなければ覚える事はできません。 どのようにすれば、思ったことができるのか・・・どうしても分からないときに他人に頼るようにしましょう。 まったく分からないのであれば、教本にできそうなガイドブックを一冊購入しましょう。 ひとつの例として  Amazon.co.jp / たのしいC  http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84C-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/479732791X などどうでしょう。 基礎から覚えようという人でも十分理解できる内容です。

mantis777
質問者

お礼

ありがとうございます。ソースをそのまま入力するだけではだめですよね。もっと本を読んでいろいろ研究してみます。

関連するQ&A