棋盘大小和游戏规则
#define ROW 5 //棋盘的行数
#define COL 5 //棋盘的列数
#define NUM 3 //几颗子相连能赢,如NUM为3,则为三指棋
我们把棋盘看成一个二维数组,其中ROW为棋盘的行数,COL为棋盘的列数,它们两个规定了棋盘的大小。
NUM规定了几颗连续的棋子相连能赢,如果NUM为3,则游戏为为三子棋;NUM为5,则游戏为五子棋
初始化棋盘和打印棋盘
//初始化棋盘
void initboard(int board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void printboard(int board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
由于在初始化棋盘时都置为空格,打印出来时无法辨别,所以我们需要打印一些分割线来区别。下图为5*5棋盘
玩家下棋
//玩家下棋
void PlayerMove(int board[][COL], int row, int col)
{
int r = 0, c = 0;
while (1)
{
printf("请输入要下的位置的行和列:");
scanf("%d %d", &r, &c);
if (r <= row && r>0 && c <= col && c>0)
{
if (board[r - 1][c - 1] == ' ')
{
board[r - 1][c - 1] = '*';
break;
}
else
{
printf("该位置已经下过棋了\n");
}
}
else
{
printf("输入错误:\n");
}
}
printboard(board, row, col);
}
玩家下棋就是把二维数组的指定行列元素替换为‘*’就好了,当然,我们要注意我们输入的行列数不能超过棋盘的行列数,和二维数组指定元素没有被占有。
电脑下棋
//电脑下棋
void ConputerMove(int board[][COL], int row, int col)
{
while (1)
{
int r = rand() % row;
int c = rand() % col;
if (board[r][c] == ' ')
{
board[r][c] = '#';
break;
}
}
printboard(board, row, col);
}
因为电脑下棋是随机的,所以我们需要两个随机数在分别取模棋盘行数和列数代表电脑下下棋的坐标。
判断输赢
判断输赢的思想也比较简单,把所有可能赢的结果遍历一遍就好了,如果遍历过程中有出现连续的五颗棋子相同就代表有一方获胜,否则就平局。
//判断输赢:玩家赢返回1,电脑赢返回2,平局返回0
int IsWin(int board[][COL], int row, int col,int num)
{
//count记录玩家每相邻NUM个元素中玩家所下的棋数
//sum 记录玩家每相邻NUM个元素中电脑所下的棋数
int count=0,sum=0;
//横
for (int i = 0; i < row; i++)
{
for (int j = 0; j <= col - num;j++)
{
count=0,sum=0;
for(int k=0;k<num;k++)
{
if (board[i][k + j] == '*')
{
count++;
}
else if (board[i][k + j] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//竖
for (int i = 0; i < row; i++)
{
for (int j = 0; j <= col - num; j++)
{
count = 0, sum = 0;
for (int k = 0; k < num; k++)
{
if (board[k+j][i] == '*')
{
count++;
}
else if (board[k+j][i] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//斜
for (int i = 0; i <= row - num; i++)
{
count = 0, sum = 0;
for (int j = 0; j <= row - num; j++)
{
int count = 0, sum = 0;
for (int k = 0; k < num; k++)
{
if (board[i + k][j + k] == '*')
{
count++;
}
else if (board[i + k][j + k] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//反斜
for (int i = row-num; i <= row; i++)
{
count = 0, sum = 0;
for (int j = 0; j <= row - num; j++)
{
int count = 0, sum = 0;
for (int k = 0; k < num; k++)
{
if (board[i - k][j + k] == '*')
{
count++; }
else if (board[i - k][j + k] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//判断棋盘是否下满
int k = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
k = 1;
}
}
}
if (k == 0)
{
return 0;
}
}
实现结果
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 5 //棋盘的行数
#define COL 5 //棋盘的列数
#define NUM 3 //几颗子相连能赢,如NUM为3,则为三指棋
void menu()
{
printf("**********************\n");
printf("***** 0、退出游戏 ****\n");
printf("***** 1、开始游戏 ****\n");
printf("**********************\n");
}
//初始化棋盘
void initboard(int board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void printboard(int board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
//玩家下棋
void PlayerMove(int board[][COL], int row, int col)
{
int r = 0, c = 0;
while (1)
{
printf("请输入要下的位置的行和列:");
scanf("%d %d", &r, &c);
if (r <= row && r>0 && c <= col && c>0)
{
if (board[r - 1][c - 1] == ' ')
{
board[r - 1][c - 1] = '*';
break;
}
else
{
printf("该位置已经下过棋了\n");
}
}
else
{
printf("输入错误:\n");
}
}
printboard(board, row, col);
}
//电脑下棋
void ConputerMove(int board[][COL], int row, int col)
{
while (1)
{
int r = rand() % row;
int c = rand() % col;
if (board[r][c] == ' ')
{
board[r][c] = '#';
break;
}
}
printboard(board, row, col);
}
//判断输赢:玩家赢返回1,电脑赢返回2,平局返回0
int IsWin(int board[][COL], int row, int col,int num)
{
//count记录玩家每相邻NUM个元素中玩家所下的棋数
//sum 记录玩家每相邻NUM个元素中电脑所下的棋数
int count=0,sum=0;
//横
for (int i = 0; i < row; i++)
{
for (int j = 0; j <= col - num;j++)
{
count=0,sum=0;
for(int k=0;k<num;k++)
{
if (board[i][k + j] == '*')
{
count++;
}
else if (board[i][k + j] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//竖
for (int i = 0; i < row; i++)
{
for (int j = 0; j <= col - num; j++)
{
count = 0, sum = 0;
for (int k = 0; k < num; k++)
{
if (board[k+j][i] == '*')
{
count++;
}
else if (board[k+j][i] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//斜
for (int i = 0; i <= row - num; i++)
{
count = 0, sum = 0;
for (int j = 0; j <= row - num; j++)
{
int count = 0, sum = 0;
for (int k = 0; k < num; k++)
{
if (board[i + k][j + k] == '*')
{
count++;
}
else if (board[i + k][j + k] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//反斜
for (int i = row-num; i <= row; i++)
{
count = 0, sum = 0;
for (int j = 0; j <= row - num; j++)
{
int count = 0, sum = 0;
for (int k = 0; k < num; k++)
{
if (board[i - k][j + k] == '*')
{
count++; }
else if (board[i - k][j + k] == '#')
{
sum++;
}
}
if (count == num)
{
return 1;
}
if (sum == num)
{
return 2;
}
}
}
//判断棋盘是否下满
int k = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
k = 1;
}
}
}
if (k == 0)
{
return 0;
}
}
void game()
{
int board[ROW][COL] = { 0 };
initboard(board, ROW, COL);
printboard(board, ROW, COL);
RAND_MAX;
while (1)
{
printf("玩家下棋:\n");
PlayerMove(board, ROW, COL);
int k = IsWin(board, ROW, COL, NUM);
if (k == 1)
{
printf("玩家赢了\n");
return;
}
else if (k == 0)
{
printf("平局\n");
return;
}
printf("电脑下棋:\n");
ConputerMove(board, ROW, COL);
k = IsWin(board, ROW, COL, NUM);
if (k == 2)
{
printf("电脑赢了\n");
return;
}
else if (k == 0)
{
printf("平局\n");
return;
}
}
}
int main()
{
int input = 0;
do {
menu();
printf("请选择> ");
scanf("%d", &input);
switch (input)
{
case 1:
{
printf("开始游戏\n");
srand((unsigned int)time(NULL));
game();
break;
}
case 0:
{
printf("退出游戏");
break;
}
default:
{
printf("输入错误");
break;
}
}
} while (input);
return 0;
}