C语言+二维数组+非递归实现五子棋游戏(代码贴过来后无缩进,尽请谅解,工程完成度:100%)
2015-07-21 16:23
555 查看
规则:
1、白子为O;
2、黑子为@;
3、白子先手;
4、格子占满时为平局;
5、四个方向上有连续五个子为胜利;
6、如果选择0 3表示选的第1行与第4列;
备注:
1、本程序会持续进行代码与流程的完善;
#include <stdio.h>
#define N 16
//显示五子棋棋盘
void wzq_show(char (*GAME)
)
{
int i=0,j=0;
printf("五子棋棋盘如下:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%c ",GAME[i][j]);
}
printf("\n");
}
}
//初始化五子棋棋盘
void wzq_init(char (*GAME)
)
{
int i=0,j=0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
GAME[i][j]='+';
}
}
//memset(GAME,'+',N*N);
}
//游戏是否胜利的运算,一旦有人胜利则返回1
int wzq_play(int a,int b,char (*GAME)
)
{
int i=0,j=0,k=0;
//方向-上的
for(j=b-4;j<b+4;j++)
{
if(j<0 || j>N-1)
{
continue;
}
for(i=0;i<5;i++)
{
if('@'==GAME[a][j+i] ||'+'==GAME[a][j+i])
{
break;
}
if('O'==GAME[a][j+i] &&4==i)
{
printf("\n恭喜你,白家-方向上获胜!\n");
return1;
}
}
}
//方向|上的
for(i=a-4;i<a+4;i++)
{
if(i<0 || i>N-1)
{
continue;
}
for(j=0;j<5;j++)
{
if('@'==GAME[i+j][b] ||'+'==GAME[i+j][b])
{
break;
}
if('O'==GAME[i+j][b] &&4==j)
{
printf("\n恭喜你,白家|方向上获胜!\n");
return1;
}
}
}
//方向\上的
for(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;
}
for(k=0;k<5;k++)
{
if('@'==GAME[i+k][j+k] ||'+'==GAME[i+k][j+k])
{
break;
}
if('O'==GAME[i+k][j+k] &&4==k)
{
printf("\n恭喜你,白家\方向上获胜!\n");
return1;
}
}
}
//方向/上的
for(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;
}
for(k=0;k<5;k++)
{
if('@'==GAME[i-k][j+k] ||'+'==GAME[i-k][j+k])
{
break;
}
if('O'==GAME[i-k][j+k] &&4==k)
{
printf("\n恭喜你,白家/方向上获胜!\n");
return1;
}
}
}
return0;
}
int main()
{
char GAME
={0};
int count=0;//轮换落子计算
int m=0,n=0;//白家
int x=0,y=0;//黑家
int res=0;
int k=0;
wzq_init(GAME);
wzq_show(GAME);
while(1)
{
//当棋盘格子被下满了时
if(N*N==count)
{
printf("棋盘已经下满了,平局!\n");
return0;
}
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]
)
{
printf("此处已经落过子,请重新落子:");
scanf("%d%d",&m,&n);
}
GAME[m]
='O';
res=wzq_play(m,n,GAME);
if(1==res)
{
wzq_show(GAME);
printf("程序结束\n");
return0;
}
}else
{
printf("请黑家落子(例如0 3或1
3):");
scanf("%d%d",&x,&y);
while(m<0 || m>N-1 || n<0
|| n>N-1)
{
printf("输入的坐标超出范围,请重新输入:");
scanf("%d%d",&m,&n);
}
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");
return0;
}
}
count++;
wzq_show(GAME);
}
}
1、白子为O;
2、黑子为@;
3、白子先手;
4、格子占满时为平局;
5、四个方向上有连续五个子为胜利;
6、如果选择0 3表示选的第1行与第4列;
备注:
1、本程序会持续进行代码与流程的完善;
#include <stdio.h>
#define N 16
//显示五子棋棋盘
void wzq_show(char (*GAME)
)
{
int i=0,j=0;
printf("五子棋棋盘如下:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%c ",GAME[i][j]);
}
printf("\n");
}
}
//初始化五子棋棋盘
void wzq_init(char (*GAME)
)
{
int i=0,j=0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
GAME[i][j]='+';
}
}
//memset(GAME,'+',N*N);
}
//游戏是否胜利的运算,一旦有人胜利则返回1
int wzq_play(int a,int b,char (*GAME)
)
{
int i=0,j=0,k=0;
//方向-上的
for(j=b-4;j<b+4;j++)
{
if(j<0 || j>N-1)
{
continue;
}
for(i=0;i<5;i++)
{
if('@'==GAME[a][j+i] ||'+'==GAME[a][j+i])
{
break;
}
if('O'==GAME[a][j+i] &&4==i)
{
printf("\n恭喜你,白家-方向上获胜!\n");
return1;
}
}
}
//方向|上的
for(i=a-4;i<a+4;i++)
{
if(i<0 || i>N-1)
{
continue;
}
for(j=0;j<5;j++)
{
if('@'==GAME[i+j][b] ||'+'==GAME[i+j][b])
{
break;
}
if('O'==GAME[i+j][b] &&4==j)
{
printf("\n恭喜你,白家|方向上获胜!\n");
return1;
}
}
}
//方向\上的
for(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;
}
for(k=0;k<5;k++)
{
if('@'==GAME[i+k][j+k] ||'+'==GAME[i+k][j+k])
{
break;
}
if('O'==GAME[i+k][j+k] &&4==k)
{
printf("\n恭喜你,白家\方向上获胜!\n");
return1;
}
}
}
//方向/上的
for(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;
}
for(k=0;k<5;k++)
{
if('@'==GAME[i-k][j+k] ||'+'==GAME[i-k][j+k])
{
break;
}
if('O'==GAME[i-k][j+k] &&4==k)
{
printf("\n恭喜你,白家/方向上获胜!\n");
return1;
}
}
}
return0;
}
int main()
{
char GAME
={0};
int count=0;//轮换落子计算
int m=0,n=0;//白家
int x=0,y=0;//黑家
int res=0;
int k=0;
wzq_init(GAME);
wzq_show(GAME);
while(1)
{
//当棋盘格子被下满了时
if(N*N==count)
{
printf("棋盘已经下满了,平局!\n");
return0;
}
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]
)
{
printf("此处已经落过子,请重新落子:");
scanf("%d%d",&m,&n);
}
GAME[m]
='O';
res=wzq_play(m,n,GAME);
if(1==res)
{
wzq_show(GAME);
printf("程序结束\n");
return0;
}
}else
{
printf("请黑家落子(例如0 3或1
3):");
scanf("%d%d",&x,&y);
while(m<0 || m>N-1 || n<0
|| n>N-1)
{
printf("输入的坐标超出范围,请重新输入:");
scanf("%d%d",&m,&n);
}
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");
return0;
}
}
count++;
wzq_show(GAME);
}
}
相关文章推荐
- 12天学好C语言——记录我的C语言学习之路(Day 7)
- 12天学好C语言——记录我的C语言学习之路(Day 7)
- Spring3.1 profile 配置不同的数据库环境
- PHP中使用cURL实现Get和Post请求的方法
- 开启CURL扩展,让服务器支持PHP curl函数(远程采集)
- java应用程序利用Exe4j打包exe文件
- java 字符流与带有缓冲的字符流 代码笔记
- 如何去掉Eclipse里面自动追加的一些注释!!!
- java实现单链表之逆序
- 聊聊高并发(四十三)解析java.util.concurrent各个组件(十九) 任务的定时执行和周期执行
- Java进程堆外内存(off heap)大小
- java概述
- Eclipse中快捷键记录
- PHP实现根据设备类型自动跳转相应页面的方法
- vc++ 读取EditBox中的十进制数,转化为int格式,再在编辑框中用十六进制显示
- QT 绘制 局部刷新的N中方法
- java集合类深入分析之List篇
- QT 的信号与槽机制介绍
- java设计模式之代理模式Proxy--静态代理
- thinkphp自动创建数据对象分析