c语言入门——三子棋(N子棋)
目录
前言
一.什么是三子棋?
二.三子棋(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子棋)相关推荐
- 手把手教你如何写一个三子棋/N子棋的小游戏
这里写目录标题 第一步 游戏进入界面 第二步,初始化棋盘 第三步,打印棋盘 第四步,玩家和电脑下棋 第五步,判断输赢 三子棋或者N子棋怎么写? 让我们先来玩一把.再来看看怎么写. 程序运行界面 1为玩 ...
- 小游戏--三子棋——N子棋(实现)
三子棋大家应该都不陌生吧 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等. 我们今天来一个c语言三子棋的进阶,n子棋的实现过程 1.我们首先可以创建一个三子棋.c源文件,从main ...
- C语言实战项目1——三子棋(可转变为N子棋)
文章目录 前言 一.三子棋实现步骤 1.什么是三子棋? 2.C语言实现逻辑 3.函数实现 二.源代码 1.头文件 2.函数实现 3.主函数 总结 前言 学习就是一个总结以及融汇贯通的的过程,适当的对知 ...
- c语言实现三子棋(井子棋)
目录 前言 一.初步构思 二.实现步骤 1.text.c 2.game.c 3.game.h 总结 前言 通过对c语言的初步学习,我们可以用循环,数组,函数的相关知识写一个简单的游戏.增强自信心的同时 ...
- C语言三子棋,五子棋,n子棋的代码实现
C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...
- C语言实现三子棋游戏—可扩展到任意N子棋
C语言实现三子棋 游戏介绍 游戏编程思路 游戏代码详解 主函数 游戏菜单函数 游戏逻辑函数 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 完整代码 test.c game_chess.c gam ...
- 三子棋(N子棋)游戏的保姆级超详细教程(C语言)
写在前面(前言) 1. 何为三子棋: 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等.游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而 ...
- 使用C语言编写三子棋小游戏
使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...
- C语言--实现(三)井子棋小游戏(基础版)
相信大家在生活中肯定知道和了解五子棋的玩法,三子棋的玩法和五子棋一样,当有三个一样的"棋子"连成一条线,不管是横竖斜,谁先完成这个条件,谁就获胜. 那大家有没有想过用编码的形式怎么 ...
最新文章
- 产品经理岗位职责说明_技术负责人岗位职责,五大方面,超越岗位抓住未来才是技术大牛...
- 读取Cert格式证书的密钥
- OS_FLAG.C(3)
- 【阿里妈妈营销科学系列】开篇:C.M.O——“人群.渠道.机会”营销分析导论
- 51单片机程序下载、ISP及串口基础知识
- 【例题+习题】【数值计算方法复习】【湘潭大学】(五)
- java 析构函数_《JAVA编程思想》5分钟速成:第5章(初始化和清理)
- 基于JAVA+Swing+MYSQL的汽车租赁系统
- 神策数据:打造趁手好用的标签用户画像系统(附PPT下载链接)
- java 钩子 64位 操作系统_Java与系统钩子
- CSDN发布:AI技术人才成长路线图
- c语言倒序输出单词_英语句子按单词倒序输出C语言版
- Github上关于iOS的各种开源项目集合
- java初级程序员学习思路
- 找到解决办法了,特回来写总结,the import cannot be resolved问题可以通过以下方法解决
- java计算机毕业设计企业员工考勤系统的设计与实现源代码+数据库+系统+lw文档
- HDMI接口之HPD(热拔插)
- elementUI设置标签页
- android 开发sdk 找不到java类_开发Cordova插件(Android)时找不到源Java类
- 最优潮流 OPF 算例资源网站