总体思路很简单:
1.打印棋盘
2.初始化棋盘,9个格子全部设为’ ’
3.玩家落子.输入一个合法坐标并检验游戏是否结束
4.电脑随机落子并检验游戏是否结束
//三子棋
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define MAX_ROW 3
#define MAX_COL 3
void menu() {
printf("=====================\n");
printf(" 1.Play\n");
printf(" 2.Exit\n");
printf("=====================\n");
printf("输入你的选择: ");
}
char chess_board[MAX_ROW][MAX_COL];
void print() {
for (int row = 0; row < MAX_ROW; ++row) {
for (int col = 0; col < MAX_COL - 2; ++col) {
printf("| %c | %c | %c |\n",
chess_board[row][0], chess_board[row][1], chess_board[row][2]);
}
printf("|---|---|---|\n");
}
}
void init() {//初始化棋盘
for (int row = 0; row < MAX_ROW; ++row) {
for (int col = 0; col < MAX_COL; ++col) {
chess_board[row][col] = ' ';
}
}
printf("\n");
}
void PlayerMove() {//玩家落子 o
while (1) {
int row = 0, col = 0;
printf("玩家落子: ");
scanf("%d %d", &row, &col);
if (row > MAX_ROW - 1 || row < 0 || col < 0 || col > MAX_COL - 1) {
printf("输入非法 重新输入:\n");
continue;
}
else if (chess_board[row][col] != ' ') {
printf("Occupied!\n");
continue;
}
else chess_board[row][col] = 'o';
break;
}
//printf("\n");
}
void ComputerMove() {//电脑落子 x
printf("电脑落子: \n");
while (1) {
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (chess_board[row][col] != ' ') {
continue;
}
else {
chess_board[row][col] = 'x';
break;
}
}
}
char IsFull() {
for (int row = 0; row < MAX_ROW; ++row) {
for (int col = 0; col < MAX_COL; ++col) {
if (chess_board[row][col] == ' ') {
return 0;
}
}
}
return 1;
}
char CheckResult() {//检查结果
//玩家赢\电脑赢\和棋\继续
int row = 0;
int col = 0;
for (row = 0; row < MAX_ROW; ++row) {
if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]) {
return chess_board[row][0];
}
}
for (col = 0; col < MAX_COL; ++col) {
if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col])
return chess_board[0][col];
}
if (chess_board[0][0] == chess_board[1][1] && chess_board[0][0] == chess_board[2][2]) {
return chess_board[0][0];
}
else if (chess_board[0][2] == chess_board[1][1] && chess_board[0][2] == chess_board[2][0]) {
return chess_board[0][2];
}
else if (IsFull()) {
return 'D';
}
return ' ';
}
void Game() {//开始游戏
system("cls");
printf("游戏开始!\n");
char winner = ' ';
while (1) {
system("cls");
print();//打印棋盘
PlayerMove();//玩家落子
winner = CheckResult();//检验结束
if (winner != ' ') {
break;
}
ComputerMove();//电脑落子
winner = CheckResult();//检验结束
if (winner != ' ') {
break;
}
}
if (winner == 'o') {//玩家赢
print();
//system("cls");
printf("Victory!\n");
}
else if (winner == 'x') {//电脑赢
printf("Defeat!\n");
}
else if (winner == 'D') {//平局
printf("Draw!\n");
}
else {
printf("Error!\n");
}
//print();
return ' ';
}
int main() {
srand(time(NULL));
menu();
init();
int choice = 0;
scanf("%d", &choice);
while (1) {
if (choice == 1) {
Game();
init();
break;
}
else if (choice == 0) {
printf("拜拜!\n");
break;
}
else {
printf("不要乱搞!\n");
break;
}
}
system("pause");
return 0;
}
注意这里电脑是随机落子,需要设置一个随机种子,并且只需要在程序开始时设置一次就OK.对游戏结束的条件也要考虑完全.