C语言+二维数组+非递归实现五子棋游戏(工程完成度:100%)

保姆级教程:魔百盒CM201-2-ZG免拆机刷机,手把手教你用U盘刷入当贝桌面(Hi3798MV300H芯片) 本文提供魔百盒CM201-2-ZG(Hi3798MV300H芯片)免拆机刷机详细教程,通过U盘卡刷方式刷入当贝桌面,解决原系统卡顿、广告多等问题。教程涵盖工具准备、固件选择、刷机步骤及常见问题处理,适合新手操作,无需拆机即可完成刷机。 阅读详情

自己写的一个C语言版五子棋,规则如下:

1、白子为O;

2、黑子为@;

3、白子先手;

4、格子占满时为平局;

5、四个方向上有连续五个子为胜利;

6、如果选择0 3表示选的第1行与第4列;

备注:

1、本程序会持续进行代码与流程的完善;

2、我还写了一个Java版的五子棋:Java语言+二维数组+非递归实现五子棋游戏

废话不多说,直接上代码:

/*
规则:
1、白子为O;
2、黑子为@;
3、白子先手;
4、格子占满时为平局;
5、四个方向上有连续五个子为胜利;
6、如果选择0 3表示选的第1行与第4列;
*/
#include <stdio.h>

#define N 16

