c++ 简单版井字棋

#include
#include
#include
#include
using namespace std;

int main () {
	char chess[3][3];
	memset(chess, 'o', sizeof(chess));//)不要漏 
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cout<>row>>col;//输入你的坐标,[1,3]
	row--;//--的原因 
	col--; 
	if(chess[row][col]!='o'){
		cout<<"已经有人下过了,请重新选\n";
		continue; 
	} else{
		if(player==1){
		chess[row][col]='*';
	}else{
		chess[row][col]='#';
	}
	break;
	}
}
	
//重新输出棋盘
for(int i=0;i<3;i++){
 	for(int j=0;j<3;j++){
 		cout<2){
		player=1;
	}
} 

}
 
	return 0;
	
}

 

根据Milo的改进优化:

1.用结构体表示井字棋一个回合中的状态

 

typedef struct {
    int board[3][3];    // -1 = empty, 0 = O, 1 = X
    int turn;           // O first
} state;

void init(state* s) {
    int i, j;
    for (j = 0; j < 3; j++)
        for (i = 0; i < 3; i++)
            s->board[j][i] = -1;
    s->turn = 0;
}

c++ 简单版井字棋_第1张图片  这样的显示,更方便玩家下棋。

2 . 显示

void display(const state* s) {
    int i, j;
    for (j = 0; j < 3; j++) {
        for (i = 0; i < 3; i++) {
            switch (s->board[j][i]) {
                case -1: printf(" %d ", j * 3 + i + 1); break;
                case  0: printf(" O "); break;
                case  1: printf(" X "); break;
            }
            if (i < 2)
                printf("|");
            else
                printf("\n");
        }
        if (j < 2)
            printf("---+---+---\n");
        else
            printf("\n");
    }
}

压缩的话

void display(const state* s) {
    int i, j;
    for (j = 0; j < 3; printf(++j < 3 ? "---+---+---\n" : "\n"))
        for (i = 0; i < 3; putchar("||\n"[i++]))
            printf(" %c ", s->board[j][i] == -1 ? '1' + j * 3 + i : "OX"[s->board[j][i]]);
}

3.下棋

用奇数偶数回合判断玩家1 2

int move(state* s, int i, int j) {
    if (s->board[j][i] != -1)
        return 0;
    s->board[j][i] = s->turn++ % 2;
    return 1;
}

 

4.胜负

使用一个宏 CHECK() 去检测三个位置是否都为相同的棋子

#define CHECK(j1, i1, j2, i2, j3, i3) \
    if (s->board[j1][i1] != -1 && s->board[j1][i1] == s->board[j2][i2] && s->board[j1][i1] == s->board[j3][i3]) \
        return s->board[j1][i1] == 0 ? 1 : -1;

int evaluate(const state* s) {
    int i;
    for (i = 0; i < 3; i++) {
        CHECK(i, 0, i, 1, i, 2);    // horizontal
        CHECK(0, i, 1, i, 2, i);    // vertical
    }
    CHECK(0, 0, 1, 1, 2, 2);        // diagonal
    CHECK(0, 2, 1, 1, 2, 0);        // diagonal
    return 0;
}

注意 第九回合 是平局。

你可能感兴趣的:(C/C++,C/C++)