VIPPERでもわかる C言語プログラミング

このエントリーをはてなブックマークに追加
546デフォルトの名無しさん
○×ゲームを作ってみたお。
今どちらも手動入力だからVIPPERに優秀なCOMを作って貰うお。

#include <stdio.h>
enum {
  NONE = 0,
  CIRCLE,
  CROSS,
  SYMBOLS
};
const char *symbols[] = {" ", "○", "×"};
const char *number[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};

int player(int *board, int turn)
{
  int n;

  while(printf("%s's turn. Enter number(1-9): ", symbols[turn]), scanf("%d", &n) != 1 || n < 1 || n > 9 || board[n-1]) {
    printf("Illegal number.\n");
    scanf("%*[^\n]");
  }
  return (n - 1);
}
547デフォルトの名無しさん:2005/10/29(土) 15:52:45
void print_board(int *board)
{
  int i;

  printf("┏━┳━┳━┓\n┃");
  for(i = 0; i < 9; i++) {
    if(i && !(i % 3)) {
      printf("\n┣━╋━╋━┫\n┃");
    }
    printf("%s┃", board[i] ? symbols[board[i]] : number[i]);
  }
  printf("\n┗━┻━┻━┛\n");
}
548デフォルトの名無しさん:2005/10/29(土) 15:53:31
int is_gameover(int *board, int last)
{
  int i, cnt;
  int line = last/3, column = last%3;
  int turn = board[last];

  /* 横のチェック*/
  for(i = 0, cnt = 0; i < 3; i++) {
    if(board[line * 3 + i] == turn && ++cnt == 3) return turn;
  }
  /* 縦のチェック*/
  for(i = 0, cnt = 0; i < 3; i++) {
    if(board[i * 3 + column] == turn && ++cnt == 3) return turn;
  }
  /* 左上->右下チェック*/
  for(i = 0, cnt = 0; i < 3; i++) {
    if(board[i * 4] == turn && ++cnt == 3) return turn;
  }
  /* 右上->左下チェック*/
  for(i = 0, cnt = 0; i < 3; i++) {
    if(board[(i + 1) * 2] == turn && ++cnt == 3) return turn;
  }
  return -1;
}
549デフォルトの名無しさん:2005/10/29(土) 15:54:15
int main(int argc, char **argv)
{
  int board[9] = {0};
  int (*players[])(int*, int) = {player, player};
  int i, n, turn = CIRCLE;

  for(i = 0; i < 9; i++) {
    print_board(board);
    board[(n = players[turn-1](board, turn))] = turn;
    if(is_gameover(board, n) > 0) {
      break;
    }
    turn ^= (CIRCLE | CROSS); /* 交代*/
  }
  /* 結果出力 */
  print_board(board);
  printf("winner: %s\n", (i == 9) ? "none. drawn game." : symbols[turn]);
  return 0;
}