用分步的方式实现三子棋。
实现的主要思路为以下代码:
void game()
{
char ret='0';
char board[ROW][COL];
initboard(board,ROW,COL);
displayboard(board, ROW, COL);
while (1)
{
playermove(board, ROW, COL);
displayboard(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
computermove(board, ROW, COL);
displayboard(board, ROW, COL);
ret = iswin(board,ROW,COL);
if (ret != 'C')
{
break;
}
}
if (ret == '#')
{
printf("computer win!\n");
}
else if(ret=='*')
{
printf("player win\n");
}
else
{
printf("平局\n");
}
}
void menu()
{
printf("**************《三子棋游戏》***********\n");
printf("********1.play*********0.exit**********\n");
printf("***************************************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
以下是用函数的形式来实现三子棋各个部分内容的功能。
第一步:初始化棋盘——函数——initboard();
void initboard(char board[ROW][COL],int row ,int col )
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
将数组的每一项初始化为字符‘ ’空格,以免影响观赏性。
第二步:打印棋盘——函数——displayboard();
实现三子棋棋盘的打印
// | |
//---|---|---
//---|---|---//棋盘
// | |
void displayboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
打印出三子棋所需的表盘。
第三步:实现玩家下棋和电脑下棋的代码实现
void playermove(char board[ROW][COL], int row, int col)
{
printf("请输入一个坐标\n");
int x, y;
while (1)
{
scanf("%d %d", &x, &y);
if (x > row || y > col || x < 1 || y < 1)
{
printf("坐标非法,请重新输入\n");
}
else if (board[x - 1][y - 1] != ' ')
{
printf("此坐标已被占用,请重新输入\n");
}
else
{
board[x - 1][y - 1] = '*';
break;
}
}
}
void computermove(char board[ROW][COL], int row, int col)
{
int x, y;
while(1)
{
x = rand() % (row + 1);
y = rand() % (col + 1);
//判断坐标的合法性
if (x > row || y > col || x < 1 || y < 1)
{
//printf("此坐标非法,请重新输入\n");
}
else if (board[x - 1][y - 1] != ' ')
{
//printf("此坐标已被占用\n");
}
else
{
board[x - 1][y - 1] = '#';
break;
}
}
}
第四步就是判断输赢或者平局:这里用返回*/#/C/A来判断每下一步棋后是否会出现输赢或者平局,若无,这返回C,表示游戏继续。
//*---player//#---computer//A---peace//C---go on
char iswin(char board[ROW][COL], int row, int col)
{
int i, j;
int count = 0;
//row
for (i = 0; i < row; i++)
{
count = 0;
for (j = 0; j < col; j++)//player
{
if (board[i][j] == '*')
{
count++;
}
}
if (count == 3)
{
return '*';
break;
}
count = 0;
for (j = 0; j < col; j++)//computer
{
if (board[i][j] == '#')
{
count++;
}
}
if (count == 3)
{
return '#';
break;
}
}
//col
for (j = 0; j < col; j++)
{
count = 0;
for (i = 0; i < row; i++)//player
{
if (board[i][j] == '*')
{
count++;
}
}
if (count == 3)
{
return '*';
break;
}
count = 0;
for (i = 0; i < row; i++)//computer
{
if (board[i][j] == '#')
{
count++;
}
}
if (count == 3)
{
return '#';
break;
}
}
//左斜下
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
if (board[0][0] == '*')
{
return '*';
}
else if (board[0][0] == '#')
{
return '#';
}
}
//右斜下
if (board[0][2] == board[1][1] && board[1][1] == board[2][0])
{
if (board[0][2] == '*')
{
return '*';
}
else if (board[0][2] == '#')
{
return '#';
}
}
int flag = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
flag = 1;
}
}
}
if (flag == 0)
{
return 'A';
}
return 'C';
}