質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
南瓜

質問です

#1

投稿記事 by 南瓜 » 16年前

はじめまして。少しC言語について勉強して興味をもってので、ゲームとは直接関係ないプログラムを作ったんですけど
うまくいかないので質問させてください。
[1]・数値を入れてレベル99までのランダムに上昇するステータスを計算する
最終的には異なる3つの上昇率を各ステータスから選び計算させたい
/*
           レベル99までの各ステータスを計算
   */
   
   #include <stdio.h>
   #include <stdlib.h>
   #include <time.h>
   
   int GetRandom(int min, int max);
  
  int main(void)
  {
          int i, level, hp, ep, attck, defense, hit;      /* 初期ステータス */
          int asum;       /* レベル99の各合計値 */
  
          srand((unsigned int)time(NULL));
  
          puts("初期レベルとステータスを入力してください");
          printf("レベル:");      scanf("%d", &level);
          printf("HP:");          scanf("%d", &hp);
          printf("EP:");          scanf("%d", &ep);
          printf("攻撃:");        scanf("%d", &attck);
          printf("防御:");        scanf("%d", &defense);
          printf("命中:");        scanf("%d", &hit);
  
          for(i = level + 1; i <= 99; i++) { /* レベルアップボーナスの回数 */
                  asum = attck + (99 - level) * GetRandom(8, 10);
                  printf("レベル99の攻撃は%dです\n", asum );
          }
  
          return (0);
  }
  
  int GetRandom(int min, int max)
  {
          return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
  }
・初期レベルとステータスを入力してください
レベル:28
HP:1240
EP:1195
攻撃:374
防御:277
命中:276
レベル99の攻撃は1084です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は942です
・……とランダムに?計算しているのはいいんですが(本当は一個だけ表示させたいのですが)
初期ステータス+8+8+10+9+10+9+……という風に計算させたいんです。今は攻撃力だけ表示するようにしていますが
うまくいきません
[2]・OS:MacBook Mac OSX
[3]・C言語
・かなり初歩的なレベルだと思います(for,while文くらいしかつかえないのとコンパイラとライブラリの意味がわからないので)

hss12

Re:質問です

#2

投稿記事 by hss12 » 16年前

何をやりたいのか良く分かりませんが、こんな感じでしょうか。
(attckをattackに変更しました。)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int GetRandom(int min, int max);

int main(void){
    int i;
    int level, attack;
    srand((unsigned int)time(NULL));
    puts("初期レベルとステータスを入力してください");

    printf("レベル:");
    scanf("%d", &level);

    printf("攻撃:");
    scanf("%d", &attack);

    for(i = level+1; i <= 99; i++){
        attack = attack + GetRandom(8, 10);
        printf("計算中、レベル%dの攻撃は%dです\n", i, attack );
    }
    printf("レベル99の攻撃は%dです\n", attack );

    return (0);
}

int GetRandom(int min, int max){
    return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}

南瓜

Re:質問です

#3

投稿記事 by 南瓜 » 16年前

hss12さん ありがとうございます。おかげで思ったような結果になりました。
上にも書いた「異なる3つの上昇率を各ステータスから選び計算させたい」がどのように文をつくればいいのか悩んでいます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int GetRandom(int min, int max);
 
