关于实现五子棋的思想

zyf1990818 2010-06-06 01:18:43
大一期末设计,用WPF实现一个单机人人对战的五子棋,现在有一些疑惑,一是棋盘问题,棋盘式如何实现,我的目前想法是加一张图片做背景,但是对行棋比较疑惑,如果用getposition以后画圆的方法感觉很难实现,那么向背景图上加透明button设置初始为透明,内容为一张棋子的图片,然后再定义一个变量来控制状态显示黑子或者白子怎么样?或者二维数组呢?
二是怎么判断胜负,这也是相当困惑我的地方,总感觉应该用数组,但是感觉情况有些多,不知怎样简化算法。

在论坛上看过五子棋的代码,但是许多都不懂,希望可以用 更简单的代码写。望高手指点思路和算法。。然后自己进行完善,能有一个很大的提高。
...全文
553 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
hgx_wyy521 2011-12-26
  • 打赏
  • 举报
回复
图片做背景的话,下子位置和判定都不好控制,我是划出来的,仅供参考
hgx_wyy521 2011-12-26
  • 打赏
  • 举报
回复
无知的人总愿意充大头……
vipwalkingdog 2011-11-23
  • 打赏
  • 举报
回复
7、8、9楼的
你不去了解底层代码,那你就不能了解更过的思想。整天拖拉控件弄什么什么系统。。。。等到这种语言过时了,你拿什么和别人比。
zhongqingnanhai 2011-01-12
  • 打赏
  • 举报
回复
没想到混csdn的人是如此高的水平。
zyf1990818 2010-06-10
  • 打赏
  • 举报
回复
坐等指点。。
卧_槽 2010-06-10
  • 打赏
  • 举报
回复
如果我来做,我会拿一个panel做棋盘。在onpaint中绘制棋盘和黑白子
然后自己设计一个棋子排列类。用来记录棋盘上黑白棋的位置和判断胜负。
最后写一个落子控制类,包括判断该黑白子下的顺序和落子位置并提交数据到棋子排列。

基本上就算做完了。
zyf1990818 2010-06-10
  • 打赏
  • 举报
回复
另外我的棋盘是用一个画布嵌在一个GRID里面,然后用grid分的列和行,然后让分割线显示出来,但是确是虚线,能有别的号方法吗?用border怎么样?
zyf1990818 2010-06-10
  • 打赏
  • 举报
回复
用WPF写的五子棋,后台代码放出来,望高手能帮忙修改一下,下的棋子始终无法准确的将圆心定在交叉点上,另外有一处数组可能溢出,还有判断胜负两种斜的还不是想得很清楚,希望高手能帮帮忙啊。谢谢谢谢

这是cs代码:

public partial class Window1 : Window
{
RadialGradientBrush radia1 = new RadialGradientBrush();
RadialGradientBrush radia2 = new RadialGradientBrush();
GradientStop a1 = new GradientStop();
GradientStop a2 = new GradientStop();

//二维数组棋盘
int[,] pan = new int[10, 10];

//单双数
private int chushi = 1;


public Window1()
{
InitializeComponent();
}



private void canvas1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point mouse = e.GetPosition(canvas1);

int xzhou = Convert.ToInt32(mouse.X);
int yzhou = Convert.ToInt32(mouse.Y);
xzhou = xzhou / 20;
yzhou = yzhou / 20;
if (xzhou <= 20 && xzhou >= 0 && yzhou >= 0 && yzhou <= 20)
{
Draw(xzhou, yzhou);
}
else
{
MessageBox.Show("无效位置", "五子棋");
}
}
public void Draw(int x, int y)
{
int a1 = x;
int a2 = y;



if (pan[a1/2, a2/2] == 0) //这里会出现数组溢出
{
if (chushi % 2 == 1)
{
DrawHei(a1/2, a2/2);
pan[a1/2, a2/2] = 1;
panduan(a1/2, a2/2);

}
else if (chushi % 2 == 0)
{
DrawBai(a1/2, a2/2);
pan[a1/2, a2/2] = 2;
panduan(a1/2, a2/2);
}
chushi++;
}

else
{
MessageBox.Show("不能重复下棋", "五子棋", MessageBoxButton.OK, MessageBoxImage.Error);

}



}

public void DrawHei(int b1, int b2)
{


Ellipse newellipse = new Ellipse();

a1.Color = Colors.Black;
radia1.GradientStops.Add(a1);

newellipse.Fill = radia1;
newellipse.Width = 19;
newellipse.Height = 19;


Canvas.SetTop(newellipse, b2 * 40);
Canvas.SetLeft(newellipse, b1 * 40);

canvas1.Children.Add(newellipse);
}
public void DrawBai(int c1, int c2)
{
Ellipse newellipse = new Ellipse();

a2.Color = Colors.White;
radia2.GradientStops.Add(a2);

newellipse.Fill = radia2;
newellipse.Width = 19;
newellipse.Height = 19;

Canvas.SetTop(newellipse, c2 * 40);
Canvas.SetLeft(newellipse, c1 * 40);

canvas1.Children.Add(newellipse);
}


