
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
電子書籍プレゼントキャンペーン!
最大2万円超分当たる!マンガや小説が読める電子書籍サービス『Renta!』で利用できるギフトコードプレゼント実施中!
-
C言語で三目並べをするプログラムの作成
C言語・C++・C#
-
C言語にて作成中の三目並べについての質問です
C言語・C++・C#
-
教えてください(丸罰ゲーム)
C言語・C++・C#
-
4
三目並べ
C言語・C++・C#
-
5
C言語で五目並べを作成しているのですが…
C言語・C++・C#
-
6
3目並べのプログラムについての質問です
工学
-
7
Javaでゲーム
Java
-
8
Javaでの三目並べのソースコード
Java
-
9
石取りゲームをC言語プログラムで教えてください
C言語・C++・C#
-
10
どんなプログラムを書いても指定されたファイルが見つかりません。と出てきます。どうやったら解決しますか
C言語・C++・C#
-
11
system(cls")について"
C言語・C++・C#
-
12
C言語 初心者です。
C言語・C++・C#
-
13
ばばぬきプログラムについて
C言語・C++・C#
-
14
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
15
Javaでゲーム
Java
-
16
e^(x^2)の積分に関して
数学
-
17
二つの囲まれた楕円の共通の面積を求める問題なのですが・・
数学
-
18
基底であることを示す問題
数学
-
19
init関数の意味
C言語・C++・C#
-
20
c言語のプログラミングに関して
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
非同期プログラミングは必ずマ...
-
5
C言語 時刻差分の算出方法
-
6
Excelでのセル内容の高速消去方法
-
7
「単体テスト」に関する深刻な...
-
8
ソニーやキオクシア、マイクロ...
-
9
緯度、経度の 10進法と 60進法...
-
10
Macターミナルで実行中のプログ...
-
11
USJでの割り込み
-
12
【C言語】再帰が時間がかかる...
-
13
タスクマネージャーのプロセス...
-
14
GetDlgItemInt( ) c++
-
15
VBAの配列サイズとメモリに関して
-
16
DirectXでの周波数(音程)変更
-
17
WebBrowserでPDF表示でのトラブル
-
18
誕生日占いをプログラムで作成...
-
19
Javascritpでソケット通信?
-
20
怪しいプロセス教えてください。
おすすめ情報
公式facebook
公式twitter