int main(void)
{
int i;
int a1, a2, a3; /* 成長タイプ */
int level, hp, ep, attack, defense, hit;        /* 初期ステータス */
srand((unsigned int)time(NULL)); 
puts("成長タイプを入力ください");

printf("攻撃");         scanf("%d", &???)

a = GetRandom(10, 12);
b = GetRandom(9, 11);
c = GetRandom(8, 10);

puts("初期レベルとステータスを入力してください");
printf("攻撃:");        scanf("%d", &attack);
    
for(i = level + 1; i <= 99; i++) { /* レベルアップボーナスの回数 */
attack = attack + GetRandom(8, 10);
???は何を書けばいいのかわからないところで、
attack = attack + GetRandom(8, 10)のGetRandomの所に上から選んだa,b,cを代入させて計算させたいんです。

box

Re:質問です

#4

投稿記事 by box » 16年前

// int a1, a2, a3; /* 成長タイプ */
int a[3]; /* 成長タイプ */
int level, hp, ep, attack, defense, hit; /* 初期ステータス */
srand((unsigned int)time(NULL));

//puts("成長タイプを入力ください");

//printf("攻撃"); scanf("%d", &???)

//a = GetRandom(10, 12);
//b = GetRandom(9, 11);
//c = GetRandom(8, 10);
a[0] = GetRandom(10, 12);
a[1] = GetRandom(9, 11);
a[2] = GetRandom(8, 10);

puts("初期レベルとステータスを入力してください");
printf("攻撃:"); scanf("%d", &attack);

for(i = level + 1; i <= 99; i++) { /* レベルアップボーナスの回数 */
attack += a[rand() % 3];


こういうことがしたいのでしょうか?

hss12

Re:質問です

#5

投稿記事 by hss12 » 16年前

すみません。
attack = attack + GetRandom(8, 10);

attack += GetRandom(8, 10);
と書くべきでした。

boxさんの方法で良いと思いますが
ランダムでなく入力したいのなら
do {
    puts("成長タイプを入力してください(0~2)");
    printf("攻撃");    scanf("%d", &growtype);
} while (growtype < 0 || growtype > 2);

for(i = level + 1; i <= 99; i++) {
    a[0] = GetRandom(10, 12);
    a[1] = GetRandom(9, 11);
    a[2] = GetRandom(8, 10);
    attack += a[growtype];
}
で、どうでしょうか。(growtypeやaは好きなのに変えてください)
または、配列を使わずに
for(i = level + 1; i <= 99; i++) {
    switch (growtype) {
        case 0: attack += GetRandom(10, 12); break;
        case 1: attack += GetRandom(9, 11);  break;
        case 2: attack += GetRandom(8, 10);  break;
    }
}
あるいは、あらかじめ
switch (growtype) {
    case 0: r_min = 10; r_max = 12; break;
    case 1: r_min = 9;  r_max = 11; break;
    case 2: r_min = 8;  r_max = 10; break;
}
としておいて
for(i = level + 1; i <= 99; i++) {
    attack += GetRandom(r_min, r_max);
}

南瓜

Re:質問です

#6

投稿記事 by 南瓜 » 16年前

boxさん、hss12さん ありがとうございますm(_ _)m
おかげで作りたかったプログラムができました。それと//aや//putsの // にはどんな意味があるんでしょうか?
同じ内容でも配列やswitch文といろいろなやり方があってC言語はおもしろいですね

box

Re:質問です

#7

投稿記事 by box » 16年前

> // にはどんな意味があるんでしょうか?

その行の // に続く部分をコメントにする、という意味です。

南瓜

Re:質問です

#8

投稿記事 by 南瓜 » 16年前

なるほど、そういう意味ですか。ありがとうございます。

hss12

Re:質問です

#9

投稿記事 by hss12 » 16年前

正確には//コメントはC++という言語のコメント方法で
C言語は/*コメント*/を使います。
最近はC++やJavaで//コメントを使う人が多いからか
C言語のコンパイラも//に対応しているみたいですが
古いコンパイラだとエラーになる可能性が高いので注意してください。

C言語の入門書だと//コメントは紹介していないかもしれないので
C++やJavaを勉強していない人は知らないかもしれないですね。

プログラムを修正するときにコメントを使うことは良くあります。
例えば
//int a;
としてあとで使うかもしれない時や参考にするために残しておきます。
/**/は複数行コメントできるのが特徴ですが
例えば
/*
int a; /*コメント*/
int b;
*/
とコメントの中にコメントがあるとエラーになるので注意が必要です。
2つ目の/*がコメントとみなされてしまい、1つ目の*/でコメントが終了してしまいます。
無駄知識ですがD言語の
/+
int a; /+コメント+/
int b;
+/
はエラーにならないです。

裏技ですが
if(0){
int a; /*コメント*/
int b;
}
なんてこともできます。ifは0のときは実行されません。

閉鎖

“C言語何でも質問掲示板” へ戻る