【C语言】五字棋/三子棋代码(含任意多子)

五子棋 的图像结果

 五子棋代码c语言简单实现

(pvc版和pvp版都有)

人与电脑下,人与人下都实现了

案例演示:

三子棋

 

案例演示:

五子棋

代码展示:

#define _CRT_SECURE_NO_WARNINGS 1

#define X 10 //行
#define Y 15 //列
#define NUM 5//几子赢


//三子棋: X=3 Y=3 NUM=3
//五子棋: X>=10 Y>=10 NUM=5
//多子棋:(N子棋)NUM=N


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void menu();
void startgame();
void gamePvC();
void gamePvP();
void initboard(char board[X][Y]);
void printboard(char board[X][Y]);
void playermove1(char board[X][Y]);
void playermove2(char board[X][Y]);
void PCmove(char board[X][Y]);
char iswin(char board[X][Y], int x, int y);
int Full(char board[X][Y]);

char flag = 'a';

int main()
{
    startgame();
    //将游戏完全封装起来
    //实现一个函数对应一个功能
    return 0; 
}

//菜单栏
void menu()
{
    printf(" ------------------------\n");
    printf("|       0.退出游戏       |\n");
    printf("|     1.PvC人机对局      |\n");
    printf("|     2.PvP双人对局      |\n");
    printf(" ------------------------\n");
}

//游戏开始
void startgame()
{
    int ret = 0;
    do
    {
        menu();
        scanf("%d", &ret);
        switch (ret)
        {
        case 0:
            printf("game over\n");
            break;
        case 1:
            gamePvC();
            break;
        case 2:
            gamePvP();
            break;
        default:
            printf("输入错误,请重新输入!\n");
            break;
        }

    } while (ret);
}

//人机对局游戏
void gamePvC()
{
    char board[X][Y] = { '\0' };
    initboard(board);
    printboard(board);

    while (1)
    {
        playermove1(board);
        if (flag == '*') break;
        if (Full(board) == 1) { flag = '='; break; }

        PCmove(board);
        if (flag == '#') break;
        if (Full(board) == 1) { flag = '='; break; }
    }

    if (flag == '*') printf("玩家胜利\n");
    if (flag == '#') printf("电脑胜利\n");
    if (flag == '=') printf("平局\n");

}

//双人对局游戏
void gamePvP()
{
    char board[X][Y] = { '\0' };
    initboard(board);
    printboard(board);

    while (1)
    {
        playermove1(board);
        if (flag == '*') break;
        if (Full(board) == 1) { flag = '='; break; }

        playermove2(board);
        if (flag == '@') break;
        if (Full(board) == 1) { flag = '='; break; }
    }

    if (flag == '*') printf("玩家1胜利\n");
    if (flag == '@') printf("玩家2胜利\n");
    if (flag == '=') printf("平局\n");

}

//遍历棋盘
void initboard(char board[X][Y])
{
    for (int i = 0; i < X; i++)
    {
        for (int j = 0; j < Y; j++)
        {
            board[i][j] = ' ';
        }
    }
}

//打印棋盘
void printboard(char board[X][Y])
{
    for (int i = 0; i < X; i++)
    {
        if (i == 0)
        {
            printf("    ");
            for (int k = 1; k <= Y; k++)
            {
                printf("%2d列", k);
                if (k == Y)printf("\n    ");
            }
            for (int k = 0; k < Y; k++)
            {
                printf("+---");
                if (k == Y - 1)printf("+\n");
            }
        }

        for (int j = 0; j < Y; j++)
        {
            if (j == 0) printf("%2d行", i + 1);
            printf("|");
            printf(" %c ", board[i][j]);

            if (j == Y - 1)printf("|\n    ");
        }

        for (int k = 0; k < Y; k++)
        {
            printf("+---");
            if (k == Y - 1)printf("+\n");
        }


    }
}

