目录

前言

一.什么是三子棋?

二.三子棋(N子棋)设计思路

1.主函数

2.数组的初始化

3.菜单

4.游戏主体

(1).棋盘

(2).下棋

(3).判断胜负

三.最终代码

源文件1

源文件2

头文件


前言

在了解了二维数组之后,我们便可以完成我们的第二个游戏——三子棋(N子棋)



一.什么是三子棋?

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。



二.三子棋(N子棋)设计思路

1.主函数

设计一切程序的开始,都要确立好主函数。

而N子棋本质上便是一个行为N、列为N的二维函数。

由于二维数组的行和列只能为常量表达式,所以我们选择在头文件中用“#define“”定义全局变量N作为二维数组的行和列。

以下程序的撰写皆以三子棋为例

如此我们便初步得到了一个主函数

int main()
{   char arr[N][N];return 0;
} 

为保证主函数的简便,我们将其他部分打包为自定义函数。


2.数组的初始化

为了使游戏更加整洁,我们选择将数组所有元素初始化为‘ ’

void new(char arr[N][N])
{int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){arr[i][j]=' ';}}
}
int main()
{   char arr[N][N];new(arr);return 0;
} 

3.菜单

首先游戏需要有一个菜单供玩家选择游玩

由于这是一个简单的游戏,所以我们可以设置开始游戏与退出两个选项。

int menu()
{int input=0;printf("1——开始游戏       2——退出\n");printf("请选择=>");scanf("%d",&input);if(input==1){printf("加载中---\n");sleep(1);return 1;}else if(input==2)printf("正在退出\n");elseprintf("输入错误,请重新输入\n");
}

在这里我们自定义了一个具有返回值的函数menu(),而这个返回值将决定游戏的运行

由上述代码可知,当返回值为1时开始游戏

4.游戏主体

首先先将自定义函数game(arr)作为游戏主体放置在主函数中

int main()
{   char arr[N][N];new(arr);if(menu()==1){game(arr);}return 0;
} 

(1).棋盘

在开始下棋之前,我们需要有一个棋盘来让我们更加直观的观看下棋的过程

void list(char arr[N][N])
{int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){if(j<N-1)printf(" %c |",arr[i][j]);else if(j==N-1&&i!=N-1){printf(" %c \n",arr[i][j]);for(j=0;j<N;j++){if(j<N-1)printf("---|");elseprintf("---\n");}}elseprintf(" %c \n",arr[i][j]);}}
}

这样我们便可以得到一个这样的棋盘

随着二维数组的改变,这个棋盘也会不断变化,所以我们需要多次引用这个自定义函数

(2).下棋

首先,我们将我们下一步棋(选用O)与电脑下一步棋(选用X)算作一个整体

我们便可以以这个整体作循环来完成下棋这一过程

a.自己下棋

首先我们先写出一个基础的主体

int x,y;
printf("请输入坐标=>");
scanf("%d%d",&x,&y);
arr[x-1][y-1]='O';

之后我们便可以为此加“亿点点”细节

首先为了避免在已经下过棋子的位置上重复下棋,或者为了避免输入的坐标不合法(超出数组范围),我们都可以使用分支与循环函数。

而为了美观和便利,我们可以选择使用清屏函数——system("cls")和上面讲到的list(arr)函数。

 while(1){   system("cls");list(arr);int x,y;printf("请输入坐标=>");scanf("%d%d",&x,&y);if(x>0&&x<=N&&y>0&&y<=N){if(arr[x-1][y-1]!='O'&&arr[x-1][y-1]!='X'){arr[x-1][y-1]='O';break;}elseprintf("该位置存在棋子,请重新输入\n");}elseprintf("不存在该坐标,请重新输入\n");}

这样我们自己下一步棋的代码便初步完成了。

b.电脑下棋

想要让电脑在任意空位置下棋(在数组中为任意一个为‘ ’的元素赋值为‘X’),我们要运用到之前在猜数字游戏中学习到的随机数。

而想要让随机值在一次游戏中顺序不变,我们选择将srand()函数放置在主函数中。

