練習問題のように断片的なプログラムではなく、まとまりのあるプログラムを作ることによって、
“設計”→“コーディング、デバッグ”→“テスト、修正”
という基本的な工程を体験します。
よくある例題として、簡単なアドレス帳を作るというようなものがありますが、実際に使用することの無いそのようなプログラムは、あまり面白いものではありません。
この練習プログラム集では、学習者に少しでも“プログラミングの面白さ”を感じてもらえるよう、ゲームを題材としました。
また、パーソナル・コンピューターの黎明期に流通していたテキスト・ベースのゲームの世界を、これからプログラミングを始める人たちに知ってもらいたいということも理由のひとつです。
■ この練習プログラムは...
-
プログラムのレベル
基本的には“C言語練習問題集”、“Java練習問題集”の範囲で作成できますが、一部では練習問題集で触れていない書式も使用します。 -
入出力について
C言語の場合、出力は printf、入力には scanf 関数を使用すれば作成できます。
Javaの場合、出力は System.out.print、入力には BufferedReader を使用すれば作成できます。
-
仕様の厳密さ
出題の文章だけでは仕様に曖昧さがありますが、ゲームとして成立するよう、補ってください。
■ 擬似乱数を発生する関数
標準ライブラリに擬似乱数を発生する関数が用意されています。サイコロを振る関数と考えてください。
int rand( void ); stdlib.h
rand 関数は、0 ~ RAND_MAX ( 32767 ) の範囲の整数の擬似乱数を返します。関数を呼び出すたびに違う値を返すのですが、プログラム起動からは毎回同じ値を返します。
■ 擬似乱数の初期化
プログラムを起動するたびに違う値を返すようにするためには、srand 関数を使用します。
void srand( unsigned int seed );
seed に毎回違う値を渡すことによって、rand 関数で得られる値が変わります。
ここで問題となるのが、毎回違う値をどのように得るか、ということです。これには現在時刻を得る time 関数( time.h )を使用します。プログラムを起動する時間は毎回違うはずなので、得られる値も毎回違います。
以下の文を、プログラムの最初に1回だけ実行することで、rand 関数で毎回違う値が得られます。
srand( (unsigned int)time(0) );
詳しくは、それぞれの関数のリファレンスを参照してください。
例: 1 ~ 6 の数字を 10 回表示するプログラム
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main()
{
int i;
srand( (unsigned int)time( 0 ) );
for( i = 0 ; i < 10 ; i++ ){
int n = ( rand() % 6 ) + 1;
printf( "%d ", n );
}
}
実行結果
5 6 2 5 1 6 4 4 6 1
Javaで乱数を発生させるには、Random クラスを使用します。
Randomクラスのインスタンスを作成し nextInt メソッドを呼ぶと、引数に指定した整数よりも小さい整数が得られます。
C 言語のような初期化は必要ありません。
Randomクラスを使用するためには、
import java.uti.*; または、import java.util.Random;
の記述が必要になります。
例: 1 ~ 6 の数字を 10 回表示するプログラム
import java.io.*;
import java.util.*;
public class Dices
{
public static void main(String[] args)
{
Random RandObj = new Random();
for (int i = 0; i < 10; i++)
{
int n = RandObj.nextInt(6) + 1;
System.out.print(Integer.toString(n) + " ");
}
}
}
実行結果
1 5 6 5 1 2 1 3 6 5