C语言实战:使用二维数组实现三子棋游戏
三子棋(井字棋)是C语言学习中锻炼逻辑与数组操作的经典案例。本文通过二维数组构建3x3棋盘,详解初始化、人机交互、随机落子及全盘胜负判定逻辑,并提供包含完整控制流的C语言源码。
三子棋核心设计思路
三子棋的核心在于数据结构的存储与状态检测。整个游戏基于一个 3x3 的二维字符数组进行状态管理:空格代表空位,* 代表玩家棋子,# 代表电脑棋子。游戏流程主要包含三个关键模块:
第1步:棋盘初始化与显示
目的:建立游戏界面并清空数据。
原理:调用 InitBoard 函数将二维数组所有元素填充为空格。打印时利用循环遍历数组,在行与列之间插入分隔符以模拟网格效果。
第2步:玩家输入处理
入口:控制台输入。
动作:读取玩家输入的坐标 (x, y)。校验逻辑包括:
1. 坐标是否在有效范围 (1-3) 内;
2. 目标位置是否已被占用。验证通过后,将数组对应索引赋值为 *。
第3步:电脑随机落子与胜负判定
动作:电脑通过随机数生成器获取坐标,若该位置为空则落子 #。
胜负逻辑:编写专用检查函数 CheckBoard,按以下顺序穷举检查结果:
1. **赢**:检测所有行、列及对角线是否存在三连珠,返回对应的标记值。
2. **平局**:无赢家且棋盘已满。
3. **继续**:棋盘未满且无赢家,返回特定代码让主循环继续执行。
以下是游戏界面的逻辑展示:
C语言完整实现源码
以下为整合了菜单、初始化、人机交互及胜负判定的完整单文件代码。直接复制到编译器即可运行测试。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
// 定义棋盘大小
#define ROW 3
#define COL 3
// 全局函数声明
void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
int CheckBoard(char board[ROW][COL], int row, int col);
void menu();
// 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
// 打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
// 打印数据行
int j = 0;
for (j = 0; j < col; j++)
{
if (j == col - 1)
{
printf(" %c ", board[i][j]);
}
else
{
printf(" %c |", board[i][j]);
}
}
printf("\n");
// 打印分割行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
if (j == col - 1)
{
printf("---");
}
else
{
printf("---|");
}
}
printf("\n");
}
}
}
// 玩家走棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
while (1)
{
printf("请输入坐标(如 1 1): ");
scanf("%d %d", &x, &y);
// 坐标范围检测
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
// 内存检测
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
return;
}
else
{
printf("该位置已有棋子,请重新输入!\n");
}
}
else
{
printf("坐标越界,请重新输入!\n");
}
}
}
// 电脑走棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑思考中...\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
// 检查棋盘状态
// 1:玩家赢 * 2:电脑赢 # 3:继续 0:平局
int CheckBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
// 判断行和列
for (i = 0; i < row; i++)
{
// 行判断
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return (board[i][0] == '*') ? 1 : 2;
}
// 列判断
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return (board[0][i] == '*') ? 1 : 2;
}
}
// 对角线判断
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return (board[0][0] == '*') ? 1 : 2;
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return (board[0][2] == '*') ? 1 : 2;
}
// 判断平局
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 3; // 还有空位,继续
}
}
}
return 0; // 平局
}
// 游戏主逻辑
void game()
{
char board[ROW][COL];
int ret = 0;
// 1. 初始化
InitBoard(board, ROW, COL);
// 2. 打印初始界面
PrintBoard(board, ROW, COL);
// 3. 循环下棋
while (1)
{
// 玩家回合
PlayerMove(board, ROW, COL);
PrintBoard(board, ROW, COL);
ret = CheckBoard(board, ROW, COL);
if (ret != 3) break;
// 电脑回合
system("cls");
ComputerMove(board, ROW, COL);
PrintBoard(board, ROW, COL);
ret = CheckBoard(board, ROW, COL);
if (ret != 3) break;
}
// 4. 输出结果
if (ret == 1)
{
printf("*** 玩家赢了 ***\n");
}
else if (ret == 2)
{
printf("*** 电脑赢了 ***\n");
}
else if (ret == 0)
{
printf("*** 平局 ***\n");
}
}
// 菜单显示
void menu()
{
printf("=================================\n");
printf("======= 1. Play Game ========\n");
printf("======= 0. Exit Game ========\n");
printf("=================================\n");
}
// 主程序
int main()
{
srand((unsigned)time(NULL));
int input = 1;
while(input)
{
menu();
printf("请选择: ");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
}
return 0;
}
以上就是C语言实现三子棋游戏的详细内容,更多关于C语言基础教程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









