童貞のプログラミング

童貞の頭の中を垂れ流します。

ゲームを作ってみる①~じゃんけん~

ゲームを作ってみる①

はじめに

初心者を脱却したいのであれば、一度自分でプログラムを作ってみるのがいいと、知恵袋で見かけたので、今回はc言語で簡単なゲームを自己流で作ってみようと思う。

といっても、私はまだ参考書を1冊写経した程度で大したものが作れる自信がないので、今回はひとまず簡単そうなじゃんけんゲームを作ってみる。

 

 

設計書作成

まず最初に、設計書を作ってみる。


1.プログラムを起動

2.じゃんけんを開始

3.プログラム側で敵のじゃんけんの値を決める

4.自分側の入力

5.比べる

6.結果報告

7.終了

 

やりたいことは大体7つに分かれた。
だいぶ雑だが仕事じゃないし、こんな感じで大丈夫だろう。これをもとにプログラムの大枠を作ってみる。

プログラム作成

f:id:SitimiMayo:20210201233529p:plain

じゃんけんゲーム‗コード1

我ながらこれは酷い。
もう少し自分で書き込めるかと思ったが本もネットも見ないとすぐに書けるのはこの程度だった。
これじゃあ、コンビニ店員に裏でprintfさんとか呼ばれそう

とりあえず自分の中でわからないところは、ダブルクォーテーション("")でくくったので、やりたいことを調べながら1つずつ処理を追加してみる。

一番最初は
""ランダムで値を決める関数を使う(ここで敵側の値を決める)""

ランダムな値を使う関数を調べてみたところ"rand関数"なるものが乱数を発生させてくれるらしい。
何か使えそうなので使ってみる。

使い方は
例)1~10のランダムな数値の出力

rand() % 10 + 1

こんな感じらしい。

 

f:id:SitimiMayo:20210201235221p:plain

rand関数‗コード1

f:id:SitimiMayo:20210201235436p:plain

rand関数‗結果1

おお、何かランダムに出てるっぽい!
試しにもう一回使ってみる。  

 

f:id:SitimiMayo:20210201235436p:plain

rand関数‗再結果

え?

同じ値が出てきた。

同じ画像使ってるだけだろと思うかもしれないが違う 。本当に何度繰り返しても同じ値が返ってくる。

調べてみたら、どうやらrand関数だけでは完全なランダムな値を出せるわけではないらしい。

ランダムな値を出させるにはrand関数と別にsrand関数とtime関数を組み合わせて使うようだ。

rand関数は乱数生成

srand関数でその乱数の種類を決めている

time関数はsrand関数を可変にするために必要

 

要は、randだけだと

例(今回の私の環境)
4、7、6、4、6、7、3、10、2........

こんな風にあらかじめ決められているらしい。

それをsrandを使うことで変えられる。

srand(1)

srand(2) 

srand(5)

srand(100)

こんな風にかっこの中に数字を入れると出てくる乱数の種類が変わる。

けど、このやり方だと数字が固定化されてrand関数使っているときと同じようにプログラムを呼び出すたびに同じパターンの乱数しか返らないので、time関数を使うことで回避する。time関数は現在時刻を出力する(※正確には違う)から基本同じ値を返さない。

srand((unsigned int)time(NULL));

基本定型文みたいなもので、この形で記述すればsrandが必要な数字の形で取得ができる。

 

f:id:SitimiMayo:20210205001538p:plain

srand関数、time関数を追加したテストコード

 

f:id:SitimiMayo:20210205000409p:plain

srand関数、time関数を追加したテスト結果(1回目)

f:id:SitimiMayo:20210205000600p:plain

srand関数、time関数を追加したテスト結果(2回目)

f:id:SitimiMayo:20210205000712p:plain

srand関数、time関数を追加したテスト結果(3回目)

おおお!同じコードを繰り返しても毎回出てくる値の順番もパターンも完全に変わっている。

これで、乱数を生成がわかったので、じゃんけんのコードに追加してみる。

 

 

f:id:SitimiMayo:20210204234331p:plain

srand関数、time関数を追加したコード

 

本当は1回きりで終わると思ってたけど、予想よりも先が流そうなので次回もじゃんけんゲーム作っていきます。

 

まとめ

一応、忘れないように今回覚えたことをまとめ。

ゲームなどを作る際に必要な乱数を発生させるには、rand関数、srand関数、time関数の3つを組み合わせて作る。どれか一つでもかけてたらダメ。

それそれの役割は

rand関数は乱数生成

srand関数でその乱数の種類を決めている

time関数はsrand関数を可変にするために必要

 

使い方は

--------------------------------------------------------

int a;

srand((unsigned int)time(NULL));

a=rand() % 10 + 1;

print("d%\n",a);

--------------------------------------------------------

これで、1から10の値をランダムに出すことができる。