我先说一下,之所以说一学就会是因为想法很简单,只要你会写三子棋,我这个五子棋你就一定会写!因为我这个五子棋是按照我写三子棋的模板复刻的,到最后我会总结我是怎么复刻的!

        能力有限,做的不是很好,如果有什么地方可以优化可以告诉我,感谢你们~!

        重要的地方我会仔细讲解,有的一看就会的地方我就用几句话描述了,而且代码里也有我写的标识,很容易看懂的!!!

         好!!!现在开始教学!!!


首先我们要先写出主函数,将整个轮廓描绘出来,再用函数方式对其填写。

int main()
{int input = 0;srand((unsigned int)time(NULL));//设置随机生成数do{menu();//菜单printf("请输入:>");scanf("%d", &input);switch (input){case 1:game();//游戏break;case 0:printf("已成功退出!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);return 0;
}

然后将菜单写出来

void menu()
{printf("\n");printf("**********   菜单  *************\n");printf("********************************\n");printf("******   1.play  0.exit   ******\n");printf("********************************\n");printf("\n");
}

我先把所有头函数给你们列出来,这下看下面的就一目了然了~

 这里的定义的ROW和COL是棋盘是几行几列,看你们的需求可以随意改变。

        当然我还要说一下,这里我设计的是玩家和电脑下棋,这里如果把电脑下棋的那一步换为玩家下棋你们就可以和自己的好朋友一起玩耍了,当然有人可能会说,有现成的为什么要玩自己写的,那就大漏特漏了!!!

        当你写出来后你玩着都开心,自己写的代码,那能不开心么,我下面自己设置的棋盘不是很好看,你如果用心,可以把棋盘设置的超级好看,那不比玩现成的要香么!!!

        那么接下来我们就要开始了!!!

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 15//行
#define COL 15//列void Init_Board(char board[ROW][COL], int row, int col);//初始化棋盘void Display_Board(char board[ROW][COL], int row, int col);//打印棋盘//下棋
void Player_Move(char board[ROW][COL], int row, int col);//玩家下void Computer_Move(char boar[ROW][COL], int row, int col);//电脑下int Is_Win(char board[ROW][COL], int row, int col);//是否赢

接下来该步入正题了!!!

        首先我们要先用数组对棋盘进行初始化,

        然后打印棋盘,

        然后再循环跟电脑下棋,而且每次下完棋后要再次打印棋盘,这样才叫下棋嘛~

        在下棋的过程中进行对对局的判断输赢。

        (写完这里大概轮廓就已经出来了!接下来该对其进行“填色”啦!)

void game()
{int ret = 0;char board[ROW][COL] = { 0 };//初始化棋盘Init_Board(board, ROW, COL);//打印棋盘Display_Board(board, ROW, COL);//下棋while (1){Player_Move(board, ROW, COL);ret = Is_Win(board, ROW, COL);if (ret != 'C'){break;}Display_Board(board, ROW, COL);Computer_Move(board, ROW, COL);ret = Is_Win(board, ROW, COL);if (ret != 'C'){break;}Display_Board(board, ROW, COL);}//判断if (ret == '*'){printf("\n");printf("玩家胜利!\n");}else if (ret == '#'){printf("\n");printf("电脑胜利!\n");}else{printf("\n");printf("平局!\n");}Display_Board(board, ROW, COL);
}

      


        这里就是对棋盘进行初始化了,因为开始的棋盘是空的,所以可以将棋盘都初始化为“空格”,这样看着棋盘就是空空的啦!

void Init_Board(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < ROW; i++){int j = 0;for (j = 0; j < COL; j++){board[i][j] = ' ';}}
}

 这里要打印棋盘的样子还要打印每行每列对应的数字,

        首先我先用三子棋的棋盘分析一下如何打印棋盘,五子棋的棋盘只不过是下图所示多打印几行罢了~!

这就是我设计的棋盘,有点简陋,如果你想设计的好看,自己可以重新设置哦~!

