自己写的简易双人对战五子棋游戏。。。大家指导哈

koulongfei 2009-04-28 08:49:17
小生上学期有C++课程,因为一些事给耽误,没有学,后悔莫及。这学期自学了教科书,又看了钱能的书,苦于不知怎么写实践而烦恼。前天看到仁兄yj327811994yj一页一页输出的方法,顿时茅塞顿开,鸣谢,鸣谢。他写的是五子棋,没看懂,情急之下,自己写了个,拿来让大家指导哈。



#include "iostream"
#include <iomanip>
using namespace std;
#define M 20
#define N 20
int main()
{
char weizhi[M][N];
int k,i,j,x,y,flag=0;
cout<<"欢迎使用简易双人对战五子棋游戏"<<endl;
cout<<"五子棋棋谱如下:"<<endl;
for(k=0;k<=N;k++)
cout<<setw(3)<<setfill(' ')<<k;
cout<<endl;
for(i=1;i<=M;i++)
{
cout<<setw(3)<<setfill(' ')<<i;
for(j=1;j<=N;j++)
{
weizhi[i][j]='-';
cout<<setw(3)<<setfill(' ')<<weizhi[i][j];
}
cout<<endl;
}
while(flag==0)
{
//红方落子
cout<<"请红方输入落子位置:"<<endl;
loop1:
cout<<"请输入落子的行数:";
cin>>x;
cout<<"请输入落子的列数:";
cin>>y;
if(weizhi[x][y]=='-')
{
weizhi[x][y]='*';
for(k=0;k<=N;k++)
cout<<setw(3)<<setfill(' ')<<k;
cout<<endl;
for(i=1;i<=M;i++)
{
cout<<setw(3)<<setfill(' ')<<i;
for(j=1;j<=N;j++)
cout<<setw(3)<<setfill(' ')<<weizhi[i][j];
cout<<endl;
}
}
else
{
cout<<"你不能在这落子,请重新选择落子位置:"<<endl;
goto loop1;
}
//判断胜利
for(i=1;i<=M-4;i++)
{
for(j=1;j<=N-4;j++)
{
if(weizhi[i][j]=='*' && weizhi[i][j+1]=='*' && weizhi[i][j+2]=='*' && weizhi[i][j+3]=='*' && weizhi[i][j+4]=='*')
{
cout<<"恭喜红方获得简易双人对战五子棋的胜利!耶~~~"<<endl;
flag=1;
break;
}
if(weizhi[i][j]=='*' && weizhi[i+1][j]=='*' && weizhi[i+2][j]=='*' && weizhi[i+3][j]=='*' && weizhi[i+4][j]=='*')
{
cout<<"恭喜红方获得简易双人对战五子棋的胜利!耶~~~"<<endl;
flag=1;
break;
}
if(weizhi[i][j]=='*' && weizhi[i+1][j+1]=='*' && weizhi[i+2][j+2]=='*' && weizhi[i+3][j+3]=='*' && weizhi[i+4][j+4]=='*')
{
cout<<"恭喜红方获得简易双人对战五子棋的胜利!耶~~~"<<endl;
flag=1;
break;
}
if(flag==1)
break;
}
}
if(flag==1)
return 1;
//蓝方落子
cout<<"请蓝方输入落子位置:"<<endl;
loop2:
cout<<"请输入落子的行数:";
cin>>x;
cout<<"请输入落子的列数:";
cin>>y;
if(weizhi[x][y]=='-')
{
weizhi[x][y]='#';
for(k=0;k<=N;k++)
cout<<setw(3)<<setfill(' ')<<k;
cout<<endl;
for(i=1;i<=M;i++)
{
cout<<setw(3)<<setfill(' ')<<i;
for(j=1;j<=N;j++)
cout<<setw(3)<<setfill(' ')<<weizhi[i][j];
cout<<endl;
}
}
else
{
cout<<"你不能在这落子,请重新选择落子位置:";
goto loop2;
}
}
//判断胜利
for(i=1;i<=M-4;i++)
{
for(j=1;j<=N-4;j++)
{
if(weizhi[i][j]=='#' && weizhi[i][j+1]=='#' && weizhi[i][j+2]=='#' && weizhi[i][j+3]=='#' && weizhi[i][j+4]=='#')
{
cout<<"恭喜蓝方获得简易双人对战五子棋的胜利!耶~~~"<<endl;
flag=1;
break;
}
if(weizhi[i][j]=='#' && weizhi[i+1][j]=='#' && weizhi[i+2][j]=='#' && weizhi[i+3][j]=='#' && weizhi[i+4][j]=='#')
{
cout<<"恭喜蓝方获得简易双人对战五子棋的胜利!耶~~~"<<endl;
flag=1;
break;
}
if(weizhi[i][j]=='#' && weizhi[i+1][j+1]=='#' && weizhi[i+2][j+2]=='#' && weizhi[i+3][j+3]=='#' && weizhi[i+4][j+4]=='#')
{
cout<<"恭喜蓝方获得简易双人对战五子棋的胜利!耶~~~"<<endl;
flag=1;
break;
}
if(flag==1)
break;
}
}
return 0;
}