int main()
{   srand((unsigned int) time(NULL));char arr[N][N];new(arr);if(menu()==1){game(arr);}return 0;
} 
while(1){int a,b;a=rand()%N;//使随机值范围在数组范围之内b=rand()%N;//使随机值范围在数组范围之内if(arr[a][b]!='O'&&arr[a][b]!='X') {printf("电脑思考中---\n");sleep(2);arr[a][b]='X';list(arr);break;}} 

而sleep()函数与list()函数也是让程序更加美观便利。

c.整合

在完成上述两方的下棋后,我们便可以将其整合

while(1){while(1){  system("cls");list(arr);int x,y;printf("请输入坐标=>");scanf("%d%d",&x,&y);if(x>0&&x<=N&&y>0&&y<=N){if(arr[x-1][y-1]!='O'&&arr[x-1][y-1]!='X'){arr[x-1][y-1]='O';count++;break;}elseprintf("该位置存在棋子,请重新输入\n");}elseprintf("不存在该坐标,请重新输入\n");}while(1){int a,b;a=rand()%N;b=rand()%N;if(arr[a][b]!='O'&&arr[a][b]!='X') {printf("电脑思考中---\n");sleep(2);arr[a][b]='X';count++;list(arr);break;}} }

上述代码是自动选择玩家先手,我们也可以通过分支语句来让玩家选择先手情况,这里就不再多做赘述。

(3).判断胜负

当我们完成上述代码后,在一定程度上便可以开始游玩,但我们还需要判断游戏的胜负来终止这一次的游戏。

而这种判断,应该在每一步棋子下完之后就进行一次。

胜负应该如何判断呢?

我们知道,三子棋胜负有三种判断方式——横向连一行、纵向连一列或者对角线连成一排

所以我们要通过三次不同的判断来完成胜负的判断

在这里,我选用的是通过count变量,当一排数组内存在‘O’或‘X’,我们将count “+1”或“-1”,这样当count=3或-3时,便能判断出胜负

int end(char arr[N][N])
{int count_1=0,count_2=0,count_3=0;int i,j;for(i=0;i<N;i++){count_1=0;for(j=0;j<N;j++){ if (arr[i][j]=='O')count_1++;else if(arr[i][j]=='X')count_1--;}if (count_1==N||count_1==-N)break;}int a,b;for(a=0;a<N;a++){count_2=0;for(b=0;b<N;b++){if (arr[b][a]=='O')count_2++;else if(arr[b][a]=='X')count_2--;}if (count_2==N||count_2==-N)break;}int c,d;for(c=0,d=0;c<N&&d<N;c++,d++){if (arr[c][d]=='O')count_3++;else if(arr[c][d]=='X')count_3--;}if((count_1==N||count_2==N)||count_3==N){printf("胜利");return 1;}else if((count_1==-N||count_2==-N)||count_3==-N){printf("失败");return 1; }
}

当然游戏不只是胜负,还存在平局的情况

三子棋平局时便是将棋盘填满

我们选择变量count,在下每一步棋时,我们将count+1,当变量等于9时,若没有判断出胜负,便是平局的情况。

int end(char arr[N][N],int count)
{int count_1=0,count_2=0,count_3=0;int i,j;for(i=0;i<N;i++){count_1=0;for(j=0;j<N;j++){ if (arr[i][j]=='O')count_1++;else if(arr[i][j]=='X')count_1--;}if (count_1==N||count_1==-N)break;}int a,b;for(a=0;a<N;a++){count_2=0;for(b=0;b<N;b++){if (arr[b][a]=='O')count_2++;else if(arr[b][a]=='X')count_2--;}if (count_2==N||count_2==-N)break;}int c,d;for(c=0,d=0;c<N&&d<N;c++,d++){if (arr[c][d]=='O')count_3++;else if(arr[c][d]=='X')count_3--;}if(count<N*N){if((count_1==N||count_2==N)||count_3==N){printf("胜利");return 1;}else if((count_1==-N||count_2==-N)||count_3==-N){printf("失败");return 1; }elsereturn 2; }else{printf("平局");return 1;}
}

这样,我们便可以将这件代码组合在一起,完成程序的设计



三.最终代码

源文件1

#include <stdio.h>
#include"mean.h"
void game(char arr[N][N])
{   int count=0;list(arr);while(1){while(1){   system("cls");list(arr);int x,y;printf("请输入坐标=>");scanf("%d%d",&x,&y);if(x>0&&x<=N&&y>0&&y<=N){if(arr[x-1][y-1]!='O'&&arr[x-1][y-1]!='X'){arr[x-1][y-1]='O';count++;break;}elseprintf("该位置存在棋子,请重新输入\n");}elseprintf("不存在该坐标,请重新输入\n");}int m=0;m=end(arr,count);if(m==1){list(arr);break;}while(1){int a,b;a=rand()%N;b=rand()%N;if(arr[a][b]!='O'&&arr[a][b]!='X') {printf("电脑思考中---\n");sleep(2);arr[a][b]='X';count++;list(arr);break;}} m=end(arr,count);if(m==1){list(arr);break;}}
}int main()
{   srand((unsigned int) time(NULL));char arr[N][N];new(arr);if(menu()==1){game(arr);}return 0;
} 

源文件2

#include<stdio.h>
#include"mean.h"
int menu()
{int input=0;printf("1——开始游戏       2——退出\n");printf("请选择=>");scanf("%d",&input);if(input==1){printf("加载中---\n");sleep(1);return 1;}else if(input==2)printf("正在退出\n");elseprintf("输入错误,请重新输入\n");
}
void list(char arr[N][N])
{int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){if(j<N-1)printf(" %c |",arr[i][j]);else if(j==N-1&&i!=N-1){printf(" %c \n",arr[i][j]);for(j=0;j<N;j++){if(j<N-1)printf("---|");elseprintf("---\n");}}elseprintf(" %c \n",arr[i][j]);}}
}
void new(char arr[N][N])
{int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){arr[i][j]=' ';}}
}
int end(char arr[N][N],int count)
{int count_1=0,count_2=0,count_3=0;int i,j;for(i=0;i<N;i++){count_1=0;for(j=0;j<N;j++){ if (arr[i][j]=='O')count_1++;else if(arr[i][j]=='X')count_1--;}if (count_1==N||count_1==-N)break;}int a,b;for(a=0;a<N;a++){count_2=0;for(b=0;b<N;b++){if (arr[b][a]=='O')count_2++;else if(arr[b][a]=='X')count_2--;}if (count_2==N||count_2==-N)break;}int c,d;for(c=0,d=0;c<N&&d<N;c++,d++){if (arr[c][d]=='O')count_3++;else if(arr[c][d]=='X')count_3--;}if(count<N*N){if((count_1==N||count_2==N)||count_3==N){printf("胜利");return 1;}else if((count_1==-N||count_2==-N)||count_3==-N){printf("失败");return 1; }elsereturn 2; }else{printf("平局");return 1;}
}

