N子棋的实现首先要搭好游戏的整个框架:

整个流程:

一、对菜单的掌控:

打印菜单(这里使用的是do-while循环可以保证菜单至少能够打印一次)

具体实现如下:

①选择退出,就直接结束程序

②选择错误,返回循环继续选择

③选择游戏,进入执行游戏的代码块

二、进入游戏

①对长度为N的二维数组进行遍历,并初始化值

②打印棋盘:在这里一行分为两部分,上半部分打印"|",下半部分打印"|---",另外要注意每一行,每一列打印的个数,设置循环条件来进行控制。

实现结果如下:

③玩家下棋----打印下棋后的棋盘----判断输赢

④电脑下棋----打印下棋后的棋盘----判断输赢

电脑下棋我们获取的是随机值,即用时间戳的随机生成电脑下棋的坐标。

以上就是代码的整个框架,具体的实现请看下图的代码

我在这里实现的下棋规则就是:棋盘始终是一个N方阵,如果N大于5,就设置连成5子获得胜利,反之,如果小于5,连成N/2 + 1就可以获得胜利

test.c的代码

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"        //引用自己定义的头文件用""
//游戏的菜单,无论是否执行都要打印一次
void menu() {printf("-------------------------------------\n");printf("-------  1.play       0.exit  -------\n");printf("-------------------------------------\n");
}
void game() {//在头文件中定义棋盘的大小char board[ROW][COL] = {0};//定义一个变量判断来判断游戏是否结束char ret;//初始化棋盘InitBoard(board,ROW,COL);//打印棋盘DisplayBoard(board, ROW, COL);//下棋(循环)while (1) {//玩家先下棋(是对数组的操作) 打印棋盘的样子 判断输赢PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//玩家走一步就打印棋盘的样子ret = IsWin(board,ROW,COL);        //判断游戏是否结束if (ret != 'C') {                //C表示游戏继续,如果不是C的话游戏肯定结束,直接跳出回到36行进行判断游戏的结局break;                        //相反如果游戏没有结束,继续执行,进入电脑下棋环节}//电脑下棋(也是对数组的操作) 打印棋盘 判断输赢ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//电脑走一步就打印走之后棋盘的样子        ret = IsWin(board,ROW, COL);if (ret != 'C') {break;}}if (ret == '*') {printf("玩家胜利\n");}else if (ret == '#') {printf("电脑胜利\n");}else {printf("平局\n");}
}
//游戏最外层的整个框架
void test() {int input = 0;srand((unsigned int)time(NULL));        //采用时间戳生成随机数强制转换为int类型do {menu();printf("请选择:>\n");scanf("%d", &input);switch (input) {case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);
}
int main() {test();return 0;}

game.c的实现(里边存放的是游戏实现的相关功能)

