質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.38%

  • C

    4821questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C言語でマスターマインド

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 308

thetapazu

score 1

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C言語でマスターマインドを作成しています。
ヒットした数字の中で最も先頭側の一文字をヒントとして教える。
というヒント機能を追加したいです。

### #include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--- 相異なる四つの数字の並びを生成して配列xに格納 ---*/
void make4digits(int x[])
{
    int i, j, val;

    for (i = 0; i < 4; i++) {
        do {
            val = rand() % 10;            /* 0~9の乱数 */
            for (j = 0; j < i; j++)        /* その数が既に得られているか */
                if (val == x[j])
                    break;
        } while (j < i);        /* 重複しない値が得られるまで繰り返す */
        x[i] = val;
    }
}

/*--- 入力された文字列sの妥当性をチェック ---*/
int check(const char s[])
{
    int i, j;

    if (strlen(s) != 4)            /* 文字列の長さが4でない */
        return 1;

    for (i = 0; i < 4; i++) {
        if (!isdigit(s[i]))
            return 2;            /* 数字以外の文字が含まれている */
        for (j = 0; j < i; j++)
            if (s[i] == s[j])
                return 3;        /* 同一の数字が含まれている */
    }
    return 0;                    /* 文字列は妥当 */
}

/*--- ヒット&ブローの判定 ---*/
void judge(const char s[], const int no[], int *hit, int *blow)
{
    int i, j;

    *hit = *blow = 0;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (s[i] == '0' + no[j])    /* 数字が一致 */
                if (i == j)
                    (*hit)++;            /* ヒット(位置も一致) */
                else
                    (*blow)++;            /* ブロー(位置が不一致) */
        }
    }
}

/*--- 判定結果を表示 ---*/
void print_result(int snum, int spos)
{
    if (spos == 4)
        printf("正解です!!");
    else if (snum == 0)
        printf("  それらの数字はまったく含まれません。\n");
    else {
        printf("  それらの数字中%d個の数字が含まれます。\n", snum);

        if (spos == 0)
            printf("  ただし位置もあっている数字はありません。\n");
        else
            printf("  その中の%d個は位置もあっています。\n", spos);
    }
    putchar('\n');
}

int main(void)
{
    int try_no = 0;        /* 入力回数 */
    int chk;            /* 入力された文字列のチェック結果 */
    int hit;            /* 位置も数字も当たっている個数 */
    int blow;            /* 数字が当たって位置が当たっていない数字の個数 */
    int no[4];            /* 当てる数字の並び */
    char buff[10];        /* 読み込む数字の並びを格納する文字列 */
    clock_t    start, end;                /* 開始時刻・終了時刻 */

    srand(time(NULL));                /* 乱数の種を設定 */

    puts("■ マスターマインドをしましょう。");
    puts("■ 四つの数字の並びを当ててください。");
    puts("■ 同じ数字が複数含まれることはありません。");
    puts("■ 4307のように連続して入力してください。");
    puts("■ スペース文字などを入力してはいけません。\n");

    make4digits(no);                    /* 相異なる四つの数字の並びを生成 */

    start = clock();                    /* 計測開始 */

    do {
        do {
            printf("入力してください:");
            scanf("%s", buff);            /* 文字列として読み込む */

            chk = check(buff);            /* 読み込んだ文字列をチェック */

            switch (chk) {
             case 1: puts("\aきちんと4文字で入力してください。"); break;
             case 2: puts("\a数字以外の文字を入力しないでください。"); break;
             case 3: puts("\a同一の数字を複数入力しないでください。"); break;
            }
        } while (chk != 0);

        try_no++;
        judge(buff, no, &hit, &blow);    /* 判定 */
        print_result(hit + blow, hit);    /* 判定結果を表示 */

    } while (hit < 4); 

    end = clock();                        /* 計測終了 */

    printf("%d回かかりました。\n所要時間は%.1f秒でした。\n",
                            try_no, (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}

c言語

試したこと

hitやblowの数を増やすだけでなく配列にその数字をいれるようにしようとしましたが、どう書けばいいかわからなくなりました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/01/10 08:49

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

0

jadgeって関数があるんでそれを改造するといいでしょう
途中まで書いておくんであとは自分で考えてください

void hint(const char s[], const int no[], int *hitnum)
{
    int i;

    *hitnum = -1;
    for (i = 0; i < 4; i++) {
        if (s[i] == '0' + no[i]){    /* 数字が一致 */
            /* ここになにか追加 */
            return;
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4821questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。