头文件

#define N 3
void list(char arr[N][N]);
int menu();
void new(char arr[N][N]);
int end(char arr[N][N],int count);

c语言入门——三子棋(N子棋)相关推荐

  1. 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步,初始化棋盘 第三步,打印棋盘 第四步,玩家和电脑下棋 第五步,判断输赢 三子棋或者N子棋怎么写? 让我们先来玩一把.再来看看怎么写. 程序运行界面 1为玩 ...

  2. 小游戏--三子棋——N子棋(实现)

    三子棋大家应该都不陌生吧 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等. 我们今天来一个c语言三子棋的进阶,n子棋的实现过程 1.我们首先可以创建一个三子棋.c源文件,从main ...

  3. C语言实战项目1——三子棋(可转变为N子棋)

    文章目录 前言 一.三子棋实现步骤 1.什么是三子棋? 2.C语言实现逻辑 3.函数实现 二.源代码 1.头文件 2.函数实现 3.主函数 总结 前言 学习就是一个总结以及融汇贯通的的过程,适当的对知 ...

  4. c语言实现三子棋(井子棋)

    目录 前言 一.初步构思 二.实现步骤 1.text.c 2.game.c 3.game.h 总结 前言 通过对c语言的初步学习,我们可以用循环,数组,函数的相关知识写一个简单的游戏.增强自信心的同时 ...

  5. C语言三子棋,五子棋,n子棋的代码实现

    C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...

  6. C语言实现三子棋游戏—可扩展到任意N子棋

    C语言实现三子棋 游戏介绍 游戏编程思路 游戏代码详解 主函数 游戏菜单函数 游戏逻辑函数 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 完整代码 test.c game_chess.c gam ...

  7. 三子棋(N子棋)游戏的保姆级超详细教程(C语言)

    写在前面(前言) 1. 何为三子棋: 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等.游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而 ...

  8. 使用C语言编写三子棋小游戏

    使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...

  9. C语言--实现(三)井子棋小游戏(基础版)

    相信大家在生活中肯定知道和了解五子棋的玩法,三子棋的玩法和五子棋一样,当有三个一样的"棋子"连成一条线,不管是横竖斜,谁先完成这个条件,谁就获胜. 那大家有没有想过用编码的形式怎么 ...

最新文章

  1. 产品经理岗位职责说明_技术负责人岗位职责,五大方面,超越岗位抓住未来才是技术大牛...
  2. 读取Cert格式证书的密钥
  3. OS_FLAG.C(3)
  4. 【阿里妈妈营销科学系列】开篇:C.M.O——“人群.渠道.机会”营销分析导论
  5. 51单片机程序下载、ISP及串口基础知识
  6. 【例题+习题】【数值计算方法复习】【湘潭大学】(五)
  7. java 析构函数_《JAVA编程思想》5分钟速成:第5章(初始化和清理)
  8. 基于JAVA+Swing+MYSQL的汽车租赁系统
  9. 神策数据:打造趁手好用的标签用户画像系统(附PPT下载链接)
  10. java 钩子 64位 操作系统_Java与系统钩子
  11. CSDN发布:AI技术人才成长路线图
  12. c语言倒序输出单词_英语句子按单词倒序输出C语言版
  13. Github上关于iOS的各种开源项目集合
  14. java初级程序员学习思路
  15. 找到解决办法了,特回来写总结,the import cannot be resolved问题可以通过以下方法解决
  16. java计算机毕业设计企业员工考勤系统的设计与实现源代码+数据库+系统+lw文档
  17. HDMI接口之HPD(热拔插)
  18. elementUI设置标签页
  19. android 开发sdk 找不到java类_开发Cordova插件(Android)时找不到源Java类
  20. 最优潮流 OPF 算例资源网站

热门文章

  1. mysql数据库备份和恢复
  2. Spark——Spark概述
  3. 产品流程规划的8个阶段
  4. java ios 3des_IOS开发入门之iOS 3DES加密 和 java 3DES 解密
  5. java监控cpu绘图,java gateway监控cpu使用率
  6. 国外问卷调查一个月能有多大的收益呢?20w+吗?
  7. Drill 学习笔记之 入门体验
  8. Jetpack学习-5-Navigation简单使用
  9. Linux系统中的mount挂载命令及参数详解
  10. ZYNQ之路--程序固化教程