public void panduan(int c, int d)
{
int count = 0;

//横
if (c >= 0 && c <= 10 && d >= 0 && d <= 10)
{
for (int i = c; i < 10 ; i++)
{
if (pan[c, d] != pan[i, d])
break;
count++;
}

for (int p = c; p >= 0; p--)
{
if (pan[c, d] != pan[p, d])
break;
count++;
}
}



if (count == 6)
{
MessageBox.Show("ying");

}
//竖
else if (c >= 0 && c <= 10 && d >= 0 && d <= 10)
{
count = 0;
for (int i = c; i < 10; i++)
{
if (pan[c, d] != pan[c, i])
break;
count++;
}

for (int p = c; p >= 0; p--)
{
if (pan[c, d] != pan[c, p])
break;
count++;
}

}

if (count == 6)
{
MessageBox.Show("ying");

}




}
}
xienb 2010-06-07
  • 打赏
  • 举报
回复
实现单机版应该主要是人机对战的算法吧 棋盘应该很容易啊
  • 打赏
  • 举报
回复
1,棋盘怎么实现,棋子怎么实现都不重要。这些只是人机交互的界面而已。开始时,只求简单能用。不妨就用划线,画圈实现。

2,关于算法,个人认为二维数组即可:
(1)落子之前,先判断当前位置是否已有棋子。
(2)落子之后,即可判断,是否有五子相连:
第一,其实五子相连的情况很有限,无非是以当前落子的位置为中心,有四种可能(
横着的方向,竖着的方向,45度方向,135度)。
第二,如果,有五子相连,当前棋子无非就在五子中的某个位置。
第三,下面是个例子
是关于横向上五子相连的过程,其中 “0”代表还没有棋子
1 1 1 1 0 1 1 1 1
这时,落子填充了"0"位置,所以变成了以下情况
1 1 1 1 1 1 1 1 1

接下来就是,判断的过程,可以用位操作符完成:
1,取当前情况到 cur_state = 1 1111 1111
2,另一变量设为 success_state = 1 1111
3,位操作:
for(i=0;i<4;i++)
{
if(cur_state&success_state)
{
//五子相连了
}
else
{
cur_state = cur_state>>1;
}
}

if(i=4)
说明没有成功。

楼上的楼上说的对,先不求完美,只求做出原型。之后,再对不满意的地方重构。关于人机界面的设计,那是没有底的事。

五子软件我之前也没做过,以上的算法思路尽做参考。






zyf1990818 2010-06-06
  • 打赏
  • 举报
回复
WPF怎么实现,棋盘一定要画吗?我们还没有学过stone这个类啊,怎么下棋啊,如果坐标定位在交叉点上太精确了,怎么能产生误差点击?
hhc123 2010-06-06
  • 打赏
  • 举报
回复
你先实现一个扫雷的给俺们看看再说。
请叫我卷福 2010-06-06
  • 打赏
  • 举报
回复
楼上牛叉。。
wuyq11 2010-06-06
  • 打赏
  • 举报
回复
通过屏幕画棋盘
五子棋程序
五子棋算法
xdick 2010-06-06
  • 打赏
  • 举报
回复
判断胜负用数组设置方向,归纳所有胜的可能,根据这些可能采取算法设计检验棋子个数的函数或类。
  • 打赏
  • 举报
回复
lz如果纠缠于底层,你可能需要1年以上时间才拼凑出来。如果熟悉工程做法,即使不太懂编程工具,那么十几二十天也就做出来了。但是拼凑出产品不算结束,对于许多产品,那些拼凑出他们来的人拿到老板给的第一笔奖金就开溜了,后招聘来的人开始维护这些号称最好是最好的做法开发的软件,其实是一团糟糕的软件。
  • 打赏
  • 举报
回复
一个实用软件的开发要分清很多设计层次,这是软件工程设计知识,而不是死抠一些看似底层代码、类似“不用任何控件”之类的花花肠子似做法就能拼凑出来的。如果纠缠于底层,那么风险很大。好的开发者先用快速原型在1、2天之内作出整个系统,然后才开始对界面所使用什么控件之类不重要的东西(但是外行感觉最重要的东西)重构。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zyf1990818 的回复:]
WPF怎么实现,棋盘一定要画吗?我们还没有学过stone这个类啊,怎么下棋啊,如果坐标定位在交叉点上太精确了,怎么能产生误差点击?
[/Quote]什么乱七八糟的?

软件设计有不同的角度,有的是美工而有的是编程人员。即使对于编程人员,有的是设计师有的是代码民工。如果要设计出一个棋类游戏,当然先要有框架,即使你把输出全都输出到命令行窗口,也并不影响你的程序完美的对战框架的实现。

什么叫做“没有学过stone类”?你的编程生涯就是抄别人的代码吗?

确定一个点周围的交叉点,要按照一个点为中心的矩形坐标为过滤条件,排除了所有在左边线左边、在上边线上边、在右边线右边、在下边线下边的交叉点,你说还剩什么点?(假设)就算剩下了多个点,这时候才需要去计算所选择的点和交叉点之间的绝对距离。
zyf1990818 2010-06-06
  • 打赏
  • 举报
回复
真心希望一些指点。。谢谢
zyf1990818 2010-06-06
  • 打赏
  • 举报
回复
..只需要实现单机就可以了,有什么经验介绍一下吧
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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