终于用C语言实现了井字棋游戏。代码是学习网络讲师鹏哥的课程跟着写的。
怕忘,就发上来留着,自用。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define ROW 3
#define COL 3
//棋盘格式化函数
void displayBoard(char board[ROW][COL], int row, int col){
int i=0;
int j=0;
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 InitBoard(char board[ROW][COL], int row, int col){
int i=0;
int j=0;
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
board[i][j]=' ';
}
}
}
// 玩家行动
void playerMove(char board[ROW][COL], int row, int col){
int x=0;
int y=0;
printf("-[玩家行动回合]-\n");
while (1)
{
printf("[请输入坐标]\n");
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]='*';
break;
}
}
else
{
printf("[坐标范围超限][请重新输入]\n");
}
}
}
// 电脑行动
void computerMove(char board[ROW][COL], int row, int col){
int x=0;
int y=0;
printf("-[电脑行动回合]-\n");
while (1)
{
// 随机数
x = rand()%row;
y = rand()%col;
if (board[x][y]==' ')
{
board[x][y]='#';
break;
}
}
}
// 判断平局函数
int IsFull(char board[ROW][COL], int row, int col){
int i=0;
int j=0;
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
if (board[i][j]==' ')
// 找到空值返回0
return 0;
}
}
// 棋盘全满返回1
return 1;
}
// 判断输赢函数
char Iswin(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][1] != ' ')
return board[i][1];
}
// 判断竖列
for (i=0;i<col;i++)
{
if (board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i] != ' ')
return board[1][i];
}
// 对角线1
if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1] != ' ')
return board[1][1];
// 对角线2
if (board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ')
return board[1][1];
// 判断平局
if (1==IsFull(board, ROW, COL))
{
return 'q';
}
// 继续游戏
return 'c';
}
// 游戏运行函数
void gameZone(){
int ret=0; // 输赢参数
char board[ROW][COL]={0};
// 初始化棋盘函数
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;
sleep(1);
// 电脑行动
computerMove(board, ROW, COL);
displayBoard(board, ROW, COL);
ret = Iswin(board, ROW, COL);
if (ret != 'c')
break;
}
if (ret == '*')
printf("[玩家胜利]\n\n");
else if (ret == '#')
printf("[电脑胜利]\n\n");
else if (ret == 'q')
printf("[双方平局]\n\n");
sleep(1);
}
// 开始界面
void startMenu(){
printf("[井字棋游戏]\n");
printf("[1.开始游戏]\n");
printf("[0.退出游戏]\n");
}
// 主函数
int main(){
int select=0;
// 利用时间戳设置随机种子
srand((unsigned int)time(NULL));
do
{
startMenu();
printf("[请选择:]");
select=scanf("%d", &select);
switch (select)
{
case 1:
{
gameZone();
break;
}
default:
{
printf("[输入错误]\n");
break;
}
}
} while (select);
return 0;
}
Windows系统需将<unistd.h>改为<windows.h>
同时sleep(1)改为Sleep(1000)