用c语言来实现三子棋和五子棋
//写出整个程序的大概个构造
//创建一个二维数组来表示棋盘
//因为棋盘是一个全局变量,所以我们在其前面加上g_,表示这个变量是全局变量
//因为此处创建数组的时候创建了一个3*3的二维数组,在之后进行修改时会比较麻烦
//所以我们用宏定义两个常量来表示数组的大小
//之后进行修改时对宏进行修改即可
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//注意此处宏表示时,后面是不加冒号的
#define ROW 3
#define COL 3
//1.打印一个二维数组表示棋盘
char g_chess_board[ROW][COL];
void Init()
{
//2.需要对棋盘进行一次初始化,先默认的让棋盘的内容都为空格
//此处有一个改变vs中变量的技巧,当我们在变量上按住shift+alt+r
//就可以将变量名改为你想要的名字
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL ; j++)
{
//将变量初始化为空格
g_chess_board[i][j] = ’ ';
}
}
}
void Print()
{
//此处调用一个print函数来打印棋盘
//一行一行的打印
for (int i = 0; i < ROW; i++)
{
printf("| %c | %c | %c |\n", g_chess_board[i][0], g_chess_board[i][1], g_chess_board[i][2]);
if (i != ROW-1)
//上边界和下边界都不进行打印
{
printf("|—|---|—|\n");
}
}
}
int IsFull()
{
for (int row = 0; row < ROW; row++)
{
for (int col = 0; col < COL; row++)
{
return 0;
}
}
return 1;
}
void PlayMove()
{
while (1)
{
printf(“请您输入您要落子的坐标,row,col”);
//玩家落子
//1.让玩家输入相应的落子的坐标
int row = -1;
int col = -1;
scanf("%d %d", &row,&col);
//2.判断输入是否合法,若不合法请玩家重新输入
if (row >= ROW || col >= COL || row < 0 || COL < 0)
{
//a>是否满足棋盘的范围条件
printf(“输入有误!!请重新输入!!\n”);
continue;
}
if (g_chess_board[row][col] != ’ ')
{
printf(“当前位置上已经落子!!请落子其他位置!!\n”);
continue;
//b>落子的位置上是否已经有棋子
}
g_chess_board[row][col] = ‘x’;
break;
//3.落子,在棋盘上玩家指定的坐标位置上显示"x"
}
}
char WhoWin()
{
//判定玩家是否获胜
//使用x表示玩家,使用o表示电脑,当玩家获胜时,返回x,当电脑获胜时返回o
//当和棋时返回q,但胜负未分时返回 空格
for (int row=0; row < ROW; row++)
{
if (g_chess_board[row][0] == g_chess_board[row][1] && g_chess_board[row][0] == g_chess_board[row][2] && g_chess_board[row][0] != ’ ')
{
//1.检查所有的行是否连在一起
//判断所有的行是否连在一起的同时,要判断当所有为空格时是不能判定谁胜利的
//当胜利时,我们返回第一个位置输入的内容就可以了
return g_chess_board[row][0];
}
}
//检查列
for (int col=0; col < COL; col++)
{
if (g_chess_board[0][col] == g_chess_board[1][col] && g_chess_board[0][col] == g_chess_board[2][col] && g_chess_board[0][col] != ’ ‘)
{
return g_chess_board[0][col];
}
}
//检查对角线
if (g_chess_board[0][0] == g_chess_board[1][1] && g_chess_board[0][0] == g_chess_board[2][2]&&g_chess_board[0][0]!=0)
{
return g_chess_board[0][0];
}
if (g_chess_board[2][0] == g_chess_board[1][1] && g_chess_board[2][0] == g_chess_board[0][2]&&g_chess_board[2][0]!=0)
{
return g_chess_board[2][0];
}
//检查是否和棋
//此处调用一下IsFull函数来判断是否和棋
if (IsFull())
{
//判断是否为和棋
//当为和棋的时候,返回’q’
return ‘q’;
}
//当胜负未分时,返回空格
return ’ ';
}
void CompMove()
{
//5.电脑进行落子
//这个电脑的难度不是一般的底,能不能赢完全随缘
//我们产生一个随机数,然后判定一下能否放入
printf(“电脑要开始落子了!!!\n”);
int row = 0;
int col = 0;
while (1)
{
//用rand()函数来产生随机数
//用ROW和COL来给它取余,则它的范围为[0,2]
row = rand() % ROW;
col = rand() % COL;
if (g_chess_board[row][col] == ’ ‘)
{
//判断是否空格,当为空格时赋值为’o’
g_chess_board[row][col] = ‘o’;
break;
}
else
{
continue;
}
}
}
int main()
{
char winner = ’ ';
//此处调用一个init()函数对棋盘进行一次初始化
Init();
//3.先打印一个棋盘
while (1)
{
Print();
//调用一下PlayerMove()函数,来让玩家进行下棋
PlayMove();
//调用一下WhoWin函数,来判断玩家是否获胜
winner = WhoWin();
if (winner != ’ ')
{
//有三种情况,游戏是结束的,和棋.玩家胜利,或者电脑胜利
//当不满足这三种情况时,游戏是继续的
break;
}
//5.计算机再进行落子,判断计算机是否获胜
winner = WhoWin();
if (winner != ' ')
{
//有三种情况,游戏是结束的,和棋.玩家胜利,或者电脑胜利
//当不满足这三种情况时,游戏是继续的
break;
}
}
if (winner == 'x')
{
printf("玩家获胜!!\n");
}
else if (winner == 'o')
{
printf("电脑获胜\n");
}
else if (winner == 'q')
{
printf("和棋\n");
}
//若无法判定两者谁取胜,就回到第三步,再次打印棋盘
system("pause");
return 0;
}