void Display_Board(char board[ROW][COL], int row, int col)
{int i = 0;//给棋盘每一列填写数字到下面为止!!!if (ROW >= 10){for (i = 1; i < 10; i++){printf("  %d ", i);}for (i = 10; i <= ROW; i++){printf(" %d ", i);}printf("\n");}else{for (i = 1; i < ROW; i++){printf("  %d ", i);}printf("\n");}//从上面开始到这里将每一列的数字填写完毕!!!for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" ---");}printf("\n");for (j = 0; j < col; j++){printf("| %c ", board[i][j]);}if (j == col)printf("| %d", i + 1);//打印每一行的数字printf("\n");}if (i == row){int x = 0;for (x = 0; x < row; x++){printf(" ---");}}printf("\n");}

这里就是写玩家下棋和电脑下棋的过程了,玩家和电脑下棋的时候,肯定是在不是空格的地方下棋,要是这地方有自己的棋,再下一遍那不是比电脑少下一步么,要是下的电脑上面把电脑的棋覆盖了,那不是耍赖嘛。

        所以我们再下之前要对那个位置进行判断是不是空格!

        当然电脑下棋的时候就是随机下棋了,找一个空着的地方就可以下(如果你有时间可以对电脑进行优化哦~让他思想,我之所以没写绝对不是因为我想赢电脑,绝对不是!

        (下面感觉有点难度的代码我写上解释了,保证每个人都可以看懂!)

void Player_Move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && y >= 1 && x <= ROW && y <= COL){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("坐标已被占用,不能下棋,请下在其他位置\n");}}else{printf("坐标非法,请重新输入\n");}}
}void Computer_Move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("电脑下棋:>\n");while (1){x = rand() % ROW + 1;//随机生成坐标,因为%棋盘的行列数得到的是比行列数少1;y = rand() % COL + 1;//所以加1就是让它和棋盘的行列数相同了;if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '#';break;}}
}

接下来就是在下的过程中判断输赢或者平局了

        平局好说,先说平局吧,当棋盘上没有位置下棋了,而你们也没有五个子连在一起,那么肯定就是平局啦~!

        然后就是判断输赢,我这里完全按照三子棋判断输赢的方法写的!可能你看着很多,但是你仔细看是不是写起来很简单很简单,就只是代码看着多仅此而已!!!

        判断输赢就是一行五个连续的在一起,或者一列五个连续的在一起,或者从左上到右下五个连在一起,或者右上到左下连在一起,就这么四种情况!!!

        如果有五个相同的就返回判断的那个点就行,返回去就是下棋用的符号,到时候只要判断返回去的是玩家的符号还是电脑的符号就可以判断输赢了~

        这里重要的就是那个推移,其实就是先判断5×5时赢的情况,根据自己用ROW和COL设置的行列进行推移就可以了,

        我就用一行五子举例子,比方说:你下的是(1,1)(1,2)(1,3)(1,4)(1,5)这样已经算赢了吧,然后+1推移后得到(1,2)(1,3)(1,4)(1,5)(1,6),以此类推,这就是这个五子棋唯一有点难的点,但是其实还是很好想到的,就是运行起来复杂,每次下完棋判断的时候要这样判断很多很多次,这也是我的方法不好的地方,如果你们在写的时候发现好的方法一定要告诉我!!!

        最后就是如果有人赢的话就返回玩家或者电脑的棋子,如果平局就返回‘D’(draw),如果没人赢也没平局,那么就继续,返回‘C’(continue)。