//玩家1下棋 *
void playermove1(char board[X][Y])
{
    while (1)
    {
        int x = 0, y = 0;
        printf("玩家1,(*玩家)请输入行数和列数以此下棋\n");
        scanf("%d %d", &x, &y);
        if (x <= X && x >= 1 && y <= Y && y >= 1 && (board[x - 1][y - 1] == ' '))
        {
            board[x - 1][y - 1] = '*';
            flag = iswin(board, x, y);
            break;
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
    }

}

//玩家2下棋 @
void playermove2(char board[X][Y])
{
    while (1)
    {
        int x = 0, y = 0;
        printf("玩家2,(@玩家)请输入行数和列数以此下棋\n");
        scanf("%d %d", &x, &y);
        if (x <= X && x >= 1 && y <= Y && y >= 1 && (board[x - 1][y - 1] == ' '))
        {
            board[x - 1][y - 1] = '@';
            flag = iswin(board, x, y);
            break;
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
    }

}

//电脑下棋 #
void PCmove(char board[X][Y])
{
    srand((unsigned)time(NULL));
    while (1)
    {
        int x = 0;
        int y = 0;

        x = (rand() % X) + 1;
        y = (rand() % Y) + 1;
        if (board[x - 1][y - 1] == ' ')
        {
            board[x - 1][y - 1] = '#';
            flag = iswin(board, x, y);
            break;
        }
    }
}

//棋盘是否满了
int Full(char board[X][Y])
{
    for (int i = 0; i < X; i++)
    {
        for (int j = 0; j < Y; j++)
        {
            if (board[i][j] == ' ') return 0;
        }
    }
    return 1;
}

//判断胜负
char iswin(char board[X][Y], int x, int y)
{
    int arr[X][Y] = { 0 };
    int way[4] = { 1,1,1,1 };
    char c = board[x - 1][y - 1];
    system("cls");
    printboard(board);
    printf("上一步%c下在了%d行%d列\n", c, x, y);
    //将该种类型棋子变成0 1混合的int类型数组,1表示该种类型的棋子分布
    for (int i = 0; i < X; i++)
    {
        for (int j = 0; j < Y; j++)
        {
            if (board[i][j] == c)
            {
                arr[i][j] = 1;
            }
        }
    }

    //校准行列数
    x--;
    y--;

    for (int i = 1; i < NUM; i++)
        if (x - i >= 0 && arr[x - i][y] == 1) way[0]++;
    for (int i = 1; i < NUM; i++)
        if (x + i < X && arr[x + i][y] == 1) way[0]++;
    for (int i = 1; i < NUM; i++)
        if (y - i >= 0 && arr[x][y - i] == 1) way[1]++;
    for (int i = 1; i < NUM; i++)
        if (y + i < Y && arr[x][y + i] == 1) way[1]++;
    for (int i = 1; i < NUM; i++)
        if (x - i >= 0 && y - i >= 0 && arr[x - i][y - i] == 1) way[2]++;
    for (int i = 1; i < NUM; i++)
        if (x + i < X && y + i < Y && arr[x + i][y + i] == 1) way[2]++;
    for (int i = 1; i < NUM; i++)
        if (x - i >= 0 && y + i < Y && arr[x - i][y + i] == 1) way[3]++;
    for (int i = 1; i < NUM; i++)
        if (x + i < X && y - i >= 0 && arr[x + i][y - i] == 1) way[3]++;

    if (way[0] == NUM) printf(" ↑↓方向有了%d个棋子\n", way[0]);
    if (way[1] == NUM) printf(" ←→方向有了%d个棋子\n", way[1]);
    if (way[2] == NUM) printf(" ↖↘方向有了%d个棋子\n", way[2]);
    if (way[3] == NUM) printf(" ↙↗方向有了%d个棋子\n", way[3]);
    if (way[0] == NUM || way[1] == NUM || way[2] == NUM || way[3] == NUM)
    {
        printf("达成%d子连珠!\n", NUM);
        return board[x][y];
    }

    return 'a';
}

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶孤程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值