A 回答 (5件)
- 最新から表示
- 回答順に表示
No.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;
}
多分これでバグは取れたと思うんだけど・・・。はて。
No.4
- 回答日時:
#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;
}
No.3
- 回答日時:
雰囲気的にループの中のループで判定して外のループも抜けたいってことかな?ということであって、どうしてもGoToキャンペーンには賛同しかねるということであれば、内のループを抜けるときに外のループも抜けたいという情報を覚えておけばよい。
for (;;) {
...
for (owatta = 0;;) {
...
if (owari) {
owatta = 1;
break;
}
}
if (owatta) {
break;
}
...
}
この例なら、わざわざowattaなんて覚えておかなくてもowariで判定してもいいのだけど。
No.2
- 回答日時:
> 反復を抜ける処理を入れたいのですがうまくいきません。
gotoを使おう。
首相もGoToが悪さしたエビデンスは無いって言ってるし。
main(){
for(;;){
if(勝敗が決まる) goto owari;
}
owari:
printf("終わった\n");
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ノートパソコン .dllファイルがありませんと表示される 5 2023/04/30 03:03
- 数学 数学 確率 ゲームのガチャ 2 2023/04/27 19:23
- 日本語 この問題分かる方教えていただきたいです。 (2)「お買い物は買い手と売り手の心理ゲームである」。 こ 2 2022/10/10 01:11
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) Excelでの2つの条件を指定した計算について、躓いてしまったので助けて下さい。 2 2022/07/15 22:10
- Java Java 石取りゲーム 3 2023/02/02 15:46
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# Windows10,visal studio2019,C言語でゲームを作っているのですが、任天堂スイ 1 2022/09/16 19:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ラップ関数とはどんなものですか?
-
課題なんですが・・・
-
比較回数と交換回数表示について
-
std::set<int> で、ある値が何...
-
(int *)の意味
-
C言語の基礎 . 2乗値の差につ...
-
複数桁10進数の*桁目だけを抽出...
-
OpenCVで平均濃度の求め方
-
Win32APIで作るコンボボックス...
-
【C++】関数ポインタの使い方
-
最早開始時間と最遅完了時刻を...
-
#define _CRT_SECURE_NO_WARNIN...
-
剰余演算を論理演算と加減算に...
-
卒業研究でよく分からないとこ...
-
線形補間 2次元テーブル C言語...
-
C言語 等差数列問題
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
式は定数値が必要です」という...
-
簡単なようで分からない?for文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報