明解C言語 中級の3章末問題解いてみた

3章はじゃんけんプログラムでした。じゃんけんゲームのアルゴリズムはすごくおもしろかったけど、章末の課題についてはあんまりだったかな。と言っても、自分もいい課題が思いつくってこともないのだけど。

※コードが長くなってきたのでSyntaxHighlighterを導入しました。

最初はWordpressでJqueryを使う方法で考えていたのですが、Wordpress編集画面のビジュアル⇔テキストと切り替えると、なんと自動整形しやがるので、ドジでのろまなカメなたけけんはそのうちうっかり失敗しそうだから、静的なページをポップアップすることにしたのでした。
※mod_pagespeedがやってるんだけど、ソースコードの一番下でincludeしたヘッダを閉じてる記述が足されている・・・。
まぁおいおい何かやりますわ。

最終更新日:「うっかり失敗しそうだから、静的なページをポップアップすることにした」ことで消してしまったコードをちびちび修正ちう

1問目 これは例題を編集する問題です。

void update_score_and_disp_result(int result)
{
    switch (result)
    {
    case 0:
        draw_no++;
        puts("引き分けです。");
        break; /* 引き分け */
    case 1:
        lose_no++;
        puts("あなたの負けです。");
        break; /* 負け */
    case 2:
        win_no++;
        puts("あなたの勝ちです。");
        break; /* 勝ち */
    }
}

2問目 これも例題を編集する問題です。

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

int human;		
int comp;		
int win_no;		
int lose_no;	
int draw_no;	
int game_rounds; 

char *hd[] = {"グー", "チョキ", "パー"};

void initialize(void)
{
	win_no	= 0;
	lose_no	= 0;
	draw_no	= 0;

	srand(time(NULL));

	printf("じゃんけんゲーム開始!!\n");

    char buffer[256];
    char *end;
    do {
        printf("何回勝負しますか?(数値を入力してください) : ");
        fgets(buffer, 256, stdin);
        game_rounds = strtol(buffer, &end, 10);
        if (end == buffer || *end != '\n' || game_rounds <= 0){
            printf("エラー:数値以外が入力されました。再度入力してください。\n");
        }
    } while(end == buffer || *end != '\n' || game_rounds <= 0);
}

void jyanken(void)
{
	int i;
	comp = rand() % 3;

    char buffer[256];
    char *end;
	do {
		printf("\n\aじゃんけんポン …");
		for (i = 0; i < 3; i++)
			printf(" (%d)%s", i, hd[i]);
		printf(" : ");
        fgets(buffer, 256, stdin);
        human = strtol(buffer, &end, 10);
		if(end == buffer || *end != '\n' || human < 0 || human > 2){
			printf("エラー:数値以外が入力されました。再度入力してください。\n");
		}
	} while (end == buffer || *end != '\n' || human < 0 || human > 2);
}

void update_score_and_disp_result(int result)
{
    switch (result)
    {
    case 0:
        draw_no++;
        puts("引き分けです。");
        break;
    case 1:
        lose_no++;
        puts("あなたの負けです。");
        break;
    case 2:
        win_no++;
        puts("あなたの勝ちです。");
        break;
    }
}

int main(void)
{
	int judge;

	initialize();

	do {
		jyanken();
		printf("私は%sで、あなたは%sです。\n", hd[comp], hd[human]);
		judge = (human - comp + 3) % 3;	
        update_score_and_disp_result(judge);
	} while (win_no < game_rounds && lose_no < game_rounds);

	if (win_no == game_rounds)
		printf("\nあなたの勝ちです。\n");
	else
		printf("\n私の勝ちです。\n");

	return (0);
}

3問目 これは例題を利用して作ったりする問題

そーす:ごめんなさい。データなくなっちゃいました。

4問目 最初はグーってやつなのだが、もっといい答えはある。

そーす:ごめんなさい。データなくなっちゃいました。

5問目 5回ごとに後出しさせるものですが、後出しってまるわかりなようにした。

そーす:ごめんなさい。データなくなっちゃいました。

6問目 第5章を参考にするらしいので、5章が終わってからやろうと思います。

7問目 3人じゃんけん VS COM方式にしたのでじゃんけんアルゴリズムではありません。
ほんとはなにかアルゴリズムを考えるのがよい気はするけど、いまはこれでいいと思ってます。

そーす:ごめんなさい。データなくなっちゃいました。

8問目 4人じゃんけん 7問目の条件を増やしただけです。
これもVSCOM式として考えたもので、複数人じゃんけんのアルゴリズムを考えたわけではないのはちょっと気になるけど、いまはこれでいいと思っています。

デバッグをそこそこやったので間違いないとは思うが・・・。

そーす:ごめんなさい。データなくなっちゃいました。

 

ちゃんと納得のいくアルゴリズムを考えてはいないのだけど、とりあえず先にすすもうと思います。