五子棋的落子位置?谢谢!

3xp 2003-02-07 05:38:14
首先感谢这位网友提供的程序代码。
这是一个五子棋人机对弈的程序,现在棋子落在19x19的方格中,
请问怎样将棋子落在交叉线上?象围棋的落子。
用的是Additional中的DrawGrid组件作为棋盘。



function Tmainform.IsWin(IsBlack:boolean):boolean;
label exit1;
var
i,j:integer;
wtag:integer;
begin
IsWin:=false;
if IsBlack then
wtag:=1 else
wtag:=2;
for i:=0 to 18 do
for j:=0 to 14 do
begin
{是否有行连成}
if (i<15)
and(Tag[i,j]=wtag)
and(Tag[i+1,j]=wtag)
and(Tag[i+2,j]=wtag)
and(Tag[i+3,j]=wtag)
and(Tag[i+4,j]=wtag)
then
begin
IsWin:=True;
goto exit1;
end;
{是否有列连成}
if (Tag[i,j]=wtag)
and(Tag[i,j+1]=wtag)
and(Tag[i,j+2]=wtag)
and(Tag[i,j+3]=wtag)
and(Tag[i,j+4]=wtag)
then
begin
IsWin:=True;
goto exit1;
end;
{是否有主对角线连成}
if (i<15)
and(Tag[i,j]=wtag)
and(Tag[i+1,j+1]=wtag)
and(Tag[i+2,j+2]=wtag)
and(Tag[i+3,j+3]=wtag)
and(Tag[i+4,j+4]=wtag)
then
begin
IsWin:=True;
goto exit1;
end;
{是否有副对角线连成}
if (Tag[i,j]=wtag)
and(Tag[i-1,j+1]=wtag)
and(Tag[i-2,j+2]=wtag)
and(Tag[i-3,j+3]=wtag)
and(Tag[i-4,j+4]=wtag)
then
begin
IsWin:=True;
goto exit1;
end;
end;
exit1:
end;

procedure Tmainform.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to 18 do
for j:=0 to 18 do
begin
Tag[i,j]:=0;
end;
IsBlack:=true;
DrawGrid1.Canvas.Pen.Color :=clBlack;
DrawGrid1.Canvas.Brush.Color :=clBlack;
end;

procedure Tmainform.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin 画黑棋子
DrawGrid1.Canvas.Pen.Color :=clBlack;
DrawGrid1.Canvas.Brush.Color :=clBlack;
if tag[acol,arow]=1 then
DrawGrid1.Canvas.Ellipse(acol*21,arow*21,(acol+1)*21,(arow+1)*21)
else if tag[acol,arow]=2 then
DrawGrid1.Canvas.Arc(acol*21,arow*21,(acol+1)*21,(arow+1)*21,acol*21,arow*21,acol*21,arow*21)
else
begin 画白棋子
DrawGrid1.Canvas.Pen.Color :=clWhite;
DrawGrid1.Canvas.Brush.Color :=clWhite;
DrawGrid1.Canvas.Ellipse(acol*21,arow*21,(acol+1)*21,(arow+1)*21);
end;
end;

procedure Tmainform.DrawGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
col,row:integer;
i,j:integer;
begin
DrawGrid1.Canvas.Pen.Color :=clBlack;
DrawGrid1.Canvas.Brush.Color :=clBlack;
DrawGrid1.MouseToCell(x,y,col,row);
if tag[col,row]=0 then
begin
if IsBlack then
begin
DrawGrid1.Canvas.Ellipse(col*21,row*21,(col+1)*21,(row+1)*21);
tag[col,row]:=1;
end else
begin
DrawGrid1.Canvas.Arc(col*21,row*21,(col+1)*21,(row+1)*21,col*21,row*21,col*21,row*21);
tag[col,row]:=2;
end;
if IsWin(IsBlack) then
begin
if IsBlack then
if MessageDlg('黑不垃圾的赢了',mtInformation,[mbOK],0)=mrOK then
begin
for i:=0 to 18 do
for j:=0 to 18 do
begin
tag[i,j]:=0;
end;
DrawGrid1.Invalidate;
end;
if not IsBlack then
if MessageDlg('白猪赢了',mtInformation,[mbOK],0)=mrOK then
begin
for i:=0 to 18 do
for j:=0 to 18 do
begin
tag[i,j]:=0;
end;
DrawGrid1.Invalidate;
end;
end;
IsBlack:=not IsBlack;
end;
end;

end.
...全文
195 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
honkily 2003-06-01
  • 打赏
  • 举报
回复
gz
blueshrimp 2003-05-20
  • 打赏
  • 举报
回复
直接自已画图不好吗?用TImage做棋子,不就两个ico嘛,16或32大小都行
xebaobei 2003-05-20
  • 打赏
  • 举报
