プロが教えるわが家の防犯対策術!

コンピューター対戦のプログラムを組みたいので
その土台となるプレイヤーVSプレイヤー(どっちも人間がやる内容)の石取りゲームでのC言語プログラムを教えてください。
ルールとしては最初に石の個数を入力し(10個以上)、二人のプレイヤーが交互に1から3個ずつ石を取り、最後の1個を取った方が負けとなる。
作動例
石の数(10以上): 15
石の数: 15
プレイヤー1の番です
何個取る(1〜3個)? 3
石の数: 12
プレイヤー2の番です
何個取る(1〜3個)? 2
石の数: 10
プレイヤー1の番です
何個取る(1〜3個)? 4
プレイヤー1の番です
何個取る(1〜3個)? 3
石の数: 7
プレイヤー2の番です
何個取る(1〜3個)? 3
石の数: 4
プレイヤー1の番です
何個取る(1〜3個)? 2
石の数: 2
プレイヤー2の番です
何個取る(1〜3個)? 1
石の数: 1
プレイヤー2の勝ち

A 回答 (1件)

#include <stdio.h>


#include <stdlib.h>
#include <stdbool.h>

#define A 0
#define B 4

typedef struct env_t {
 int stones;
 int player;
} Env_t;

char* Message[] = {"石の数 (10以上) : ", "石の数: %d\n",\
         "プレイヤー%dの番です\n何個取る (1〜3個) ?",\
         "プレイヤー%dの勝ち\n"};

Env_t init(void) {
 Env_t env;
 char s[5];
 int num;
 while (true) {
  printf("%s", Message[0]);
  scanf("%4s%*[^\n]", s);
  getchar();
  num = strtol(s, NULL, 10);
  if (num > 9) {
   env.stones = num;
   env.player = 1;
   return env;
  }
 }
}

int input(Env_t env, char* prompt) {
 char s[2];
 int num;
 while (true) {
  printf(prompt, env.player);
  scanf("%1s%*[^\n]", s);
  getchar();
  num = strtol(s, NULL, 10);
  if ((num > A) && (num < B)) {
   return num;
  }
 }
}

Env_t Eval(int num, Env_t env) {
 env.stones -= num;
 env.player = env.player == 1 ? 2 : 1;
 return env;
}

bool is_game_ends(Env_t env) {
 return env.stones < 2 ? true : false;
}

int main(void) {
 Env_t env = init();
 printf(Message[1], env.stones);
 while (true) {
  env = Eval(input(env, Message[2]), env);
  if (is_game_ends(env)) {
   printf(Message[1], env.stones);
   printf(Message[3], env.player == 1 ? 2 : 1);
   return EXIT_SUCCESS;
  }
  printf(Message[1], env.stones);
 }
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています