ゲーム
ゲーム
今宿題で3桁の数を当てるというプログラムを作っているのですが最後に正解数を表示させるにはどうすればよいですか?
C言語初心者です。
よろしくお願いします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int secret_number[3];
int guess_number[3];
int hit;
int blow;
int count;
int again;
int point;
int i, n, k;
count= again = point = 0;
srand(time(NULL));
while(1){
k = 0;
secret_number[0] = rand () % 9 + 1;
secret_number[1] = rand () % 9 + 1;
secret_number[2] = rand () % 9 + 1;
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i != n){
if(secret_number != secret_number[n]){
k = k + 1;
}
}
}
}
if(k == 6){
break;
}
}
while(1){
hit = blow = again = 0;
printf("Make a guess the number\nChance is %d\n", (10 - count));
count++;
printf("Make the hundredth.");
scanf("%d", &guess_number[0]);
printf("Make the tenth.");
scanf("%d", &guess_number[1]);
printf("Make the oneth");
scanf("%d", &guess_number[2]);
if (guess_number != secret_number){
if (secret_number > guess_number){
printf("You missed.\nThe number is small\n");
}else{
printf("You missed.\nThe number is big.\n");
}
if (count == 10){
printf("You missed.\nThe correct number is %d",secret_number);
break;
}
}
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i == n){
if(guess_number == secret_number[n]){
hit = hit + 1;
}
}
else{
if(guess_number == secret_number[n]){
blow = blow + 1;
}
}
}
}
printf("hit = %d , blow = %d\n",hit, blow);
if (hit == 3 ){
printf("Bingo\n");
point = point + (11 - count);
printf("This point is%d \n" ,(11 - count));
printf("Total point is%d\n", point);
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
if (again == 1){
count = 0;
}
}
else if (count == 10){
printf("You bad.\n");
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
else {
count = 0;
}
}
else if (hit < 3){
printf("You miss.\n");
}
}
}
C言語初心者です。
よろしくお願いします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int secret_number[3];
int guess_number[3];
int hit;
int blow;
int count;
int again;
int point;
int i, n, k;
count= again = point = 0;
srand(time(NULL));
while(1){
k = 0;
secret_number[0] = rand () % 9 + 1;
secret_number[1] = rand () % 9 + 1;
secret_number[2] = rand () % 9 + 1;
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i != n){
if(secret_number != secret_number[n]){
k = k + 1;
}
}
}
}
if(k == 6){
break;
}
}
while(1){
hit = blow = again = 0;
printf("Make a guess the number\nChance is %d\n", (10 - count));
count++;
printf("Make the hundredth.");
scanf("%d", &guess_number[0]);
printf("Make the tenth.");
scanf("%d", &guess_number[1]);
printf("Make the oneth");
scanf("%d", &guess_number[2]);
if (guess_number != secret_number){
if (secret_number > guess_number){
printf("You missed.\nThe number is small\n");
}else{
printf("You missed.\nThe number is big.\n");
}
if (count == 10){
printf("You missed.\nThe correct number is %d",secret_number);
break;
}
}
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i == n){
if(guess_number == secret_number[n]){
hit = hit + 1;
}
}
else{
if(guess_number == secret_number[n]){
blow = blow + 1;
}
}
}
}
printf("hit = %d , blow = %d\n",hit, blow);
if (hit == 3 ){
printf("Bingo\n");
point = point + (11 - count);
printf("This point is%d \n" ,(11 - count));
printf("Total point is%d\n", point);
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
if (again == 1){
count = 0;
}
}
else if (count == 10){
printf("You bad.\n");
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
else {
count = 0;
}
}
else if (hit < 3){
printf("You miss.\n");
}
}
}
Re:ゲーム
Mist ..熟練のプログラマーへ
1ゲームごとです。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int secret_number[3];
int guess_number[3];
int hit;
int blow;
int count;
int again;
int point;
int i, n, k;
count= again = point = 0;
srand(time(NULL));
while(1){
k = 0;
secret_number[0] = rand () % 9 + 1;
secret_number[1] = rand () % 9 + 1;
secret_number[2] = rand () % 9 + 1;
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i != n){
if(secret_number != secret_number[n]){
k = k + 1;
}
}
}
}
if(k == 6){
break;
}
}
while(1){
hit = blow = again = 0;
printf("Make a guess the number\nChance is %d\n", (10 - count));
count++;
printf("Make the hundredth.");
scanf("%d", &guess_number[0]);
printf("Make the tenth.");
scanf("%d", &guess_number[1]);
printf("Make the oneth");
scanf("%d", &guess_number[2]);
if (guess_number != secret_number){
if (secret_number > guess_number){
printf("You missed.\nThe number is small\n");
}else{
printf("You missed.\nThe number is big.\n");
}
if (count == 10){
printf("You missed.\nThe correct number is %d",secret_number);
break;
}
}
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i == n){
if(guess_number == secret_number[n]){
hit = hit + 1;
}
}
else{
if(guess_number == secret_number[n]){
blow = blow + 1;
}
}
}
}
printf("hit = %d , blow = %d\n",hit, blow);
if (hit == 3 ){
printf("Bingo\n");
point = point + (11 - count);
printf("This point is%d \n" ,(11 - count));
printf("Total point is%d\n", point);
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
if (again == 1){
count = 0;
}
}
else if (count == 10){
printf("You bad.\n");
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
else {
count = 0;
}
}
else if (hit < 3){
printf("You miss.\n");
}
}
}
1ゲームごとです。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int secret_number[3];
int guess_number[3];
int hit;
int blow;
int count;
int again;
int point;
int i, n, k;
count= again = point = 0;
srand(time(NULL));
while(1){
k = 0;
secret_number[0] = rand () % 9 + 1;
secret_number[1] = rand () % 9 + 1;
secret_number[2] = rand () % 9 + 1;
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i != n){
if(secret_number != secret_number[n]){
k = k + 1;
}
}
}
}
if(k == 6){
break;
}
}
while(1){
hit = blow = again = 0;
printf("Make a guess the number\nChance is %d\n", (10 - count));
count++;
printf("Make the hundredth.");
scanf("%d", &guess_number[0]);
printf("Make the tenth.");
scanf("%d", &guess_number[1]);
printf("Make the oneth");
scanf("%d", &guess_number[2]);
if (guess_number != secret_number){
if (secret_number > guess_number){
printf("You missed.\nThe number is small\n");
}else{
printf("You missed.\nThe number is big.\n");
}
if (count == 10){
printf("You missed.\nThe correct number is %d",secret_number);
break;
}
}
for(i = 0;i < 3;i++){
for(n = 0;n < 3;n++){
if(i == n){
if(guess_number == secret_number[n]){
hit = hit + 1;
}
}
else{
if(guess_number == secret_number[n]){
blow = blow + 1;
}
}
}
}
printf("hit = %d , blow = %d\n",hit, blow);
if (hit == 3 ){
printf("Bingo\n");
point = point + (11 - count);
printf("This point is%d \n" ,(11 - count));
printf("Total point is%d\n", point);
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
if (again == 1){
count = 0;
}
}
else if (count == 10){
printf("You bad.\n");
printf("Do you try again(Yes 2, No 6)\n");
scanf("%d", &again);
if (again == 6){
break;
}
else {
count = 0;
}
}
else if (hit < 3){
printf("You miss.\n");
}
}
}
Re:ゲーム
なんとなくネット上で見つけたソースを切り貼りして作りました、って感じだけど他のおかしなところも指摘しておきます。
1.複数回プレイできるようになっているけど正解はみんな同じ
正解を作る部分が最初の一回しか実行されないので何回プレイしても答えの数字は常に同じ。
2.下の部分は入力された各桁の数字が1~9の範囲であるかをチェックするようにすべき。
同じ答えを見たことがあるけど、そのプログラムとあなたのプログラムでは目的がそもそも違うからそのままパクっても意味がない。
if (guess_number != secret_number){
if (secret_number > guess_number){
printf("You missed.\nThe number is small\n");
}else{
printf("You missed.\nThe number is big.\n");
}
各プログラムの意味を理解して修正しないとこのまま出しても多分受け取ってもらえないですよ。
1.複数回プレイできるようになっているけど正解はみんな同じ
正解を作る部分が最初の一回しか実行されないので何回プレイしても答えの数字は常に同じ。
2.下の部分は入力された各桁の数字が1~9の範囲であるかをチェックするようにすべき。
同じ答えを見たことがあるけど、そのプログラムとあなたのプログラムでは目的がそもそも違うからそのままパクっても意味がない。
if (guess_number != secret_number){
if (secret_number > guess_number){
printf("You missed.\nThe number is small\n");
}else{
printf("You missed.\nThe number is big.\n");
}
各プログラムの意味を理解して修正しないとこのまま出しても多分受け取ってもらえないですよ。
Re:ゲーム
> if (guess_number != secret_number){
> if (secret_number > guess_number){
> printf("You missed.\nThe number is small\n");
> }else{
> printf("You missed.\nThe number is big.\n");
> }
>
> この部分で何をしたいのかは意味不明だけど、Hit & Blowとしては一応ちゃんと動くよ。
やりたいことは、入力した3桁の数字が、乱数で出しておいた答えと比較して大きいか
小さいか表示しているつもりだと思いますが・・・
どうして、一応ちゃんと動くの?
配列のアドレスを比較しているのだから、絶対一致することはなく、何度やっても同じ答えに
なるのでは?
MOMOさんがいう正解数とは、10回やっても当たらなかったときに、secret_number を
表示したいのかと私は思いました。
> if (secret_number > guess_number){
> printf("You missed.\nThe number is small\n");
> }else{
> printf("You missed.\nThe number is big.\n");
> }
>
> この部分で何をしたいのかは意味不明だけど、Hit & Blowとしては一応ちゃんと動くよ。
やりたいことは、入力した3桁の数字が、乱数で出しておいた答えと比較して大きいか
小さいか表示しているつもりだと思いますが・・・
どうして、一応ちゃんと動くの?
配列のアドレスを比較しているのだから、絶対一致することはなく、何度やっても同じ答えに
なるのでは?
MOMOさんがいう正解数とは、10回やっても当たらなかったときに、secret_number を
表示したいのかと私は思いました。
Re:ゲーム
> どうして、一応ちゃんと動くの?
Hit & Blowというゲーム知りません?
上にも書きましたがここで本来行うべきエラーチェックはguess_number[0]~[2]に一桁の1~9までの数値がきちんと入力されているかどうかです。
で、間違った値が入力されている場合は再入力に戻るようにすることです。
全然出来ていませんけど。
ただ、現状のプログラムでも無駄な文章が毎回出力されるだけでbreakされているわけではないのでその後の処理が動きます。
そのため、”間違った入力がされることがなければ”という条件付でHit & Blowとしては正しく動作していますしゲームとして成立します。
そういう意味での”一応”です。
> まだ、プログラムを全部見てないですが、正しく動いてないのは確かですよね。
エラー処理は多分MOMOさんの意図どおり動いてないとは思いますが、正常系は動きますから動かないと断ずるのはちょっと可哀想かな、と思いました。
どこまでを”正しく”の範疇に含めるかの問題なのかもしれませんが。
> MOMOさんがいう正解数とは、10回やっても当たらなかったときに、secret_number を
> 表示したいのかと私は思いました。
ああ、なるほど。それは思いつきませんでした。
複数回実行できるようになってるから正解までたどり着いた回数かと。
それだったらprintf一個追加するだけですね。
Hit & Blowというゲーム知りません?
上にも書きましたがここで本来行うべきエラーチェックはguess_number[0]~[2]に一桁の1~9までの数値がきちんと入力されているかどうかです。
で、間違った値が入力されている場合は再入力に戻るようにすることです。
全然出来ていませんけど。
ただ、現状のプログラムでも無駄な文章が毎回出力されるだけでbreakされているわけではないのでその後の処理が動きます。
そのため、”間違った入力がされることがなければ”という条件付でHit & Blowとしては正しく動作していますしゲームとして成立します。
そういう意味での”一応”です。
> まだ、プログラムを全部見てないですが、正しく動いてないのは確かですよね。
エラー処理は多分MOMOさんの意図どおり動いてないとは思いますが、正常系は動きますから動かないと断ずるのはちょっと可哀想かな、と思いました。
どこまでを”正しく”の範疇に含めるかの問題なのかもしれませんが。
> MOMOさんがいう正解数とは、10回やっても当たらなかったときに、secret_number を
> 表示したいのかと私は思いました。
ああ、なるほど。それは思いつきませんでした。
複数回実行できるようになってるから正解までたどり着いた回数かと。
それだったらprintf一個追加するだけですね。
Re:ゲーム
私の書き方が悪かったかもしれませんが、今回の「何度も実行」というのはプログラムを終了させず(正解、不正解の後2キーを押して)ゲームを継続した場合のことなので、乱数シードの初期化(srand)を行っているかどうかは関係ありません。
randが実行されるたびに乱数が返されますので、まず違う答えが出来ると思います。
プログラムを終了させてもう一度実行する場合には時間等を使ったシードの初期化行っておかないと、s-rushさんがおっしゃるとおりに1回目と2回目では同じ答えになります。(同じだったら"乱数"じゃねーな(^^;)
例:srandは行わない、乱数値は適当
プログラム自体の実行(1回目)
rand(1回)=1000
rand(2回)=5
rand(3回)=98
rand(4回)=325
プログラム自体の実行(2回目)
rand(1回)=1000
rand(2回)=5
rand(3回)=98
rand(4回)=325
プログラムの実行単位で見れば同じになりますが、内部単位でみれば同じにはなりませんので違う答えが作れます。
この違いは混同しないでください。
randが実行されるたびに乱数が返されますので、まず違う答えが出来ると思います。
プログラムを終了させてもう一度実行する場合には時間等を使ったシードの初期化行っておかないと、s-rushさんがおっしゃるとおりに1回目と2回目では同じ答えになります。(同じだったら"乱数"じゃねーな(^^;)
例:srandは行わない、乱数値は適当
プログラム自体の実行(1回目)
rand(1回)=1000
rand(2回)=5
rand(3回)=98
rand(4回)=325
プログラム自体の実行(2回目)
rand(1回)=1000
rand(2回)=5
rand(3回)=98
rand(4回)=325
プログラムの実行単位で見れば同じになりますが、内部単位でみれば同じにはなりませんので違う答えが作れます。
この違いは混同しないでください。
Re:ゲーム
>>MOMOさん
MOMOさんの場合、
・乱数を三つ取得する
・正解・不正解を表示する
という流れが出来ていると思うので、
・それが同じかどうかを見る
・同じならもう一度取得し、違うのであれば三つの数字はすべて違うといえる
これをC言語という形で書いていきましょう。
secret_number[0]、[1]、[2]が同じでなければいいんですよね?
(間違ってたらごめんなさい;)
// まず、secret_number[0]と[1]と[2]の値を取得します。(これはもう出来ていますね)
secret_number[0] = rand () % 9 + 1;
secret_number[1] = rand () % 9 + 1;
secret_number[2] = rand () % 9 + 1;
// 次に、secret_number[0]と[1]が同じ値でないかを調べ、
// もし同じならもう一度取得します。
// ここで、取得した値がまたかぶってしまう可能性もあるのでwhileを使い
// 同じでなくなるまで取得します。
while(1)
{
if(secret_number[0] == secret_number[1])
secret_number[1] = rand()%9 + 1;
else
break;
}
// 最後に、secret_number[0]と[2]・[1]と[2]が同じ値でないかを調べ、
// もし同じならもう一度取得します。
// この条件が満たされれば、かぶらないと思います
while(1)
{
if( (secret_number[0] == secret_number[2]) || (secret_number[1] == secret_number[2]) )
secret_number[2] = rand()%9 + 1;
else
break;
}
今は三桁みたいですので、こんな方法でよいのなら・・・。
(ただし、この書き方は桁数が増えれば、増えるほど、しんどいやり方になります。
改良できるのであれば改良してみましょう。)
MOMOさんの場合、
・乱数を三つ取得する
・正解・不正解を表示する
という流れが出来ていると思うので、
・それが同じかどうかを見る
・同じならもう一度取得し、違うのであれば三つの数字はすべて違うといえる
これをC言語という形で書いていきましょう。
secret_number[0]、[1]、[2]が同じでなければいいんですよね?
(間違ってたらごめんなさい;)
// まず、secret_number[0]と[1]と[2]の値を取得します。(これはもう出来ていますね)
secret_number[0] = rand () % 9 + 1;
secret_number[1] = rand () % 9 + 1;
secret_number[2] = rand () % 9 + 1;
// 次に、secret_number[0]と[1]が同じ値でないかを調べ、
// もし同じならもう一度取得します。
// ここで、取得した値がまたかぶってしまう可能性もあるのでwhileを使い
// 同じでなくなるまで取得します。
while(1)
{
if(secret_number[0] == secret_number[1])
secret_number[1] = rand()%9 + 1;
else
break;
}
// 最後に、secret_number[0]と[2]・[1]と[2]が同じ値でないかを調べ、
// もし同じならもう一度取得します。
// この条件が満たされれば、かぶらないと思います
while(1)
{
if( (secret_number[0] == secret_number[2]) || (secret_number[1] == secret_number[2]) )
secret_number[2] = rand()%9 + 1;
else
break;
}
今は三桁みたいですので、こんな方法でよいのなら・・・。
(ただし、この書き方は桁数が増えれば、増えるほど、しんどいやり方になります。
改良できるのであれば改良してみましょう。)