• ベストアンサー

プログラム

sankaku197の回答

回答No.2

ransuとdamage_pointの値をデバッグかMessageBox()を使って調べてみれば、解決すると思います。 また計算式が間違ってる可能性もあるので、「float damage_point2;」などを用意して小数点も確認しておくと、良いかもしれません。

関連するQ&A

  • 構造体データの出力でデータが化けます

    /* テスト用データは半角英数字で書き、半角スペースで区切ってメモ帳で書きました   Elfe 1 1 100 10 10 10 10 10 5 3 0 1 goblin 1 1 100 10 10 10 10 10 5 3 0 1 Slime 1 1 100 10 10 10 10 10 5 3 0 1 Orc 1 1 100 10 10 10 10 10 5 3 0 1 実行して表示させてみたところ大きな数字に化けます。 Elfe 7665736 7665740 7665744 7665748 7665752 7665756 7665760 7665764 7665768 766 5772 7665776 7665780 15012128  7665912 7665916 7665920 7665924 7665928 7665932 7665936 7665940 7665944 766594 8 7665952 7665956 15012128 なにがいけないのでしょうか? よろしくお願いします。 */ #include <stdio.h> #include <stdlib.h> #define MAX 10 typedef struct{// 構造体の宣言 char name[128];//プレイヤーキャラの名前 1 int loading;//ダンジョン階 2 int lv;//レベル 3 int exp;//経験値 4 int hp;//ヒットポイント 5 int mp;//マジックポイント 6 int atk;//攻撃力 7 int def;//防御力 8 int agi;//敏捷力 9 int heal;//回復量 10 int dmg;//ダメージ 11 int y;//Y座標 12 int x;//X座標 13 }player; int main(void) { int i, cnt; FILE *fp; player pc[MAX]; // 構造体配列の宣言 if( (fp = fopen( "player.txt", "r" )) == NULL ) { printf( "ファイルがオープンできません\n" ); exit( 1 ); } for( i = 0; i < MAX; ++i ) { if( fscanf( fp, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" // 構造体配列への読み込み ,pc[i].name, &pc[i].loading, &pc[i].lv, &pc[i].exp, &pc[i].hp, &pc[i].mp, &pc[i].atk, &pc[i].def, &pc[i].agi, &pc[i].heal, &pc[i].dmg, &pc[i].y, &pc[i].x ) != 4) break; } fclose( fp ); cnt = 0; // これでテスト printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" ,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x); cnt = 1; printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" ,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x); return 0; }

  • プログラミング☆

    1から10の乱数を 2つ同時に表示しようとしてるのですが、 実行すると2つとも同じ数字になってしまいます。 また、あとでその乱数の合計(=point) をだしたいのでx、yに乱数を代入したいのですがどのように したらいいのでしょうか?? 心やさしい方、お願いします。 #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); main() { int x=0,y=0,point; printf("start this game\n"); printf("here is your card\n"); x=dice(); y=dice2(); point=x+y; printf("your card is %d and %d point is %d\n",x,y,point); return 0; } /*ka-do1*/ int dice(void){ srand(time(NULL)); return 1+(rand() % 10); } /*ka-do2*/ int dice2(void){ srand(time(NULL)); return 1+(rand() % 10); }

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • 正規分布するプログラムを教えてください。

    正規分布する乱数プログラムを作りたいのですが、うまく作れません・・。 プログラムソースは長くなりますので見ていただかなくても結構なのですが、下記のようなプログラムを実行したところ、実行結果下記になり、正規分布にはなりませんでした・・。 色々ネットで調べたものの理解できないのでどなたか教えていただけないでしょうか>< 正規分布を利用して、例えば50~100位の間に分布する乱数を生成したりしたいのです。。。 #include <math.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #define PI 3.14159265358979323846264 double p_nor(){ double rnd,t,u,r1,r2; rnd=rand()%10000/10000.0; t=sqrt(-2.0 * log(1-rnd)); u=2*PI*rnd; r1=t*sin(u); return r1; } int main(){ int i,bunpu[30]={}; double p,min=0,max=0,total=0; srand((unsigned)time(NULL)); for(i=0;i<100000;i++){ p=p_nor(); for(int j=0;j<30;j++){ if(p>-2.0+0.1*j && p<=-1.9+0.1*j) bunpu[j]++; } if(min>p)min=p; if(max<p)max=p; total+=p; } printf("min:%f max%f 平均%f\n",min,max,total/100000); for(int j=0;j<30;j++){ for(i=0;i<bunpu[j]/200;i++){ printf("*"); } printf("\n"); } return 0; } 実行結果 min:-1.711381 max0.803275 平均-0.247841 **************** ************************************ ******************** **************** ************** ************ *********** ********** ********** ********* ********* ******** ******** ******** ******** ******** ******** ******** ************************************* ************************* *********************** *********************** ************************ **************************** ******************************** **************************************************************** ***********

  • 成績表示プログラム

    class Test { String subject; int point; void SetPoint(String s, int p) { subject = s; point = p; } String getPoint() { return subject + ":" + point; } } class Student { int id; String name; int subnum; Test[] test; Student(int i, String n, int s) { id = i; name = n; subnum = s; test = new Test[s]; for(int j = 0; j < s; j++) test[j] = new Test(); } String getName() { return id + " " + name; } int getGrade() { int sum = 0; for(int i = 0; i < subnum; i++) sum += test[i].point; return sum; } // メソッドのオーバーロード int getGrade(int a) { int base = 100 * subnum / a; int rank = getGrade() / base + 1; return rank; } void printScore() { System.out.println(getName()); for(int i = 0; i < subnum; i++) System.out.print(test[i].getPoint() + " "); System.out.println(); System.out.println("合計点:" + getGrade()); int rank = 5; System.out.println("評 価:" + getGrade(rank)); System.out.println(); } } class ClassRoom { public static void main(String[] args) { Student taro = new Student(12, "taro", 3); taro.test[0].SetPoint("国 語", 95); taro.test[1].SetPoint("数 学", 83); taro.test[2].SetPoint("英 語", 76); taro.printScore(); Student jiro = new Student(7, "jiro", 3); jiro.test[0].SetPoint("国 語", 66); jiro.test[1].SetPoint("数 学", 97); jiro.test[2].SetPoint("英 語", 72); jiro.printScore(); } } このJavaのプログラムを画面上に表示させて、下記のようなプログラムを追加したいです。 国語「  」点 数学「  」点 英語「  」点 と言う画面で点を入力して「計算」を押すと 合計点「  」点 評価「  」 が表示されるようにしたいです。

  • 何番目に作成されたのかを表示させる方法

    ある範囲内で整数を複数個、適当につくり、その整数の平均値を取った後、適当に作った整数と最も近い平均値が何番目に作成されたのかを表示させるという問題についての質問です。 とりあえず1から100までの整数、その数10個にして、 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a[9]; int ave; time_t t; int i; int sum; srand(time(&t)); for(i = 0; i < 10; i++){ a[i] = rand() % 100; printf("ransu%d\n", a[i]); } ave += a[i] / 10; printf("ave%d\n", ave); return 0; } と、すればとりあえず乱数10個は生成されたのですが、何故かaveの値が合いません。 あと、この生成された乱数とaveの絶対値の差が最も小さいもの=最も平均値と生成された乱数の値が近い、と言うプログラムを書けば良いのだと思うのですが、その場合、どの様な式を使えば導き出せるのか、教えて頂ければ幸いです。 よろしくお願いいたします。

  • C言語のプログラムについてです

    5人の名前と身長を入力し、1番高い人の名前と身長を表示せよというものです。 下記のソースプログラムをコンパイルすると warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’ と表示されます。どこを修正すればよいのでしょうか? またこのプログラムにはchar関数を使っていますが、char関数というのも良く分かりません その解説も付け加えていただけると幸いです#include <stdio.h> #include <string.h> int main(void) { int i,sincho,max_sincho; char max_namae[10],namae[10]; max_sincho=0; for(i=1;i<=5;i++){ printf("名前: "); scanf("%s", &namae); printf("身長: "); scanf("%d", &sincho); if(sincho>max_sincho){ max_sincho=sincho; strcpy(max_namae,namae); } } printf("身長が一番高い人は%sさんで%d cmです。\n", max_namae,max_sincho); return 0; }

  • randomメゾットについて

    (int)(Math.random() * 10)で0~9の乱数が得られます。 この意味が全く理解できません。 乱数をキーワードに検索を続けていくと下記のような投稿を見つけました。 さいころの目を題にしたものがあると思うのですが、 その場合、Math.random() * 6 + 1 と回答されていると思います。 それは、 0~5までの乱数を作成し、作成された乱数に1を加算していて、 乱数:Math.random() * (max - min + 1) + min という計算式を元に考えられているのですよね? ますます意味が分かりません。 どなたか私のような者でも分かるように噛み砕いて説明して頂けないでしょうか? 疑似乱数が何かとか、乱数の種類には何があってとか説明されても分からないと思います。 まずは上記の内容について説明頂きたいです。くだらない質問ですみませんが宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • 数当てゲーム

    たのしいCという本でプログラミングの勉強をしています。 演習問題の解答がないので質問します。 2つの乱数を決定し、x以上y以下の整数を当てるプログラムです。 入力した数に対してヒントがあり、正解よりも小さければ"小さいです"と表示されます。 入力回数の制限を設け、乱数によって適切な入力回数にする計算方法の仕方がわかりません。 0以上1000以下の乱数の場合10回が適切みたいです。 よって0以上2000以下の場合は11回だということだと思います。 下のプログラムは回数の計算はしませんが、x以上y以下の整数を当てるプログラムになっていると思います。 適当な変数の名前や見にくいプログラムですいません。 /* 課題1-3 */ #include <time.h> #include <stdio.h> #include <stdlib.h> #define MAX_STAGE 11 /* 最大入力回数 */ int main(void) { int i; int no1; /* 範囲1 */ int no2; /* 範囲2 */ int max; /* 大きい乱数 */ int min; /* 小さい乱数 */ int y; /* 当てさせる数 */ int k; /* maxとminの差 */ int stage; /* 入力回数 */ int x; /* 読み込んだ値 */ int xbuf[MAX_STAGE]; srand(time(NULL)); no1 = rand(); no2 = rand(); if(no1 > no2){ max = no1; min = no2; } else{ max = no2; min = no1; } k = max - min; y = min + rand() % (k+1); printf("%d以上%d以下の整数を当ててください。\n", min, max); stage = 0; do{ printf("残り%d回。いくつでしょう:\n", MAX_STAGE - stage); scanf("%d", &x); xbuf[stage++] = x; if(y > x) printf("小さいです。\n"); else if(y < x) printf("大きいです。\n"); }while(y != x && stage < MAX_STAGE); if(y != x) printf("残念でした。正解は%dです。", y); else printf("正解です。%d回目で正解しました。", stage); puts("\n---入力履歴---"); for(i=0; i<stage; i++) printf(" %2d : %4d %+4d\n", i+1, xbuf[i], xbuf[i] - y); return (0); } 自分が考えた入力回数の設定は、kの値をif文で場合分けして入力回数を決定するという方法が思いつきました。他に何か良いアイデアとかってあるのでしょうか。 また、ごちゃごちゃと文を書いているので改善点などもあればよろしくお願いします。