プロが教える店舗&オフィスのセキュリティ対策術

〇×ゲームのプログラムを作っているのですが、forで「○、×の入力、盤の表示」を反復させているなかに、勝敗判定と勝敗が決まったときに反復を抜ける処理を入れたいのですがうまくいきません。このようなやり方の〇×ゲームのソースコードを教えてほしいです。

A 回答 (5件)

おっと、バグってたな・・・。



関数can_winを次のモノに置き換えてください。

int can_win(int brd[], int player) {
 int i, j, win;
 for (i = 0; i < 8; i++) {
  for (j = 0; j < 3; j++) {
   win = 1;
   if (brd[winners[i][j]] != player) {
    win = 0;
    break;
   }
  }
  if (win == 1) {
   break;
  }
 }
 return win;
}

多分これでバグは取れたと思うんだけど・・・。はて。
    • good
    • 0

#include <stdio.h>


#include <string.h>
#include <stdlib.h>

int board[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
const int player = 88;
const int computer = 79;

int moves[][4] = {{1, 3, 7, 9}, {5,}, {2, 4, 6, 8}};
int winners[][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};
int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

void print_board() {
 char s[2] = {'\0'};
 char end[14];
 int i, x = 1;
 for (i = 0; i < 9; i++) {
  strcpy(end, " | ");
  if (x % 3 == 0) {
   strcpy(end, " \n");
   if (board[i] != 1) {
    strcat(end, "---------\n");
   }
  }
  if (board[i] > 8) {
   sprintf(s, "%c", (char)board[i]);
  } else {
   sprintf(s, "%c", ' ');
  }
  x++;
  printf("%s%s", s, end);
 }
}

int can_move(int brd[], int move) {
 int i;
 for (i = 1; i < 10; i++) {
  if (move == tab[i - 1]) {
   if (brd[move - 1] == move - 1) {
    return 1;
   }
  }
 }
 return 0;
}

int can_win(int brd[], int player) {
 int win, i, n, tup[3], ix;
 win = 1;
 for (n = 0; n < 9; n++) {
  for (i = 0; i < 3; i++) {
   tup[i] = winners[n][i];
  }
  win = 1;
  for (i = 0; i < 3; i++) {
   ix = tup[i];
   if (brd[ix] != player) {
    win = 0;
    break;
   }
  }
  if (win == 1) {
   break;
  }
 }
 return win;
}

int* make_move(int brd[], int player, int move, int undo) {
 int win;
 int* ls;
 ls = malloc(sizeof(int) * 2);
 if (can_move(brd, move)) {
  brd[move - 1] = player;
  win = can_win(brd, player);
  if (undo) {
   brd[move - 1] = move - 1;
  }
  ls[0] = 1;
  ls[1] = win;
  return ls;
 }
 ls[0] = 0;
 ls[1] = 0;
 return ls;
}

int* computer_move(void) {
 int i, j, mv;
 int move = -1;
 for (i = 1; i < 10; i++) {
  if (make_move(board, computer, i, 1)[1]) {
   move = i;
   break;
  }
 }
 if (move == -1) {
  for (i = 1; i < 10; i++) {
   if (make_move(board, player, i, 1)[1]) {
    move = i;
    break;
   }
  }
 }
 if (move == -1) {
  for (i = 0; i < 3; i++){
   for (j = 0; j < 4; j++) {
    mv = moves[i][j];
    if ((move == -1) && (can_move(board, mv))) {
     move = mv;
     break;
    }
   }
  }
 }
 return make_move(board, computer, move, 0);
}

int space_exists(void) {
 int i;
 int acc = 0;
 for (i = 0; i < 9; i++) {
  if (board[i] == 88 || board[i] == 79) {
   acc++;
  }
 }
 if (acc != 9) {
  return 1;
 } else {
  return 0;
 }
}

int main(void) {
 char input[2], result[36];
 int move, moved, won;
 int* mw = malloc(sizeof(int) * 2);
 printf("Player is %c and computer is %c\n", (char)player, (char)computer);
 strcpy(result, "%%% Deuce ! %%%");
 while (space_exists()) {
  print_board();
  printf("# Make your move ! [1-9] : ");
  scanf("%1s%*[^\n]%*c", input);
  move = atoi(input);
  mw = make_move(board, player, move, 0);
  moved = mw[0];
  won = mw[1];
  if (!moved) {
   puts(" >> Invalid number ! Try again !");
   continue;
  }
  if (won) {
   strcpy(result, "*** Congratulations ! You won ! ***");
   break;
  } else if (computer_move()[1]) {
   strcpy(result, "=== You lose ! ==");
   break;
  }
 }
 print_board();
 puts(result);
 free(mw);
 return 0;
}
    • good
    • 0

雰囲気的にループの中のループで判定して外のループも抜けたいってことかな?ということであって、どうしてもGoToキャンペーンには賛同しかねるということであれば、内のループを抜けるときに外のループも抜けたいという情報を覚えておけばよい。



for (;;) {
 ...
 for (owatta = 0;;) {
  ...
  if (owari) {
   owatta = 1;
   break;
  }
 }
 if (owatta) {
  break;
 }
 ...
}

この例なら、わざわざowattaなんて覚えておかなくてもowariで判定してもいいのだけど。
    • good
    • 1

> 反復を抜ける処理を入れたいのですがうまくいきません。



gotoを使おう。
首相もGoToが悪さしたエビデンスは無いって言ってるし。

main(){
 for(;;){
  if(勝敗が決まる) goto owari;
 }

owari:
 printf("終わった\n");
}
    • good
    • 1

こういう質問の時に 丸投げ はダメです。


自分の ソース を(ある程度)公開して「ここがうまくいかないので教えてください」というように質問してください。
    • good
    • 0

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