int Is_Full(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){if (board[i][j] == ' ')//有位置{return 0;}}}return 1;//没位置
}int Is_Win(char board[ROW][COL], int row, int col)
{int R = 0;//行推移int C = 0;//列推移//int RC = 0;//行列一起推移//行是否 有三子int i = 0;for (i = 0; i < ROW; i++){for (R = 0; R < ROW - 2; R++)//推移{if (board[i][R] == board[i][R + 1] &&board[i][R] == board[i][R + 2] &&board[i][R] == board[i][R + 3] &&board[i][R] == board[i][R + 4] &&board[i][R] != ' '){return board[i][R];}}}//列是否 有三子int j = 0;for (j = 0; j < COL; j++){for (C = 0; C < COL - 2; C++)//推移{if (board[C][j] == board[C + 1][j] && board[C][j] == board[C + 2][j] && board[C][j] == board[C + 3][j] &&board[C][j] == board[C + 4][j] &&board[C][j] != ' '){return board[C][j];}}}//俩对角是否 有三子for (C = 0, R = 0; C < COL - 2; C++, R++){if (board[R][C] == board[R + 1][C + 1] && board[R][C] == board[R + 2][C + 2] &&board[R][C] == board[R + 3][C + 3] &&board[R][C] == board[R + 4][C + 4] &&board[R][C] != ' '){return board[R][C];}if (board[R][C + 4] == board[R + 1][C + 3] &&board[R][C + 4] == board[R + 2][C + 2] &&board[R][C + 4] == board[R + 3][C + 1] &&board[R][C + 4] == board[R + 4][C] &&board[R][C + 4] != ' '){return board[R][C + 4];}}if (Is_Full(board, row, col)){return 'D';}return 'C';
}

  如果你看到这里,说明你已经会了我这个愚笨但是简单的五子棋了,

        还记不记得我要总结我是怎么复刻的,其实你现在已经知道是怎么复刻的了,就是打印行列图形的时候用for循环带上ROW和COL就可以在你改ROW和COL的时候,打印的图形就跟着改变,还有就是判断输赢的时候用我上面说的推移的方法,本来三子棋不需要推移,因为它很简易,但是五子棋的话就要棋盘大点,所以同样用到ROW和COL。
        这样就是我说的复刻啦,很简单吧。

        创作不易,如果看懂了蛮烦您发财的小手点个赞吧,这样我就更有动力出其他的详细解析了!!!谢谢你们~!

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

  1. C语言编写扫雷游戏【W5+字详细教学版,包教包会】

    目录 前言 一.扫雷游戏 二.整体分析 三.游戏的实现 1.实现test文件 2.实现game.h文件 3.实现game.c文件 3.1 初始化棋盘 3.2 打印棋盘 3.3 埋放地雷 3.4 判断行 ...

  2. c语言编写五子棋报告,c语言报告五子棋.pdf

    C 语言课程设计报告 c 题目: 简单的 五子棋 设计者: 方阳 专业班级: 软件工程1303班 学号: 311309060324 指导老师: 刘洁 所属系部: 计算机学院 2014年6月25 日 河 ...

  3. 二叉树的非递归遍历算法C语言实现(详细注释版)

    二叉树的非递归算法遍历分为:先序遍历,中序遍历,后序遍历. 此文章我会根据先.中.后的顺序为大家用C语言实现全部代码. 顾名思义先序遍历是先遍历根节点,随后是左孩子,右孩子 . 中序遍历与后序遍历可以 ...

  4. C语言实现通讯录详细教学

    作者:~小明学编程~ 文章专栏:C语言练习题 目之所及皆为回忆,心之所向皆为过往 目录 前言 contact.h text.c contact.c 初始化函数 增加成员函数 删除成员函数 Find函数 ...

  5. 线性表之顺序表基本操作(C语言实现,详细注释版)

    有不懂的可以问我,把自己练习编写的代码在这里和大家分享下.如有错误欢迎指正. 编写不易,喜欢的话,点个赞吧

  6. python语言编写五子棋小游戏

    摘要 这是我基于pygame库做个一个五子棋小游戏,通过上网学习pygame库内的具体函数,以及一些前辈的指导.在这里我们需要绘画棋盘,棋子.棋盘直接调用pygame库中的draw.lines()函数 ...

  7. c语言编写五子棋小游戏ppt,C语言实现简单五子棋小游戏

    五子棋简单功能实现,供大家参考,具体内容如下 游戏功能演示 代码如下: #include #include #include #include // 棋盘 char board[15][15]; // ...

  8. 五子棋 (用C语言编写五子棋游戏)

    game.h 文件 #ifndef __GAME_H__ #define __GAME_H__enum OPTION {EXIT,PLAY };#include <stdio.h> #in ...

  9. C语言编写五子棋小游戏

    7月14日学习记录 运行结果 代码展示:main.c //include #include <stdio.h> #include<conio.h>//#define #defi ...

最新文章

  1. TensorFlow Frontend前端
  2. 人群密度估计--CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes
  3. GPT-3没有亲自上手,不如展望一下GPT-4?
  4. Select和SelectMany之间的区别
  5. MyDAL - .IsExistAsync() 使用
  6. iphone字体_iOS 13终于能换花式字体了?!发在朋友圈里真的超好看!
  7. boost::units模块实现异构单元片段
  8. C++宏定义中#与##的妙用
  9. acwing 3 完全背包
  10. java ora 00911_ORA-00911错误
  11. 三大高通量测序平台芯片通量对比图(请把手机横过来看))
  12. Spring Boot + Security + Thymeleaf + Activiti 快速开发平台项目
  13. 20191007:选择排序,插入排序,冒泡排序详解
  14. 《C++程序设计语言(特别版)》——忠告
  15. IDEA系列(六)一This file is indented with tabs instead of 4 space
  16. 请教高手,如何取得Target属性
  17. C语言main函数带参数在VC6下的调试方法
  18. 一个封锁操作被对 wsacancelblockingcall 的调用中断_备战秋招——操作系统(3)
  19. python爬取豆瓣电影并分析_Python爬虫入门 | 2 爬取豆瓣电影信息
  20. Java - Object wait() 方法之虚假唤醒spurious wakeup

热门文章

  1. GitHub开源:升讯威 SQLite 增强组件 Sheng.SQLite.Plus
  2. 写给人类的机器学习 2.1 监督学习
  3. 区块链的未来和哲学:代币经济、互联网经济与传统经济辨析
  4. Docker 安装及配置阿里云镜像源(详细过程)
  5. 关于最新劳动法的一些解读
  6. TP4056电池(BAT)引脚输出高电平
  7. 功率MOS管烧毁的原因(米勒效应)
  8. echarts企业地区大数据图表模板代码
  9. python之元编程
  10. 苹果CEO史蒂夫·乔布斯在斯坦福演讲(一)