...全文
2815 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
koulongfei 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 ican008 的回复:]
nb
[/Quote]
最原始的写法啦.........
ican008 2009-06-09
  • 打赏
  • 举报
回复
nb
koulongfei 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Paradin 的回复:]
希望lz编个人机对战的并将算法分享。
黑石太久了
[/Quote]

26楼的仁兄给了个五子棋算法研究的,你看哈。http://www.sicau.edu.cn/web/shly/down/0302.doc
koulongfei 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 freestyIe 的回复:]
加油,还可以继续完善下,就是加上禁手判断什么的。
[/Quote]

禁手判断是对五子棋双方平衡的限制哎,我会加上的。谢谢。
koulongfei 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 nuoshueihe 的回复:]
最后能把那些写成函数直接调用就好了
很多都是重复代码
[/Quote]

运用函数调用,恩。好的。谢谢。再问哈,用类和类的继承好么?
nuoshueihe 2009-04-30
  • 打赏
  • 举报
回复
最后能把那些写成函数直接调用就好了
很多都是重复代码
「已注销」 2009-04-30
  • 打赏
  • 举报
回复
lpf000 2009-04-30
  • 打赏
  • 举报
回复
UP
楼主不错
koulongfei 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Paradin 的回复:]
希望lz编个人机对战的并将算法分享。
黑石太久了
[/Quote]


恩。学习-ing,写成熟了给你。
koulongfei 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 master_feng2009 的回复:]
要编五子棋是不是需要机器学习的知识啊,
[/Quote]

人机对战应该要用到机器学习知识的。
freestyIe 2009-04-30
  • 打赏
  • 举报
回复
加油,还可以继续完善下,就是加上禁手判断什么的。
koulongfei 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 shexinwei 的回复:]
程序需要模块化,这样可以少很多代码,看起来清晰化!输出使用清屏函数吧!goto语句不要用了,使用函数模块化后,调用函数!!
[/Quote]

恩 了解 谢。

shexinwei 2009-04-29
  • 打赏
  • 举报
回复
http://www.sicau.edu.cn/web/shly/down/0302.doc
jakqigle 2009-04-29
  • 打赏
  • 举报
回复
不算是成熟的策略,主要的麻烦之处是要对棋盘每个格子都要更新分数,但对于简单实现应该可以了。
jakqigle 2009-04-29
  • 打赏
  • 举报
回复
呵呵,双人对战,还是在consle32下的。黑屏下运行的是吗?那还是最好写个人机对战的比较实在。
给个算法,以前做过的。

