C语言实现三子棋首先要创建一个3*3的二维数组.
其中有4个函数
首先是初始化函数,将数组里的每个元素都初始化为一个空格
其次是玩家输入函数,玩家先输入一个坐标,并判断此坐标是否为空格,如果是空格,则表示此坐标里没有棋子,则将这个元素落子为'x',如果此坐标不是空格,则有棋子,由玩家重新输入,直到输入的坐标没有棋子为止.
还有电脑输入函数,利用时间戳%2得到2个0-2之间的随机数,即为此次随机的坐标,在判断此坐标是否有棋子,没有的话落子为'o'.
还有判断是否游戏结束的函数,有4种判断方式,一种是一行里都是'x'或'o',或者一列里都是'x'或'o',或者一个对角线里都是'x'或'o',或者3*3的二维数组里没有空格了,即为游戏结束.前三种判断方式是有胜者的,返回这一行或这一列或这一个对角线的任意一个元素即可,如果是第四种判断方式,那么就返回's'.如果没有结束游戏,则返回空格.
在主函数里,先char 胜者为空格,再进行循环,循环体里写玩家输入和电脑输入,每次输入之后都要将游戏判断函数的返回值赋给胜者,再判断游戏是否结束.
如果结束了,在判断胜者是否为'x',是的话输出玩家胜利,在判断胜者是否为'o',是的话电脑胜利,否则就是和棋.
代码如下:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
// 棋盘的长
#define max_row 3
// 棋盘的宽
#define max_col 3
// 初始化棋盘,棋盘里元素全部赋空格
void init(char board[max_row][max_col]) {
for (int row = 0; row < max_row; row++) {
for (int col = 0; col < max_col; col++) {
board[row][col] = ' ';
}
}
srand((unsigned int)time(0));
}
// 打印棋盘
void printboard(char board[max_row][max_col]){
system("cls");
for (int row = 0; row < max_row; row++) {
printf("+---+---+---+");
printf("\n");
for (int col = 0; col < max_col; col++) {
printf("| %c ", board[row][col]);
}
printf("|");
printf("\n");
}
printf("+---+---+---+");
printf("\n");
}
//判断棋盘是否已满
int full(char board[max_row][max_col]) {
for (int row = 0; row < max_row; row++) {
for (int col = 0; col < max_col; col++) {
//判断棋盘里是否存在空格,若存在则返回0
if (board[row][col] == ' ') {
return 0;
}
}
}
return 1;
}
//玩家落子
void player(char board[max_row][max_col]) {
printf("请玩家落子:\n");
while (1) {
//玩家输入落子的坐标
int row, col = 0;
scanf("%d %d", &row, &col);
//判断坐标是否在3*3的方格中
if (row < 0 || col < 0 || row >= max_row || col >= max_col) {
printf("输入错误,请重新落子!\n");
continue;
}
//判断落子位置是否为' ',若是则结束本次循环,重新赋值
if (board[row][col] != ' ') {
printf("你落得位置已经有子了,请重新落子!\n");
continue;
}
//玩家落子,落子赋为x
board[row][col] = 'x';
break;
}
}
//电脑落子
void computer(char board[max_row][max_col]) {
printf("请电脑落子:\n");
while (1) {
//电脑落子在0-2的随机数坐标中
int row = rand() % max_row;
int col = rand() % max_col;
//如果不为空,则有子,结束本次循环,再随机一次
if (board[row][col] != ' ') {
continue;
}
//电脑落子,落子赋为o
board[row][col] = 'o';
break;
}
}
//判断是否已出现胜者
char checkwinner(char board[max_row][max_col]) {
//判断所有的行
for (int row = 0; row < max_row; row++) {
if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
return board[row][0];
}
}
//判断所有的列
for (int col = 0; col < max_col; col++) {
if (board[0][col]!=' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
return board[0][col];
}
}
//判断对角线
if (board[0][0]!=' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
return board[0][0];
}
if (board[0][2]!=' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
return board[0][2];
}
//判断棋盘是否已满
if(full(board)){
return 's';
}
return ' ';
}
int main(){
char board[max_row][max_col] = { 0 };
init(board);
char winner=' ';
while (1) {
printboard(board);
player(board);
winner = checkwinner(board);
printboard(board);
if (winner != ' ') {
break;
}
computer(board);
printboard(board);
winner = checkwinner(board);
if (winner != ' ') {
break;
}
}
if (winner == 'x') {
printf("恭喜你,你赢了!");
}
else if (winner == 'o') {
printf("你输了!");
}
else{
printf("和棋了!");
}
return 0;
}