#include"game.h"//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col) {        //形参需要小写int i = 0;int j = 0;for (i = 0; i < row; i++) {                                 //控制行数for (j = 0; j < col; j++) {board[i][j] = ' ';                                    //将棋盘的初始值都赋值为空格}}
}//打印棋盘的样子
void DisplayBoard(char board[ROW][COL], int row, int col) {int i = 0;for (i = 0; i < row + 1; i++) {        //i控制棋盘的行打印int j = 0;for (j = 0; j < col + 1; j++) {//打印第一行上半部分的棋盘printf("|");if (j < col)printf("---");}printf("\n");if (i < row) {for (j = 0; j < col + 1; j++) {//j空置棋盘的列打印//打印第一行下半部分棋盘printf("|");if (j < col)printf(" %c ", board[i][j]);//打印第一行数据}printf("\n");}}
}
//玩家下棋
void PlayerMove(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 <= row && x >= 1 && y >= 1 && y <= col) {if (board[x - 1][y - 1] == ' ') {board[x - 1][y - 1] = '*';break;}else {printf("您输入的坐标以被占用:>\n");}}else {printf("您输入的坐标不合法,请重新输入:>\n");}    }
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("电脑走:>\n");while (1) {x = rand() % row;    //%row就会得到1-row之间的数y = rand() % col;if (board[x][y] == ' ') {board[x][y] = '#';break;}}
}
//判断输赢
char IsWin(char board[ROW][COL], int row, int col) {int i = 0;int j = 0;int count = 0;if (row <= 5) {//判断行for (i = 0; i < row; i++) {count = 0;for (j = 0; j < col - 1; j++) {if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') {count++;if (count == col / 2 + 1) {return board[i][j];}}else {count = 0;}}}//判断列for (i = 0; i < col; i++) {for (j = 0; j < row - 1; j++) {if (board[j][i] == board[j + 1][i] && board[j][i] != ' ') {count++;if (count == col / 2 + 1)return board[j][i];}else {count = 0;}}}//判断正对角线count = 0;for (i = 0; i < row - 1; i++) {if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ') {count++;if (count == col / 2 + 1) {return board[i][i];}}else {count = 0;}}//判断负对角线count = 0;for (i = 0; i < row - 1; i++) {if (board[i][row - 1 - i] == board[i + 1][row - 2 - i] && board[i][row - 1 - i] != ' ') {count++;if (count == col / 2 + 1)return board[i][row - 1 - i];}else {count = 0;}}//判断是否为满count = 0;           //每次判断之前都要给count初值,来保证棋子相连是连续的for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {if (board[i][j] != ' ') {count++;}}}if (count == col * row)return 'Q';elsereturn 'C';}//当row>5的时候,只要玩家或者电脑连成5个棋子就可以获得胜利else {//判断行for (i = 0; i < row; i++) {count = 0;for (j = 0; j < col - 1; j++) {if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') {count++;if (count == 4) {return board[i][j];}}else {count = 0;}}}//判断列for (i = 0; i < col; i++) {for (j = 0; j < row - 1; j++) {if (board[j][i] == board[j + 1][i] && board[j][i] != ' ') {count++;if (count == 4)return board[j][i];}else {count = 0;}}}//判断正对角线count = 0;for (i = 0; i < row - 1; i++) {if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ') {count++;if (count == 4) {return board[i][i];}}else {count = 0;}}//判断负对角线count = 0;for (i = 0; i < row - 1; i++) {if (board[i][row - 1 - i] == board[i + 1][row - 2 - i] && board[i][row - 1 - i] != ' ') {count++;if (count == 4)return board[i][row - 1 - i];}else {count = 0;}}//判断是否为满count = 0;          //每次判断之前都要给count初值,来保证棋子相连是连续的for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {if (board[i][j] != ' ') {count++;}}}if (count == col * row)return 'Q';elsereturn 'C';}
}

最后就是头文件的声明:

#define ROW 5
#define COL ROW
#include<stdio.h>
#include<stdlib.h>
#include<time.h>  //生成随机数使用的时间戳需要的头文件//对数组元素的初始化
void InitBoard(char board[ROW][COL], int row, int col);         //形参需要小写
//对棋盘格式的输出
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
//玩家赢--'*'
//电脑赢--'#'
//平局----'Q'
//继续----'C'
char IsWin(char board[ROW][COL], int row, int col);

整个运行结果:

本人的代码水平有限,如有错误和疑问欢迎广大码农指正、批评,有疑问的话也欢迎留言。

N子棋的实现方法,包括三子棋,五子棋相关推荐

  1. c语言入门——三子棋(N子棋)

    目录 前言 一.什么是三子棋? 二.三子棋(N子棋)设计思路 1.主函数 2.数组的初始化 3.菜单 4.游戏主体 (1).棋盘 (2).下棋 (3).判断胜负 三.最终代码 源文件1 源文件2 头文 ...

  2. 三子棋进阶版(N子棋)

    我们今天要分享的题目是三子棋,相信大家对于三子棋并不陌生 我们在设计三子棋的时候,脑袋一定不要混,不要害怕 做任何题目脑袋里要慢慢形成框架 比如本题:三子棋 游戏开始要有游戏界面,进入游戏界面时候,要 ...

  3. 畅玩三子棋(可选择棋盘大小)

    我们游戏总体的思路如下: 目录 1.游戏总体的逻辑 以及 开始操作:game.c 2.编写游戏中所需要用到的函数:work.c 初始化棋盘 打印并制作棋盘 开始下棋 玩家下棋: 电脑下棋: 如何判断输 ...

  4. 用C语言实现三子棋游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...

  5. 游戏:三子棋【 C语言 】

    三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了. text . ...

  6. 哥们哥们,人机大战晓得吧玩家对战晓得吧,简易三子棋,呕心沥血500行代码手把手带你制作第一个小游戏,可以保存收藏以后接着看哟,最后有源码哦

    目录 前言 一.游戏想要有意思,函数不可少,整活的函数 二.三子棋的游戏界面 三.三子棋的功能步骤分析      1.菜单     2.三子棋实现的总体框架     3.棋盘创建     4.棋盘初始 ...

  7. 用c语言实现小游戏三子棋

    小游戏之三子棋 小游戏之三子棋 三子棋的基本玩法 游戏制作思路 制作步骤 1.菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋 6.判断胜利 完整代码 ​​​​​​​小结 三子棋的基本玩 ...

  8. 【C语言】三子棋(经典解法+一览图)

    文章目录 什么是三子棋? 三子棋需要掌握到C语言的哪个地方? 如何实现三子棋? 1.头文件(函数声明) 2.game.c(函数实现) 3.text.c(三子棋的测试) 三子棋代码的总览思路 三子棋总览 ...

  9. 初识C语言之三子棋游戏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 三子棋游戏的主要介绍 一.编写逻辑思维 二.游戏的初步实现 1.游戏的相关代码 2.游戏的试运行结果 总结 三子棋游戏的初步 ...

最新文章

  1. android中设置控件获得焦点 (转)
  2. iOS网络开发之:NSURLConnection
  3. 下列不是python数据类型的是_Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了...
  4. 卫星图片重建洛杉矶3D模型,效果就像谷歌地球,港中大团队提出CityNeRF
  5. 【机器学习基础】机器学习算法中分类知识总结!
  6. mysql 5.7.17 源码安装_mysql5.7.17源码安装
  7. LeetCode 45. 跳跃游戏 II(贪心/BFS,难)
  8. linux由众多微内核组成,什么是linux
  9. 哈佛成功金句 -25则
  10. 浏览器判断及客户端跳转,绕开微信对某宝限制
  11. Redisson实现分布式锁
  12. 公钥,私钥,数字签名,证书
  13. json接口(使用,以及自定义)
  14. Jmeter(一)-使用http proxy代理录制脚本
  15. php最小二乘法,Python中实现最小二乘法思路及实现代码
  16. C# 二维与三维计算多边形面积的方法
  17. 湖北5G继续加码!今年投资64亿元,新建5G基站5万个
  18. python发送esc_使用win32prin将一行文本发送到Python中的ESC/POS打印机
  19. c语言里的下划线的作用,关于下划线,你应该了解的几个特殊用途
  20. Elasticsearch 入门到精通-Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica

热门文章

  1. 【动态规划 floyd】SPOJ ACPC13
  2. Xilinx FPGA “打一拍”“打两拍”以及IOB含义
  3. 字节跳动2019春招后端开发工程师-笔试题解析
  4. gamemaker: studio html5,HTML5 Game Development with Gamemaker
  5. hecto - 手把手教你写个 文本编辑器
  6. Photo2Cartoon,照片图片批量转漫画
  7. 过滤器实现用户访问记录日志记录
  8. Win10怎么删除快速访问中最近使用文件记录
  9. apache2.2配置https协议(key文件、crt文件、csr文件生成方法)
  10. NGS可变剪切之STAR+rmats软件使用