質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

c言語 スロットで出た人の名前、数字によっていろいろな処理をしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 952
退会済みユーザー

退会済みユーザー

c言語を利用して簡単なスロットマシーンを作成しようとしています。
今、自分はスロットで 人の名前 乱数(数字)1、乱数(数字)2、乱数(数字)3でスロットを回転させることまではできました。しかし、スロットの結果に応じてプログラムの処理を行おうとするところで自分の思い通りのプログラムの処理が出来ません。原因が分からないので教えていただきたいです。

現状のコード

include <signal.h>
include <stdio.h>
include <stdlib.h>
include <time.h>
include <unistd.h>

int x[4];
long gold;
char *name[2] = {"木村","田中"};
char **nam;

int main(int argc, char *argv[])
{
void cls();
void mvcur(int,int);
void stop();
void msgout();

nam = name;

srand(getpid()); //乱数生成の準備
signal(SIGTSTP,stop); //SIGTSTPシグナルハンドラの登録
signal(SIGALRM,msgout); //ALARMシグナルハンドラの登録
srand(time(NULL));

alarm(60);  //アラームクロックを設定
gold = atoi(argv[1]);  //掛金の設定

cls();  //コンソールクリア
mvcur(10,10);  //10行10列にカーソルを移動
printf("Ctrl-Z でスロット停止\n");

while(1){
x[0] = rand()%10; //1桁の乱数を得る
x[1] = rand()%10; //1桁の乱数を得る
x[2] = rand()%10; //1桁の乱数を得る
mvcur(12,10);  //12行10列にカーソルを移動
printf("%s %d %d %d",nam[rand() % 2],x[0],x[1],x[2]);
fflush(stdout);
usleep(100000);
}

return 0;
}

//SIGTSTPシグナルハンドラ
void stop()
{
void mvcur(int,int);
void cls();

mvcur(12,10);  //12行10列にカーソルを移動
printf("%s %d %d %d",nam[rand() % 2],x[0],x[1],x[2]);
fflush(stdout);

if(x[0] == x[1] && x[1] == x[2] && nam[rand() % 2] == "木村"){
mvcur(14,10);
printf("当たり!木村は賞金 $%ld 獲得!\n",gold*100);
}

else if(x[0] == x[1] && x[1] == x[2] && nam[rand() % 2] == "田中"){
mvcur(14,10);
printf("当たり!田中は賞金 $%ld 獲得!\n",gold*100);
}

else if(nam[rand() % 2] == "木村"){
mvcur(14,10);  //12行10列にカーソルを移動
printf("残念!木村は掛金を $%ld 失った!\n",gold);
}

else if(nam[rand() % 2] == "鈴木"){
mvcur(14,10);  //12行10列にカーソルを移動
printf("残念!鈴木は掛金を $%ld 失った!\n",gold);
}

else(nam[rand() % 2] == "田中"){
mvcur(14,10);  //12行10列にカーソルを移動
printf("残念!田中は掛金を $%ld 失った!\n",gold);
}

mvcur(15,10);  //12行10列にカーソルを移動
printf("Enterキーを押すと継続します。\n");
getchar();  //キーが押されるまで待つ;

cls();  //コンソールクリア
mvcur(10,10);  //10行10列にカーソルを移動
printf("Ctrl-Z でスロット停止\n");

return;
}

//ALARMシグナルハンドラ
void msgout()
{
printf("\n");
printf("タイムアウトしました!\n");

exit(0);
}

//コンソールをクリア
//(VT100エスケープシーケンスコード)
void cls(void)
{
static char esc=033;
fprintf(stdout,"%c[2J",esc);
fflush(stdout);
return;
}

//指定した座標(行、列)にカーソル移動
//(VT100エスケープシーケンスコード)
void mvcur(int lin, int col)
{
static char esc=033;
fprintf(stdout,"%c[%d;%dH",esc,lin,col);
fflush(stdout);
return;
}

実行結果の例

 
Ctrl-Z でスロット停止

木村 8 1 0^Z

残念!田中は掛金を $1000 失った!
Enterキーを押すと継続します。

 

このようにスロットで名前(木村)が当たったのに、掛け金を失った人の名前は木村ではなく田中になってしまうときがあります。おそらく乱数をうまく扱えていないのだと思いますが。本来はこのスロット結果の場合 

残念!木村は掛金を $1000 失った!

となるようにしたいです。思い通りにならない原因を教えていただきたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pepperleaf

    2019/01/23 23:52

    このままでは、コードが読みずらいので、<code>ボタンで出る `````` の中にコードを入れてください。 また、<code>タグを付けていないで、 #の文字とかが消えています。
    ところで、デバッグはしてみましたか ? rand()関数は呼び出す毎に異なる値を返すと思いますが、それで問題ないでしょうか?

    キャンセル

回答 1

0

stop関数のif条件が乱数になっていますね。nam[rand() % 2]
これでは正しく判定できません。
main関数のスロット乱数と同じように保持しましょう。

蛇足ですが、このような画面制御したい場合はncursesというライブラリがあるので、興味があれば使ってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る