用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;}