/*******************************************************************
** 这个算法是简易的,根据当前棋局的形势来分析哪个地方有利,只考虑了当前的
** 一步棋. 简单说来, 五子棋都是相连的棋子越多,就越有利.
** 对每个格子进行计分. 要是格子附近, 相连的格子越多, 分数越高.
** 考虑三个棋子相连, T表示要考虑的格子(T其实也是一个空格, 因为已经下了的棋子
** 不用考虑,** B表示黑, W表示白, K表示空.
** 1) T B B B K, 第一个B记8分, 第二个B记16分, 第三个B记32分, T的分数是三个相加
** 这样就相当于, a=8, n=3的等比数列求和.
** 再考虑 2) T K B B B K, T和B中间隔了个空格, 对比情形1), 1) 更有利, 第一个
** B记5分, 第二个B记10分, 第三个B记20分, 相当于a=5, n=3的等比数列求和.
** 3) T B B B W, 这个时候因为有个W挡着, 原来n=3, 现在取n--, 相当于a=8, n=2
** 4) T K B B B W , 取a=5, n=2
** 5) T K B B W, 取 a=5, n=1.
** 6) T B B B B W, 这个时候要另当别论, 因为已经有了4个B相连, 和 T B B B B K 是一样
** 这个时候, 当n=4的时候就立即跳出循环, 不再扫描了, 就没有机会 n--了,
** 这时候 a=8, n=4, 基本上要是有4个相同棋子相连, 就会下在那个地方.
** 7) T K B B B B W 要考虑的格子T, a=5, n=4, 本来会好大的分数了,
** 不过第一个空格是 a=8, n=4, 分数更大.
** 8) T K K B B B W, 和 T K B B B W一样, 就是说隔一个空格和隔几个空格的情况一样.
** 因为我们是要找出最大分数的格子,不是要排列每一个格子的分数.只要找到最有利就
** 成利, 上面两种情况, 都不如T B B B W, 有利.
*****************************************************************/
/* 上面只是考虑了一个方向的情况, 但是五子棋是有8个方向的, 同一直线上的棋子会互相
** 影响, 比如向左的棋子会影响向右的棋子. 比如 B T B B B, 考虑T, 左有一个空格了,
** 使右边的棋子价值升高, 右边的棋子也会让左边的棋子分数变高.
** 程序采用同一直线扫描两次的方法, 先向右扫描, n=3, 跟着,n保持不变,左扫描, n+=1=4.
** 所以第一次扫描的时候, 左边棋子, a=8, n=3, 右边棋子, a=8, n=4.第二次扫描先左
** 后右, 左边a=8, n=1, 右边n+=3, a=8, n=4. 另外要是有别的棋子挡路, 按上,n作调整.
** 向8个方向扫描, 每个方向两次, 实际上扫描16次, 将分数相加.得出格子分数.
** 上面是基本策略, 程序中还有一些对策略的微小调整, 好象边界问题
** 程序中 a用 mark表示, n用N表示
**************************************************************************/
llj2655506 2009-04-29
  • 打赏
  • 举报
回复
本来我也想写个五子棋的,看了楼主的贴,感觉是泰山北斗已现,后来者已无心恋战。
koulongfei 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 shexinwei 的回复:]
程序需要模块化,这样可以少很多代码,看起来清晰化!输出使用清屏函数吧!goto语句不要用了,使用函数模块化后,调用函数!!
[/Quote]

修改:
1.使用 system("cls"); 清屏

2.使用反序嵌套调用函数:
void HeiFangLuoZi(x,y)
{
...
if(...)
{
...
}
else
{
...
}
HeiFangWinJudge(x,y);
}


我的判断胜利算法很丑,请问:你有什么好的办法么?
shexinwei 2009-04-28
  • 打赏
  • 举报
回复
程序需要模块化,这样可以少很多代码,看起来清晰化!输出使用清屏函数吧!goto语句不要用了,使用函数模块化后,调用函数!!
shexinwei 2009-04-28
  • 打赏
  • 举报
回复
输出上面最好用清屏函数,goto本人很不喜欢,最好别用。使用函数调用就可以了!!分开实现各种功能,这样做在主函数里面很乱!!
Paradin 2009-04-28
  • 打赏
  • 举报
回复
希望lz编个人机对战的并将算法分享。
黑石太久了
加载更多回复(17)

65,195

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