• ベストアンサー

プログラミングについて

4個の異なる一桁の数字からなる順列を乱数で生成し、 ターミナルで4個の数字の順列を入力すると、 生成した順列と入力した順列を比較し、 数とその位置があっている場合は「ヒット」 数は合っているがその位置が違う場合は「ブロー」とし、 そのヒット数とブロー数を表示するプログラムを教えてください。 実行するとこんな感じになると思います、 (生成した順列3569) Number?:0123 Hits:0,Blows:1 Number?:0124 Hits:0,Blows:0 Number?:3567 Hits:3,Blows:0 Number?:3569 Hits:4,Blows:0 Trials:4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> void Init(int *cpu) { int seed[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,}; int temp, i, j; srand((unsigned)time(NULL)); for(i = 9; i > 0; i --){ j = rand() % (i + 1); temp = seed[i]; seed[i] = seed[j]; seed[j] = temp; } memcpy(cpu, seed, sizeof(int) * 4); return; } int Input(int *player) { char buff[64]; printf("\nNumber?:"); fgets(buff, 64, stdin); if(sscanf(buff, "%d %d %d %d", player, player + 1, player + 2, player + 3) != 4){ return 0; } return 1; } int Compare(int *cpu, int *player, int *hit, int *blow) { int i, j; *hit = 0; *blow = 0; for(i = 0; i < 4; i ++){ *hit += (player[i] == cpu[i]); for(j = 0; j < 4; j ++){ *blow += (player[i] == cpu[j]); } } *blow -= *hit; return *hit != 4; } void Result(int *cpu, int count) { int i; puts("\nCongratulation!"); for(i = 0; i < 4; i ++) printf("%d ", cpu[i]); printf("\nCount:%d\n", count); return; } int main(void) { int cpu[4], player[4], hit, blow, count, flag; Init(cpu); count = 0; do{ if(!Input(player)){ puts("Input Error"); continue; } flag = Compare(cpu, player, &hit, &blow); printf("Hits:%d Blows:%d\n", hit, blow); count ++; }while(flag); Result(cpu, count); return 0; }  

その他の回答 (3)

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.3

まず質問者のソースコンパイル通りませんよ randomではなくrandです。(srandomも同様) for (hit=0;hit < 4;hit++); あとこのループ意味ないです。わざわざ無駄に4回まわしてます。 それで、とりあえずその辺修正して、コンパイルできる状態にして下さい。 Hitだけならこれでもいいんじゃないですか? ループ入れれば綺麗になりますが、まず自分でHitだけでも 作ってみればいかがでしょう。 ソースを見る限りそれぐらいはできそうなんですが・・・ というか,Blowsもそれができたらできるとおもうんですけど。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

Perl #!/usr/bin/perl # ランダム文字決定 $num = int(rand(9))+1; $num .= int(rand(9))+1; $num .= int(rand(9))+1; $num .= int(rand(9))+1; print "(生成した順列 $num )\n"; (@num) = split("",$num); $i = 1; while () { $hit = 0; $blow = 0; print "Number?"; $_ = <>; (@num1) = split("",$_); if ($num[0] == $num1[0]) { $hit++; $num1[0] = 'a'; } if ($num[1] == $num1[1]) { $hit++; $num1[1] = 'a'; } if ($num[2] == $num1[2]) { $hit++; $num1[2] = 'a'; } if ($num[3] == $num1[3]) { $hit++; $num1[3] = 'a'; } print "Hits:$hit" .','; foreach $n (@num) { foreach $n1 (@num1) { if ($n == $n1) { $n1 = 'a'; $blow++; last; } } } print "Blwes:$blow\n"; if ($hit == 4) { print "Trials:$i\n"; last; } $i++; }

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

どのプログラミング言語を使用するかも書かず、丸投げ状態の質問では誰も回答してくれません。 自分はここまでやったけど、エラーになったまたは、思った結果と違いました。のような形式に変更しましょう。

