(C语言)任意阶的子棋,列如:三子棋,五子棋

(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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NOREAD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值