//显示五子棋棋盘
void wzq_show(char (*GAME)[N]) {
    printf("五子棋棋盘如下:\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%c ", GAME[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

//初始化五子棋棋盘
void wzq_init(char (*GAME)[N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            GAME[i][j] = '+';
        }
    }
    // memset(GAME,'+',N*N);
}

//游戏是否胜利的运算,一旦有人胜利则返回1
int wzq_play(int a, int b, char (*GAME)[N]) {
    //这个局部count是计算当前棋盘下了多少个棋子
    //备注1:你也可以从外部把外面的那个count传进来并用count+1代替这个局部count及下面的for循环
    //备注2:你也可以在外部搞一个boolean传进来标识当前是哪一方刚下的子来代替这个局部的count及下面的for循环
    int count = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if ('O' == GAME[i][j] || '@' == GAME[i][j]) {
                count++;
            }
        }
    }
    //方向-上的
    for (int j = b - 4; j < b + 4; j++) {
        if (j < 0 || j > N - 1) {
            continue;
        }
        if (0 != count % 2) {
            for (int i = 0; i < 5; i++) {
                if (j + i < 0 || j + i > N - 1) {
                    break;
                }
                if ('@' == GAME[a][j + i] || '+' == GAME[a][j + i]) {
                    break;
                }
                if ('O' == GAME[a][j + i] && 4 == i) {
                    printf("恭喜你,白家-方向上获胜!\n");
                    return 1;
                }
            }
        } else {
            for (int i = 0; i < 5; i++) {
                if (j + i < 0 || j + i > N - 1) {
                    break;
                }
                if ('O' == GAME[a][j + i] || '+' == GAME[a][j + i]) {
                    break;
                }
                if ('@' == GAME[a][j + i] && 4 == i) {
                    printf("恭喜你,黑家-方向上获胜!\n");
                    return 1;
                }
            }
        }
    }

    //方向|上的
    for (int i = a - 4; i < a + 4; i++) {
        if (i < 0 || i > N - 1) {
            continue;
        }
        if (0 != count % 2) {
            for (int j = 0; j < 5; j++) {
                if (i + j < 0 || i + j > N - 1) {
                    break;
                }
                if ('@' == GAME[i + j][b] || '+' == GAME[i + j][b]) {
                    break;
                }
                if ('O' == GAME[i + j][b] && 4 == j) {
                    printf("恭喜你,白家|方向上获胜!\n");
                    return 1;
                }
            }
        } else {
            for (int j = 0; j < 5; j++) {
                if (i + j < 0 || i + j > N - 1) {
                    break;
                }
                if ('O' == GAME[i + j][b] || '+' == GAME[i + j][b]) {
                    break;
                }
                if ('@' == GAME[i + j][b] && 4 == j) {
                    printf("恭喜你,黑家|方向上获胜!\n");
                    return 1;
                }
            }
        }
    }

    //方向\上的
    for (int i = a - 4, j = b - 4; i < a + 4 && j < b + 4; i++, j++) {
        if (i < 0 || i > N - 1 || j < 0 || j > N - 1) {
            continue;
        }
        if (0 != count % 2) {
            for (int k = 0; k < 5; k++) {
                if (i + k < 0 || i + k > N - 1 || j + k < 0 || j + k > N - 1) {
                    break;
                }
                if ('@' == GAME[i + k][j + k] || '+' == GAME[i + k][j + k]) {
                    break;
                }
                if ('O' == GAME[i + k][j + k] && 4 == k) {
                    printf("恭喜你,白家\方向上获胜!\n");
                    return 1;
                }
            }
        } else {
            for (int k = 0; k < 5; k++) {
                if (i + k < 0 || i + k > N - 1 || j + k < 0 || j + k > N - 1) {
                    break;
                }
                if ('O' == GAME[i + k][j + k] || '+' == GAME[i + k][j + k]) {
                    break;
                }
                if ('@' == GAME[i + k][j + k] && 4 == k) {
                    printf("恭喜你,黑家\方向上获胜!\n");
                    return 1;
                }
            }
        }
    }

    //方向/上的
    for (int i = a + 4, j = b - 4; i > a - 4 && j < b + 4; i--, j++) {
        if (i < 0 || i > N - 1 || j < 0 || j > N - 1) {
            continue;
        }
        if (0 != count % 2) {
            for (int k = 0; k < 5; k++) {
                if (i - k < 0 || i - k > N - 1 || j + k < 0 || j + k > N - 1) {
                    break;
                }
                if ('@' == GAME[i - k][j + k] || '+' == GAME[i - k][j + k]) {
                    break;
                }
                if ('O' == GAME[i - k][j + k] && 4 == k) {
                    printf("恭喜你,白家/方向上获胜!\n");
                    return 1;
                }
            }
        } else {
            for (int k = 0; k < 5; k++) {
                if (i - k < 0 || i - k > N - 1 || j + k < 0 || j + k > N - 1) {
                    break;
                }
                if ('O' == GAME[i - k][j + k] || '+' == GAME[i - k][j + k]) {
                    break;
                }
                if ('@' == GAME[i - k][j + k] && 4 == k) {
                    printf("恭喜你,黑家/方向上获胜!\n");
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main() {
    char GAME[N][N] = {0};
    int count = 0;    //轮换落子计算
    int m = 0, n = 0; //白家
    int x = 0, y = 0; //黑家
    int res = 0;
    wzq_init(GAME);
    wzq_show(GAME);
    while (1) {
        //当棋盘格子被下满了时
        if (N * N == count) {
            printf("棋盘已经下满了,平局!\n");
            return 0;
        }
        if (0 == count % 2) {
            printf("请白家落子(例如0 3或1 3):");
            scanf("%d%d", &m, &n);
            while (m < 0 || m > N - 1 || n < 0 || n > N - 1) {
                printf("输入的坐标超出范围,请重新输入:");
                scanf("%d%d", &m, &n);
            }
            while ('+' != GAME[m][n]) {
                printf("此处已经落过子,请重新落子:");
                scanf("%d%d", &m, &n);
            }
            GAME[m][n] = 'O';
            res = wzq_play(m, n, GAME);
            if (1 == res) {
                wzq_show(GAME);
                printf("程序结束\n");
                return 0;
            }
        } else {
            printf("请黑家落子(例如0 3或1 3):");
            scanf("%d%d", &x, &y);
            while (x < 0 || x > N - 1 || y < 0 || y > N - 1) {
                printf("输入的坐标超出范围,请重新输入:");
                scanf("%d%d", &x, &y);
            }
            while ('+' != GAME[x][y]) {
                printf("此处已经落过子,请重新落子:");
                scanf("%d%d", &x, &y);
            }
            GAME[x][y] = '@';
            res = wzq_play(x, y, GAME);
            if (1 == res) {
                wzq_show(GAME);
                printf("程序结束\n");
                return 0;
            }
        }
        count++;
        wzq_show(GAME);
    }
}

苹果笔记本下C环境运行效果: 

在线C编译器Lightly的运行效果:

Java五子棋详细步骤及完整代码 /定义一个变量, 作为当前落子的角色, 1代表黑子, 2代表白子 int role = 1; 阅读详情

相关推荐

【C语言 |五子棋】C语言实现五子棋

用C语言实现五子棋。

YKX0000的博客 9345

C语言实践----五子棋(附源代码及思路讲解)

用C语言设计五子棋小游戏,棋盘符号┌┬┐├┼┤└ ┴ ┘。了解五子棋下棋过程1、在菜单界面选择对战方式、进行上一局或退出游戏2、绘制棋盘、棋子3、执黑子的玩家先落子,然后双方轮流落子4、判断胜负或平局5、退出游戏 ...

weixin_61866141的博客 9万+

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 434

c语言环境下实现五子棋

c语言下实现五子棋

m0_69468924的博客 3650

【NVIDIA Jetson Orin系列 - 安装NVIDIA SDK Manager】

NVIDIA Jetson Orin - 安装NVIDIA SDK Manager

dally2的博客 2691

Matlab实战:手把手教你用Zernike多项式模拟光学像差(附完整代码)

本文详细介绍了如何在Matlab中使用Zernike多项式模拟光学像差,包括基础理论、不同排序系统的实现、完整代码示例以及高级应用技巧。通过Zernike多项式,可以有效地描述和分析光学系统中的波前畸变,适用于望远镜校正、眼科光学等多个领域。

weixin_42523720的博客 161

软件工程第三次作业——最大连续子数组和

软件工程第三次作业——最大连续子数组和 软件工程第三次作业——最大连续子数组和 一.问题及方法: 1.问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a...

weixin_30781631的博客 192

MATLAB App Designer 实现多窗口交互与数据传递实战

本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。

milk5的博客 664

C++实现五子棋(含步骤 结尾附完整代码)

以上就是使用C++实现五子棋游戏的详细代码教程,包括棋盘和游戏界面的创建、棋子的绘制和落子、胜负判断和游戏结束、悔棋和重新开始功能。如果棋盘已经填满,但仍然没有五子连珠,则游戏结束,双方平局。1.1 创建Qt项目,并在主窗口中添加一个QGraphicsView控件,用于显示游戏界面。在游戏中,玩家需要能够通过鼠标点击来落子,并且需要在棋盘上显示出来。如果游戏结束,则弹出游戏结束信息,并重置游戏。首先,我们需要创建一个棋盘和游戏界面,可以使用Qt框架来实现。在游戏中,玩家需要能够进行悔棋和重新开始游戏。

koomxingkong的博客 1万+

软考中级-软件设计师 Python基础

软考中级-软件设计师 Python知识点整理

片言可决讼,半纸能缚龙 3642

基于多头注意力时间卷积网络(MATCN)的虚拟电厂短期功率预测模型

​时空特征解耦​:TCN负责时间模式,注意力捕捉空间关联​动态门控机制​:自适应调整两种特征的融合比例​多尺度感知​:膨胀卷积覆盖5分钟到24小时的时间跨度​轻量化设计​:参数量比传统Transformer减少52%

hasakie的博客 322

C++之简单五子棋的设计思路

在结束了对C++的学习之后,准备自己编制一些简单的练习程序。目前初步设想是编制一个人机对战的简易五子棋软件。 以下为个人设计思考的过程。 首先,进行问题分析与设计。计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。比赛结束后初始化棋盘,询问是否继续比赛或退出。后续可加入复盘、悔棋等功能。整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。 棋盘...

black_kyatu的博客 5524

【深度学习|地学应用】MODIS AOD产品和HYSPLIT模型的局限性和不确定性?

【深度学习|地学应用】MODIS AOD产品和HYSPLIT模型的局限性和不确定性?

985小水博的摸鱼日常 463

C语言实现五子棋小游戏(内附源码)

游戏中有人机,双人两种模式。五子棋作为一个平面游戏,很明显用二维数组来写最合适不过。为了让代码看起来更有条理,我们用三个.c文件,分别是:text.c 用来测试我们的游戏;game.c 游戏功能的实现;is_win.c 判断输赢的版块。另外,还有一个game.h 文件来放我们的函数声明和头文件。

m0_63135219的博客 9992

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c语言编写简易五子棋(附源码)

本人采用c语言编写了一个简单的五子棋小游戏,包括:棋盘初始化、棋盘打印、玩家下棋以及判断胜负,文章末尾附有源码。希望可以帮助到大家,大家也可以对我批评指正

scxzvcxvx的博客 2649

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构设计--五子棋程序对弈

五子棋

m0_72747430的博客 1536

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言编写五子棋小游戏

【代码】C语言编写五子棋小游戏。

qq_57810576的博客 381

链表练习:链表五子棋

链表是数据结构课程一个重要概念,为巩固练习,用链表写一个五子棋游戏。可以有白棋黑棋、可以判断胜负,使用到了C语言的图形库EasyX。

weixin_53952997的博客 3120

C语言编写五子棋(详细教学版,一学就会)

C语言编写五子棋(最详细教学版,一学就会!)

Liyuyue的博客 1万+

C语言实现五子棋小游戏

这里额外定义一个加1的行与列是为了打印棋盘时打印出数字方便玩家输入对应坐标(x,y)。

2403_82671343的博客 2280

用C语言实现简单的五子棋小游戏(附上全代码以及思路讲解)

如果要实现五子棋,首先第一步要写一个菜单,让玩家可供选择,比如:输入’1‘,开始游戏,输入’0’,结束游戏。这就产生一个问题,如果纵坐标有一位数变成两位数之后,数字占用的空间就大了,棋盘就乱了,所以我们不能把纵坐标放在左边,要放到右边。我们可以设置一个变量,让每一个玩家下一次棋,这个变量加一次,等这个变量等于五子棋的行和列的时候,如果没有任何一方胜利,那么就是平局。玩家下棋,首先要判断下的位置是否合法,如果位置不存在,那肯定不行,如果位置存在,那还要判断这个位置是否有棋子,就是是否是空格。

wpzssss的博客 6034

用c语言代码编写的游戏“简易五子棋”

用c语言制作的小游戏,有兴趣的朋友可以试一下哦!

Fzzf的专栏 9万+

【C语言小项目】五子棋游戏

详细介绍了如何使用C语言实现一个简单的五子棋项目,来实现你的第一款五子棋吧!

KevinRay_0854的博客 3308

用c语言实现五子棋游戏

【代码】用c语言实现五子棋游戏。

gointt的博客 398

C语言五子棋源代码

#include "stdio.h" #include "math.h" #include "windows.h" #include "time.h"//使用当前时钟做种子 #define N 15 //定义棋盘大小 1黑2白 #define M N+8 //定义数据棋盘大小 int chess[N][N];//棋盘,用于储存下子位置 int count[M][M...

coca的博客 5万+
上一篇: (讨论)关于const修饰的值不能修改的实践
下一篇: 关于数组与指针的一个面试题
Zwarwolf
博客等级 码龄20年 693粉丝 123原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Zwarwolf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值