(C语言)任意阶的子棋,列如:三子棋,五子棋
小编是刚刚学完C,想学以致用,也丰富我们码农枯燥的打代码日常,就自己写了一款简单的子棋游戏,小编知道写的这个游戏还有待升级,只是小编的能力有限,有更好的方法也可以跟小编说说哦。
#include <stdio.h>
#include <stdlib.h>
#include "time.h"
// n子棋
#define N_ROW 3
#define N_COL 3
// 判断棋盘是不是满了
int Full_chess(char Chess[N_ROW][N_COL])
{
for (int i = 0; i < N_ROW; i++)
{
for (int j = 0; j < N_COL; j++)
{
if (Chess[i][j] == ' ')
{
return 1;
}
}
}
printf("棋盘满了\n");
return 0;
}
// 判断输赢
// 有以下三种情况:
int JudgeWinningLos(char Chess[N_ROW][N_COL], char chess)
{
for (int i = 0; i < N_ROW; i++)
{
for (int j = 0; j < N_COL; j++)
{
if (Chess[i][j] == chess)
{
if (i == j) // 情况1:斜对线 /
{
for (int k = 0; k < N_ROW; k++)
{
if (Chess[k][k] == chess)
{
if (k == N_ROW - 1)
{
return 1;
}
}
else
{
break;
}
}
}
else if ((i + j) == N_ROW - 1) // 情况2:反斜杠 “\”
{
for (int k = 0; k < N_ROW; k++)
{
if (Chess[k][N_ROW - k - 1] == chess)
{
if (k == N_ROW - 1)
{
return 1;
}
}
else
{
break;
}
}
}
else // 情况3:行 或 列
{
for (int k = 0; k < N_ROW; k++)
{
if (Chess[i][k] == chess)
{
if (k == N_ROW - 1)
{
return 1;
}
}
else
{
break;
}
}
for (int k = 0; k < N_ROW; k++)
{
if (Chess[k][j] == chess)
{
if (k == N_ROW - 1)
{
return 1;
}
}
else
{
break;
}
}
}
}
}
}
return 0;
}
// 初始化 棋子
void Chess_init(char Chess[N_ROW][N_COL])
{
for (int i = 0; i < N_ROW; i++)
{
for (int j = 0; j < N_COL; j++)
{
Chess[i][j] = ' ';
}
}
}
// 打印棋盘
void Chess_board(char Chess[N_ROW][N_COL])
{
for (int i = 0; i < N_ROW; i++)
{
for (int j = 0; j < N_COL; j++)
{
// Chess[i][j] = ' ';
printf("%c ", Chess[i][j]);
if (j < N_COL - 1)
{
printf("|");
}
}
if (i < N_ROW - 1)
{
printf("\n");
for (int k = 0; k < N_COL; k++)
{
printf("--");
if (k < N_COL - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
// 遍历棋盘
char Traverse_chess(char Chess[N_ROW][N_COL], int n_ROW, int n_COL, char chess)
{
if (Chess[n_ROW][n_COL] != ' ')
{
return 0;
}
else
{
return chess;
}
}
// 获取棋子的位置
void get_chess(char Chess[N_ROW][N_COL])
{
int n_ROW;
int n_COL;
while (1)
{
label:
printf("玩家下子:\n");
labol2:
scanf("%d%d", &n_ROW, &n_COL);
if (!(n_COL >= 1 && n_COL <= N_ROW && n_ROW >= 1 && n_ROW <= N_ROW))
{
printf("输入错误,请重新输入:\n");
goto labol2;
}
n_ROW--;
n_COL--;
char tmp = Traverse_chess(Chess, n_ROW, n_COL, '*'); //
if (tmp != 0)
{
Chess[n_ROW][n_COL] = tmp;
}
else
{
printf("该位置已经被占,请重新下:\n");
goto label;
}
Chess_board(Chess);
int tmp_1 = JudgeWinningLos(Chess, '*');
if (tmp_1 == 1)
{
printf("玩家赢!\n");
break;
}
int ful_1 = Full_chess(Chess);
if (ful_1 == 0)
{
printf("平局!\n");
break;
}
printf("电脑下子:\n");
label1:
srand((int)time(NULL));
int f_row = rand() % N_ROW;
int f_col = rand() % N_ROW;
char tmp1 = Traverse_chess(Chess, f_row, f_col, '#');
if (tmp1 != 0)
{
Chess[f_row][f_col] = tmp1;
}
else
{
goto label1;
}
Chess_board(Chess);
tmp_1 = JudgeWinningLos(Chess, '#');
if (tmp_1 == 1)
{
printf("电脑赢!\n");
break;
}
ful_1 = Full_chess(Chess);
if (ful_1 == 0)
{
printf("平局!\n");
break;
}
}
return;
}
void menu(char Chess[N_ROW][N_COL], int n_ROW, int n_COL)
{
int n;
do
{
printf("##################1.开始游戏##################\n");
printf("##################0.退出游戏##################\n");
scanf("%d", &n);
Chess_init(Chess);
if (n == 1)
{
get_chess(Chess);
}
if (n != 0 && n != 1)
{
printf("输入错误,请重新输入:\n");
}
} while (n);
printf("已退出游戏!\n");
return;
}
// 进入游戏界面
void Chess_come()
{
}
int main()
{
// 存储棋子
char Chess[N_ROW][N_COL] = {0};
menu(Chess, N_ROW, N_COL);
}