将整个代码分装在三个文件中,分别为源文件:test.c game.c game.h 。
代码如下:
game.h
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3
#define COL 3//定义棋盘行数和列数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void Menu();//用来打印菜单
void Game();//游戏的主体函数
int Win(char chess[ROW][COL]);//判断游戏的赢家
int Go_on(char chess[ROW][COL]);//判断游戏是否应该继续
void Print(char chess[ROW][COL]);//打印棋盘
void Init(char chess[ROW][COL], int row, int col);//初始化棋盘
#endif//game.h
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init(char chess[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
chess[i][j] = ' ';//将定义好的棋盘数组每一个元素都初始化为字符空格
}
}
}
void Print(char chess[ROW][COL])
{//打印棋盘
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
printf(" %c ",chess[i][j]);
if (j != COL-1)
{
printf("|");
}
}
printf("\n");
if (i != ROW - 1)
{
for (k = 0; k < COL; k++)
{
printf("---");
if (k != COL - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
int Go_on(char chess[ROW][COL])
{//判断棋盘是否被充满,对比棋盘上的每一个元素,如果出现空格就返回1,没有出现空格就返回0
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (chess[i][j]==' ')
{
return 1;
}
}
}
return 0;
}
int Win(char chess[ROW][COL])//判断是否有获胜的一方,玩家获胜返回字符0,电脑获胜返回字符X
{
int i = 0;
int ret = 0;
for (i = 0; i < ROW; i++)
{
if (chess[i][0] == chess[i][1]
&& chess[i][1] == chess[i][2]
&& chess[i][0] != ' ')
{
return chess[i][0];
}
}
for (i = 0; i < COL; i++)
{
if (chess[0][i] == chess[1][i]
&& chess[1][i] == chess[2][i]
&& chess[0][i] != ' ')
{
return chess[0][i];
}
}
if (chess[0][0] == chess[1][1]
&& chess[1][1] == chess[2][2]
&& chess[0][0] != ' ')
{
return chess[0][0];
}
if (chess[0][2] == chess[1][1]
&& chess[1][1] == chess[2][0]
&& chess[0][2] != ' ')
{
return chess[0][2];
}
ret=Go_on(chess);//由于会有平局的情况出现,所以这里要判断棋盘是否已被充满,充满时返回字符q,也就是平局的情况出现
if (1 == ret)//ret=1时表示棋盘没有被充满,所以玩家和电脑就可以继续游戏
{
;
}
else
{
return 'q';
}
}
void Game()
{
int i = 0;
int row = 0;
int col = 0;
int row_cmp = 0;
int col_cmp = 0;
char winer = 0;
srand((unsigned int)time(NULL));//设置随机数种子
char chess[ROW][COL] = { 0 };//定义棋盘数组
Init(chess, ROW, COL);
Print(chess);//打印一次棋盘
while (Go_on(chess))//当棋盘没有被充满时,Go_on(chess)返回值为1,即循环可以进行,棋盘充满后返回值为0,就会跳出循环了
{
printf("玩家走:");
scanf("%d %d", &row, &col);
while (chess[row][col] != ' ')//当玩家输入的坐标位置为空格时,这是一次合法输入,否则玩家需要重新输入
{
printf("位置已经被占用,请重新选择:");
scanf("%d %d", &row, &col);
}
chess[row][col] = '0';//将玩家输入的合法位置改为字符0,也就是玩家的棋子
Print(chess);//每输入一次就打印一次更新后的棋盘
winer = Win(chess);//每次输入之后就判断一次是否有赢家或者平局的情况出现
if (winer == 'X')
{
printf("电脑赢\n");
break;
}
else if (winer == '0')
{
printf("玩家赢\n");
break;
}
else if (winer == 'q')
{
printf("平局\n");
break;
}
printf("电脑走:");
do
{
row_cmp = rand() % ROW;
col_cmp = rand() % COL;
} while (chess[row_cmp][col_cmp]!=' ');//分别随机生成0到2的随机数,当生成的位置在棋盘上为空格时,跳出此循环
chess[row_cmp][col_cmp] = 'X';//将电脑生成的随机合法位置改为字符X
printf("\n");
Print(chess);//再打印一次棋盘
winer=Win(chess);//再判断是否有赢家出现
if (winer == 'X')
{
printf("`电脑赢\n");
break;
}
else if (winer == '0')
{
printf("玩家赢\n");
break;
}
else if (winer == 'q')
{
printf("平局\n");
break;
}
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"//将所有使用的头文件都写进game.h中,所以这里只需要引用game.h就ok了
void Menu()
{
printf("*****************************************************\n");
printf("******** 1.play 0. exit ********\n");
printf("*****************************************************\n");
printf("请选择:");
}
int main()//函数从此处进入
{
while (1)//将函数总体写成一个死循环,只有当玩家在开始游戏或结束一次游戏后选择0(退出游戏)时程序才会结束运行
{
Menu();
int i = 0;
scanf("%d", &i);
switch (i)
{
case 0:printf("退出游戏\n");
system("pause");
return 0;
break;
case 1:printf("开始游戏\n");
Game();
break;
default:printf("非法选择,请重新开始\n");
break;
}
}
}
以上就是C语言三子棋的所有代码。