回复
代码`
http://www.shenli99.com/down/5zq.rar
xebaobei 2003-05-20
  • 打赏
  • 举报
回复
其实按我写的~
线只是背景的一部分
然后动态生成IMAGES,透明的
当黑的下的时候就在他点的IMAGES上加载黑色棋图片`
白色一样`
yujiabian 2003-05-13
  • 打赏
  • 举报
回复
自己做个棋盘图形文件当背景
snake_eye 2003-05-10
  • 打赏
  • 举报
回复
棋盘自己画!
wb5836527 2003-05-06
  • 打赏
  • 举报
回复
自己做个棋盘图形文件当背景
zhouxujian 2003-05-04
  • 打赏
  • 举报
回复
这个我用vb编过就是用mousedown
nzh517 2003-03-11
  • 打赏
  • 举报
回复
不如自己画棋盘好,,
棋子也自己画
amdcwf 2003-03-11
  • 打赏
  • 举报
回复
我里有一个我自己写的通用的人人对奕的五子棋程序(不是人机对奕的)
你只要给出画棋盘的位置与棋盘的上、下边边缘宽度以级每行的格子数和一个格子的大小
以级你的棋盘图像,棋子图像即可
不知你要吗
蓝色光芒 2003-03-10
  • 打赏
  • 举报
回复
五子棋程序成品都是自己画棋盘,如用其他软件画好一张张的棋盘,然后调入一张,画到Canvas上,然后画棋子,这样多好!!,用DrawGrid不是最终选择!!!
myling 2003-03-04
  • 打赏
  • 举报
回复
建议自己画棋盘!
ain2000 2003-02-08
  • 打赏
  • 举报
回复
以前用tc 写过for dos 的,我是在图形模式下用,棋盘是画线画出来的,
把规定的范围内定义出方块区间,再判断鼠标的位置在那个方块内,在交叉点画棋子.
niat97222 2003-02-07
  • 打赏
  • 举报
回复
procedure TForm_Main.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if chess[acol,arow] > 0 then drawchess(acol,arow,chess[acol,arow])
else drawrect(acol,arow);
end;


procedure TForm_Main.drawrect(x,y:integer); //画线
var
rect:Trect;
Left,Top,Right,Bottom:Integer;
begin
rect := DrawGrid1.CellRect(x,y);
drawgrid1.Canvas.Brush.Color := clwhite;
drawgrid1.Canvas.FillRect(rect);
drawgrid1.Canvas.Pen.Color := clgray;
drawgrid1.Canvas.Pen.Width := 1;

Left := rect.Left;Top := Rect.Top;
Right := rect.Right; Bottom :=rect.Bottom;

if x = 0 then left := left+10;
if x=n-1 then right := right-10;
if y=0 then top := top+10;
if y=n-1 then bottom := bottom-10;

drawgrid1.Canvas.MoveTo(Left,Rect.Top + 10);
drawgrid1.Canvas.LineTo(Left+11,Rect.Top +10);

drawgrid1.Canvas.MoveTo(Right,Rect.Top + 10);
drawgrid1.Canvas.LineTo(Right-11,rect.Top +10);

drawgrid1.Canvas.MoveTo(Rect.Left +10,top);
drawgrid1.Canvas.LineTo(Rect.Left +10,top+11);

drawgrid1.Canvas.MoveTo(rect.Left +10,bottom);
drawgrid1.Canvas.LineTo(rect.Left +10,bottom-11);
end;

procedure TForm_Main.drawchess(x,y,color:integer); //画棋子
var
rect:Trect;
begin
rect := DrawGrid1.CellRect(x,y);

drawrect(x,y);

if color = 1 then drawgrid1.Canvas.Brush.Color := clblack
else drawgrid1.Canvas.Brush.Color := clMoneyGreen;

drawgrid1.Canvas.Ellipse(rect.Left+2,rect.Top+2,rect.Right-2,rect.Bottom-2);

if (x=step[step_No].x) and (y=step[step_No].y) then
begin
drawgrid1.Canvas.Pen.Color := clred;
drawgrid1.Canvas.Pen.Width := 2;
drawgrid1.Canvas.MoveTo(rect.Left+2,rect.Top + 11);
drawgrid1.Canvas.LineTo(rect.Right-2,rect.Top + 11);
drawgrid1.Canvas.MoveTo(rect.Left + 11,rect.top+2);
drawgrid1.Canvas.LineTo(rect.Left + 11,rect.Bottom -2);
end;

end;

niat97222 2003-02-07
  • 打赏
  • 举报
回复
把drawgrid的线去掉,自己去在grid的中间画线,这样旗子就落在了交叉点上了
grail_ 2003-02-07
  • 打赏
  • 举报
回复
用帖图不行吗
Billy_Chen28 2003-02-07
  • 打赏
  • 举报
回复
参考:
http://www.playicq.com/dispdoc.php?t=27&id=2256
http://www.playicq.com/dispdoc.php?t=27&id=70

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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