そこで正解の数字を乱数で生成しようと思ったのですが、
何度実行しても、数値が8469で変わりません
とりあえずすべてのコードを載せます。
いろいろ突っ込むところがあるかもしれませんがよろしくお願いします。
/*
ヒットアンドブロー
*/
#define LONG 4 //桁数
#include <stdio.h>
#include<stdlib.h>
typedef struct {
int hit;
int blow;
} hitandblow;
void print_rule(void)
{
printf("ヒットアンドブローのルール(製作中)\n");
}
int check_number(int n)
{
int temp[LONG];
int waru, del;
int loopFLAG = 1;
int i, j;
//3桁以上かどうかの判断
if( n >= 123){
if(n >= 1023){//1023->4桁で最小の数
//nを配列に格納
for(i = 0, waru = 10, del = 1; i < LONG; i++, waru *= 10, del *= 10){
temp[i] = (n % waru) / del;
}
}
else{//3桁の場合の判断
//nを文字列に格納
for(i = 0, waru = 10, del = 1; i < (LONG - 1); i++, waru *= 10, del *= 10){
temp[i] = (n % waru) / del;
}
temp[i] = 0;
}
//比較
for(i = 0; i < LONG; i++){
for(j = 1; j < LONG; j++){
if((i != j) && (temp[i] == temp[j]))
loopFLAG = 0;//loopFLAGを'偽'に
}
if(loopFLAG == 0)
break;
}
return ( loopFLAG );
}
else{
return 0;
}
}
hitandblow check_hit_blow(int n1, int n2)
{
hitandblow re = {0, 0};
int waru, del;
int i, j;
int n1_ch[LONG], n2_ch[LONG];
//===============================
//文字列に格納
//===============================
//n1
for(i = 0, waru = 10, del = 1; i < LONG; i++, waru *= 10, del *= 10){
n1_ch[i] = (n1 % waru) / del;
}
//n2
for(i = 0, waru = 10, del = 1; i < LONG; i++, waru *= 10, del *= 10){
n2_ch[i] = (n2 % waru) / del;
}
//===============================
//===============================
//===============================
//比較
//===============================
for(i = 0; i < LONG; i++){
for(j = 0; j < LONG; j++){
if(n1_ch[i] == n2_ch[j]){
if(i == j){
re.hit++;
}
else{
re.blow++;
}
}
}
}
return re;
}
int main(void)
{
int answer; //解答
int right; //正解
hitandblow temp = {0, 0};
unsigned count;
printf( "===================================\n"
"####################\n"
"#ヒットアンドブロー#\n"
"####################\n"
"\n");
print_rule();
printf( "===================================\n");
do{
//ここの9999をあとでLONGを使って再現する
right = ((rand() % 9999) + 1);
}while(check_number(right) == 0);
//rightがcheck_numberを通ったら抜ける
printf("正解は%dです\n",right);
for(count = 1; temp.hit != LONG; count++){
printf( "---------------\n"
"第%d回戦\n"
"---------------\n"
"\n", count);
//数字の入力
do{
printf("4桁の数を入力してください:");
scanf("%d", &answer);
if( !( (answer >= 123) && (answer <= 9999) )){
//123->"0123"で4桁の最小数
printf("\a警告:4桁で入力してください\n");
}
if( check_number(answer) == 0 ){
printf("\a警告:全桁とも異なる数で入力してください\n");
}
}while( (check_number(answer) == 0) || !((answer >= 123) && (answer <= 9999)));
//比較
temp = check_hit_blow(right, answer);
//結果
printf("%dHIT %dBLOW\n", temp.hit, temp.blow);
}
printf( "===========\n"
"= -正 解- =\n"
"===========\n");
return 0;
}