blackandfly
質問者

補足

言葉足らずでした、申し訳ありません。 アルゴリズムです。 ここまでやりましたが、行き詰まりました。 宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int x[4],y[4],n0,n1,n2,n3,hit; srandom((unsigned) time(0)); x[0] = random()%10; x[1] = random()%10; x[2] = random()%10; x[3] = random()%10; for (hit=0,hit < 4,hit++); printf("Number?:\n"); scanf("%d,%d,%d,%d",&n0,&n1,&n2,&n3); y[0] = n0; y[1] = n1; y[2] = n2; y[3] = n3; if(x[0] == y[0]){ hit++; } if (x[1] == y[1]) { hit++; } if (x[2] == y[2]) { hit++; } if (x[3] == y[3]) { hit++; } printf("Hits:%d\n",hit); if (hit == 4) { printf("Trials:\n"); }

関連するQ&A

  • C言語のプログラミングについてです><

    今C言語のプログラミングの勉強をしているのですが、わからないプログラムがでてきたので教えてくださる方がいらっしゃれば、ご教授願いたいです。 数当てゲームの作成 1~9(0は除く)のなかから4つの異なる数字をランダムで選択し、4桁の数をつくる。ユーザは4つの数字の並びを入力して、作られた数を当てる。 ユーザの入力した数と作られた数を比較して、同じ数字が同じ桁にある場合は"Hit"というヒントを与える。また、同じ数字が異なる桁にある場合は"Blow"というヒントを与える。すなわち、作られた数が5849で、ユーザが4829という数値を入力した場合、"2 Hit 1 Blow"というヒントが表示されるようにする。 ユーザは10回まで、入力するチャンスが与えられる。 といった感じのプログラミングなんですが、C言語初心者である自分にはまったくわかりません; ; どなたかわかる方がいらっしゃれば、助けていただけないでしょうか?よろしくお願いします!

  • javaプログラミングについて

    ただいまjavaプログラム勉強中でhit&blowを制作しております。 public static void main(String[] args) { Scanner scan = new Scanner(System.in); Random rand = new Random(); int[] answer = new int[4]; int[] input = new int[4]; int[] Number = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; int x = 10; for (int i = 0; i < 4; i++) { int select = (int) (Math.random() * x); answer[i] = Number[select]; Number[select] = Number[x - 1]; x--; } int count = 1; while (true) { System.out.println("4桁の異なる数値を入力"); int str_input = scan.nextInt(); // 代入 for (int i = 0; i < 4; i++) { input[i] = str_input; } // hit int hit = 0; for (int i = 0; i < 4; i++) { if (input[i] == answer[i]) { hit++; } } // blow int blow = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++){ if (i != j && input[i] == answer[j]) { blow++; } } } if (hit == 4) { System.out.println("4hit"); System.out.println("正解まで " + count + "回"); break; } else { System.out.println("Hit:" + hit + " Blow:" + (blow - hit)); count++; } } } } 数字が4桁で作っているのですが、数字や4桁以上を入力してしまった場合の表示は後にしようとして、先にhitとblowの判定を作ろうとしているのですが、上記で実行したところhitとblowの判定がされずhit:0blow:0と表示されてしまいます。解決策を教えてください。 自分で作ってみたものの、hit blowの判定方法があっているかも自信がないです。

    • ベストアンサー
    • Java
  • hit&bolwのプログラミングができません

    皆様、はじめまして 期末の課題でhit&blowが出たのですがテキストやネット検索しても参考になるのが出てこなかったので聞くことにしました #include "stdafx.h" #include <stdlib.h> #include <time.h> #include <conio.h> int main(int argc, char* argv[]) { int x1, x2, x3, x4; int a1, a2, a3, a4; int hit, blow, loop; int a = 1; printf("hit&blow\nゲーム四つの数をスペース入れて記述しろ\n"); srand(time(0)); do{ x1 = rand() % 10; x2 = rand() % 10; x3 = rand() % 10; x4 = rand() % 10; printf("%d %d %d %d\n",x1, x2, x3, x4); }while(x1 == x2 || x1 == x3 || x1 == x4 || x2 == x3 || x2 == x4 || x3 == x4); loop = 1; while(1 == loop){ scanf("%d", &a1); scanf("%d", &a2); scanf("%d", &a3); scanf("%d", &a4); fflush(stdin); hit = 0; blow = 0; if(x1 == a1){ hit = hit + 1; } if(x2 == a2){ hit = hit + 1; } if(x3 == a3){ hit = hit + 1; } if(x4 == a4){ hit = hit + 1; } if(x1 == a2 || x1 == a3 || x1 == a4){ blow = blow + 1; } if(x2 == a3 || x2 == a4 || x2 == a1){ blow = blow + 1; } if(x3 == a2 || x3 == a1 || x3 == a4){ blow = blow + 1; } if(x4 == a2 || x4 == a3 || x4 == a2){ blow = blow + 1; } printf(" %d hit %d blow\n", hit, blow); if(4 == hit){ loop = 0; } } return 0; } ここまでできたのですが 次の項目ができません (1)正解したときは新しいゲームを続けることができる (2)正解までの最小回数、最大回数を表示する (3)正解したら「○○回で正解しました」と表示する (4)0 0 0 0などの不正入力をできなくする 早急に教えてもらえると助かります

  • hit&blow

    3桁の数字を当てるhit&blowを作っています。 3桁の重複のない数字を発生させ、入力した数字と照合させ正解か不正解の判定までは出来ます。しかし、hitとblowの表示ができず苦しんでます。 アドバイス、参考になるサイト等を教えてください。 お願いします。

  • unity、C#アプリ制作

    unity初心者です。 一台の端末を順に回して遊ぶオリジナルのボードゲームアプリを作っています。 シーン①乱数を表示するオブジェクトを生成 シーン②プレイヤーの入力した内容を表示 クリア条件を満たすまで、シーン①とシーン②を行ったり来たりする(シーン①の乱数は変える)仕様が上手くできません。 一応、シーン②からシーン①に戻る自体は出来たのですが、 シーン①で生成する乱数を表示するオブジェクトは、新しい乱数を表示させたいところが出来てなく、最初に生成した乱数と同じ数字が表示されます。 どうやって修正するかご教授お願いします。

  • ランダム数をピックアップする方法

    いつもお世話になります。 このサイトで1から20までの中から重ならないように 3つ選ぶ問題で、以下のような説明を見つけたのですが、 どうしても、この通りにするコードが組めません。 先週の金曜日から考えているのですがどうしてもできません。 どなたか教えてください。 元の回答はここにあります。NO.1の方です。 http://okwave.jp/qa2035910.html ▽▽▽▽▽▽▽▽▽引用▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ Math.random()を使うと、0以上1未満の乱数が生成できます。 これを使って、 20*Math.random() とすると、0以上20未満になります。 20も含めたいので、これに1を足します。 20*Math.random() +1 これで出てきた数字を変数に入れておき、もう一回この関数を呼び出し、変数に入っている数が出てきたらもう一回呼び出します。 ユニークな乱数が3つ生成されたら、完了です。 コードは工夫してみてください。

  • C言語プログラミングについて

    「要素数10の配列を準備する。 配列の各要素に0.0~1.0の乱数を入れる。 各配列に入力された乱数を出力する。 配列をオリジナル関数hanteiに渡す。 数hantei内において,各要素の値が0.5以上であれば1 , 0.5未満であれば0を出力する。」 C言語でこのような問題があるのですがどのように作ればよろしいのでしょうか? ちなみに以下のように作ってみて、「argcは一度も使用されていない」「argvは一度も使用されていない」とエラー(警告)が出てしまいました。修正、もしくは正しいプログラムを教えてくれませんか? #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 10 int hantei(double num) { return num>=0.5; } int main(int argc,char *argv[]) { double number[SIZE]; int i; srand((unsigned)time(NULL)); for(i=0;i<SIZE;i++) number[i]=(double)rand() / RAND_MAX; //手抜き乱数 for(i=0;i<SIZE;i++) { printf("%f %d\n",number[i], hantei(number[i])); } return 0; }

  • Excel VBA 足し算の問題を自動生成したい

    子供のために、「1+2」のような単純な足し算の問題をひたすら大量生成したいのですが、どう組むのが一番良いでしょうか。   A  B  C  D   1 乱数 + 乱数 = 2 乱数 + 乱数 = 3 乱数 + 乱数 = 私の頭で考える限りは、こんな感じのものを何行にも渡り繰り返させれば良いのかなあとぼんやり考えているのですが、乱数を使うプログラムが私にはなかなか難しく、うまくできません。 それと・・・ ・「まったく同じ問題が二行続けて出る」事だけは避けたいのですが、 その他の重複はまったく構わないという場合はどう組めば良いでしょうか。 ・「1桁+1桁」「2桁+1桁(と、2桁+1桁)」「2桁+2桁」それぞれのシートを1枚ずつつくりたいのですが、生成される数字の桁を指定する事はできるのでしょうか。 わからない事だらけで申し訳ないのですが、教えていただけると幸いです。

  • C言語の質問。

    課題が出たのですがよくわからないので回答していただける方お願いします。 # 次のようにキーボードから4桁の10進数の入力を2回受付ける. Input the 1st value > 6479 Input the 2nd value > 1497 但し,4桁の各位の数は必ず互いに異なるものが入力されるとする. # 入力された数値に対して,以下に定義する「ヒット数」と「ホームラン数」を求める. * ホームラン数: 二つの数字を同じ位ごとに比較した時,何ヶ所の位について一致しているかを表す. * ヒット数: 二つの数字を異なる位同士で比較した時,一致している組み合わせの数を表す. 例 1234と1234の場合,0ヒット4ホームラン 1234と4321の場合,4ヒット0ホームラン 6479と1497の場合,2ヒット1ホームラン # ヒット数とホームラン数を次のように表示する. 2 hit(s) 1 home run(s)

  • 至急!助けて下さい。プログラミングJava

    明日までの大学の課題が、わかりません。 どなたか教えてください。書き方が、わかりません。言語はJavaです。 よろしくお願い申し上げます。 1.条件分岐 整数d,xをキーボードから入力させ、 dとzの差の大きさ(絶対値)を計算し、結果を表示するプログラムを作りなさい。 2.繰り返し 整数qcをキーボードから入力させ、1からqcまでの整数を全て表示させるプログラムを作りなさい 3.式 式y=xの二乗+6x+10の値を、x=13から21まで、一つづつ変化させた時のyの値を表示しなさい。 4.和 1から58までの和1+2+3+….+58をプログラムを作って求めなさい。 5.乱数 乱数関数rnd()を使って、変数wgに0~383までの適当な数値を代入し、その結果を出力しなさい。 6.円を描く for文を使って、適当な位置に半径17の赤い円を、87個だけ描きなさい。 7.余り 変数qeに整数を入力させ、その変数qeが6で割り切れたら「割り切れる」と表示し、それ以外は「割り切れない」と表示するプログラムを作りなさい。 *ヒント %演算子で割った余りが求められる。 例えば、5%3は2となる。 8.break文 変数bjに0から1000までの乱数を作っては代入することを繰り返し、bjの値が900以上になったら繰り返しを止めて、bjの値を出力するプログラムを作りなさい。 9.カウント 1から1076までの整数の中で、8で割り切れる数がいくつあるかカウントしてその数を表示しなさい。 以上です。 どうかお助け下さいm(__)m

専門家に質問してみよう