簡単なゲーム1

ページトップへ 一つ上へ

ポイント


rand input isempty floor



さて、今回は簡単なゲームを作成します。
ゲーム作りを学びながら新しい関数を4つほど学びましょう。

まずブラックジャックを今回の題材に用います。
ブラックジャックというのは、簡単に言えば、

21以下の数字で数字の大きい人が勝ちっていう感じです。

厳密には、Aと10でBJとか5カードとか色々ありますが、
今回は全て無視をして、数字のでかい奴が勝ちとします。

さらにAは1と11のどちらにでも出来るってのもあるけど、
そんなややこしい事もここでは抜きにする。

さて、どうやって作っていくかですけど、
まずはコンピュータにカードを配ります。
ブラックジャックでは最初に2枚のカードを配ります。
カードを配るという行為は、変数に順々に代入していくだけでいいです。
カードの内容を決めなければいけません。
そこで、ランダム関数を用いて1〜10までの数字を出します。
ランダム関数は、

rand(n)
で求める事が出来ます。ここでnに数字を指定します。
n行n列のランダム行列を返す事になります。
今回ここでは1行1列のランダム数値を使えばいいので

rand(1)
とします。

しかし、ランダム関数は0〜1までの数値を返します。
要するに、0.2438とか0.7419なんかの数字です。
まずこれを10倍する事で、0〜10までの数値が入る事になります(小数含む)

rand(n)*10
そして、この小数を消さなくてはならないです。
ここで今回は負の無限大方向への丸めを行うfloor関数を使います。

floor(rand(n)*10))
こうする事で0〜9までの小数を含まない数値データが出力されます。
あとはこれに1を足せば、1〜10までのランダムな数値を出す事が出来ます。

floor(rand(n)*10))+1
これでカードを配るという事に関しては終りました。

あとはそんなに難しい事ではないので、先にプログラムを見て下さい。
function blackjack

%
% ブラックジャックもどき
%
%

fprintf('\nComputer\n');	% コンピュータの初期カード決定
y=floor(rand(1)*10)+1;	% 一枚目のカードの決定
fprintf('*\n');		% カードの数だけ*を書くという意味
y=y+floor(rand(1)*10)+1;	% 二枚目のカードの決定と合計
fprintf('*\n');

for i=1:30			% コンピュータの思考ルーチン
    if y >= 18			% 18以上なら勝負に出る
        break;
    elseif y == 17			% 17だったら、40%の確率で勝負
        h=floor(rand(1)*10);
        if h > 6
            break;
        else
            y=y+floor(rand(1)*10)+1;
            fprintf('*\n');
        end
    elseif y == 16			% 16だったら、50%の確率で勝負
        h=floor(rand(1)*10);
        if h > 5
            break;
        else
            y=y+floor(rand(1)*10)+1;
            fprintf('*\n');
        end
    else				% 16未満だったらもう一枚カードを引く
        y=y+floor(rand(1)*10)+1;
        fprintf('*\n');
    end
end

fprintf('\n\nyour turn  もう一枚(enter)いらない(n)\n');
x1=floor(rand(1)*10)+1;
fprintf('%d\n',x1);
x2=floor(rand(1)*10)+1;
fprintf('%d',x2);
x=x1+x2;

for i=1:30			% もう一枚引くかどうか
    command=input('','s');		% コマンド入力
    if isempty(command)		% isemptyは空行列であるかどうか判定する
        xx=floor(rand(1)*10)+1;
        fprintf('%d',xx);
        x=x+xx;
    elseif command=='n'
        break;
    end
end

fprintf('\n\ncomputer is %d\n',y);	% ここから結果表示
fprintf('you are %d\n\n',x);

if x <= 21 & y <=21
    if x > y
        fprintf('あなたの勝ち!!');
    elseif x == y
        fprintf('引き分け!!');
    else
        fprintf('あなたの負け!!');
    end
elseif x > 21 & y <= 21
    fprintf('あなたの負け!!');
elseif x <=21 & y > 21
    fprintf('あなたの勝ち!!');
else
    fprintf('引き分け!!');
end



以下に実行結果のサンプルを示します。