Lying Devils

日々いろんなことを呟いていく。そんな感じ?

【C言語】今日の謎【解決済み】

前書き

 春休みになって色々だらけてて最近暇です。本当は運転免許所とかを取らなきゃいけないんですけど時期的なものを逃した感があってもう色々としんどい感じになっててどうしよう見たいな感じです。

 いつもはApexばっかやってるのでその時間を有効活用したいと思ってます。

本題

 以下の様なプログラムを作ったんですよね。(github未上げ状態なので直書きします)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int roll(int x, int y, int mode){

 int count;
 int x2 = x;
 int num = 0;

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

 for(int i = 0; i < x2; i++){
    num += rand() % (y + 1);
    printf("[%d回目] ... %d\n",i + 1,num);
    if(mode == 1){
       count++;
    }
 }
 return num;
}

int main(){

 int mode,x,y;
 char d;

 puts("-----xdy-----\n x ... ダイスの個数\n y ... ダイスの面数\n-------------");
 while(mode != 0 && mode != 1){

    puts("モードを選んでください\n0 ... no mantion\n1 ... for DX3rd");
    scanf("%d",&mode);
    if(mode != 0 && mode != 1)
    puts("ERROR. PUT AGAIN.");
 }

 puts("xdyの形で入力してください");
 scanf("%*c%d %c %d",&x,&d,&y);

 printf("%d面ダイスを%d個振ります\n",y,x);
 printf("出目は%d\n",roll(x,y,mode));

 return 0;
}

 最近身内でTRPGをする事が多いので、それの為に&勉強がてらCoCとDX3rd用のダイスプログラムを作ってみようと思った訳です。

 色々ゴミが挟まってますが、やらんとする事は、xdyの形で定義されたダイスロールをしてもらって、それぞれその結果を出してもらうプログラムです。

 ちょうどいいので合計値まで出してもらおうと思ってnumを順番に足し合わせる事もしています。

 この時点で「num合計してる位置が違うからちゃんと出力されないやろ」と思われますがそこじゃないんです。

 これをコンパイルして起動したログの結果が以下の様に出たんです。

$ ./xdy
-----xdy-----
 x ... ダイスの個数
 y ... ダイスの面数
-------------
モードを選んでください
0 ... no mantion
1 ... for DX3rd
0
xdyの形で入力してください
10d10
10面ダイスを10個振ります
[1回目] ... 5
[2回目] ... 14
[3回目] ... 16
[4回目] ... 23
[5回目] ... 26
[6回目] ... 33
[7回目] ... 39
[8回目] ... 42
[9回目] ... 48
[10回目] ... 49
出目は49

 ほかにも何度かやったのですが、明らかに最後に出た値が出力されてるんですよね…。

 これを合計するのを別の変数に格納したら正常に動いたので多分加算処理に何かしら問題があるんだとは思うのですがなんでなのかはさっぱり分かりません。

 そして手を変えたら普通に動いたからもうこれ以上触る事もない気がします。

 ただどうしてこうなるのかなと気になったのでとりあえず書いてみた感じです。

まとめ

 よくわかんない! 以上!ノシ

追伸

 ちなみに出来上がったものがこちらになりますつ https://github.com/merlioneko/test/blob/main/TRPG/xdy.c

追伸2(2021年7月7日)

 久しぶりにブログを書こうかと思ったところ本記事がいいねされておりまして大変うれしく思いました。もしかしたら誰かの助けになったのではないかと思い、もう一度本記事を読みなおしたところ、明らかな間違いを犯していた事を理解しました。

 for(int i = 0; i < x2; i++){
    num += rand() % (y + 1);
    printf("[%d回目] ... %d\n",i + 1,num);
 }

 無意味なコードを省きましたが、これが主なダイス振りのコードですね(自分で言うのもなんだけどめちゃくちゃ簡単なコードだぁ…)

 ここでもう一度説明をさせていただきますが、本プログラムは「指定されたx回で、指定されたy面数のダイスを振り、そのログと合計値を出すもの」です。

 つまりnumに合計値を格納し、それを返して合計値を出しつつ、指定された回数分振った際に出た出目をログで吐くものです。

 もう一度コードを見てください。

 もうお気づきでしょうか。

 間違ってますねこれ。

 多分、当時の僕は「うはwwwwwwこれなら文字数節約できるwwwwwwww俺神wwwwwww」と思ってちゃんと自分のコードを読んでなかったのでしょう。

 これだと「指定された回数分、指定されたダイスを振って、現在の出目の合計値を吐き出すプログラム」になってます。

 はい。

 それだけでした。

 そりゃあ最後の奴だけ吐き出されるに決まってんだろつかログ見た時点で気付かなかったのか馬鹿。

 みなさんもこういった事が起こらない様にフローチャートをしっかり書いてからプログラムは書きましょうね(そういうレベルの問題じゃない)。

 というわけで何か月かぶりにつっかえ!がとれました。

 これからもこんなクソザコプログラミング自身ニキ()をよろしくおねがいします。