简单的五子棋人机对战(delphi)

2017-08-20 10:41:08来源:CSDN作者:lth498488347人点击

分享

delphi xe6编写了一个小的五子棋,是按照这个来改的
下载地址:http://www.newxing.com/Code/Delphi/game/1560.html
但是它只能人和人玩,没有人机,就想做一个,昨天终于弄出来了。
参考文章:http://www.cnblogs.com/songdechiu/p/5768999.html
全部代码:http://download.csdn.net/download/lth498488347/9941074
先列出各种棋型下的得分情况:

  finalfive = 1000000; // 五,胜  livefour = 10000; // 活四,双死四,死四活三(稳胜)  doublelivethree = 5000; // 双活三,难解  doublethree = 1000; // 死三活三,四活二 大优势  diefour = 550; // 死四,对方必管  lowdiefour = 450; // 低级死四??  threetwo = 200; // 三活二  livethree = 100; // 活三  jumpthree = 90; // 跳活三,不连在一起  doublelivetwo = 50; // 双活二  livetwo = 10; // 活二  lowlivetwo = 9; // 低级活二  diethree = 6; // 死三  dietwo = 2; // 死二  nothing = 1; // 其他  die = 0;

判断得分思路:落点后,以落点处为中心,左右各延展四格,形成长度为9的字符串,和已有类型对比。
(参考文章也是这么想的,为什么在写这篇的时候好像参考文章的后半部分有点看懂了。。。)
对比四个方向,上下,左右,左上到右下,左下到右上。
如下:

  zong[0] := 'TTTTT';  fen[0] := finalfive;  zong[1] := ' TTTT ';  fen[1] := livefour;  zong[2] := 'FTTTT ';  fen[2] := diefour;  zong[3] := ' TTTTF';  fen[3] := diefour;  zong[4] := 'TTT T';  fen[4] := lowdiefour;  zong[5] := 'T TTT';  fen[5] := lowdiefour;  zong[6] := 'TT TT';  fen[6] := lowdiefour;  zong[7] := ' TTT  ';  fen[7] := livethree;  zong[8] := '  TTT ';  fen[8] := livethree;  zong[9] := ' TT T ';  fen[9] := jumpthree;

棋盘为20*20,只计算自我得分时(即一步:400种),初步的人机就可以实现了,我称之为智障一号,只会进攻不会防守。
为了攻守兼备需要计算两步:160000种,计算电脑落子后玩家的落子,因为玩家是后手,故得分只有原得分的90%(有什么不对的地方希望能给我指出),双方都落子后如果电脑得分收益低于玩家得分收益,电脑就落子在玩家要落子的地方(感觉好流氓啊。。。),可惜还是没能判断双三、活三死四等多种得分结合情况,但如果能赢,优先选择赢。
之后把电脑智能分为智障一号(level1)和智障二号(level2我有时候下不过)
如下即为判断过程:

if (fightstyle) and (player = player1) then // 黑色 电脑  begin    blackstart := zhdfblack; // 记录好落点前分数    whitestart := zhdfwhite; // 记录好落点前分数    blackend := -1000000; // 初始化最大得分    whiteend := -1000000; // 初始化最大得分    if blackstart = 0 then    begin      if che[Trunc(num / 2), Trunc(num / 2)].isempty then // 第一步落中心        luozi(Trunc(num / 2), Trunc(num / 2))      else        luozi(Trunc(num / 2), Trunc(num / 2) + 1);      abort;    end;    for i := 0 to num do      for j := 0 to num do      begin        player := player1;        zhdfblack := blackstart; // 每次重新落点前恢复初始值        if che[i, j].isempty = false then          Continue; // 该处已有落点        che[i, j].isempty := false;        che[i, j].color := black;        panduan(i, j, black);        // 后加入二步计算        if level > 1 then // 智障二号        begin          for m := 0 to num do            for n := 0 to num do            begin              player := player2;              zhdfwhite := whitestart; // 每次重新落点前恢复初始值              if che[m, n].isempty = false then                Continue; // 该处已有落点              che[m, n].isempty := false;              che[m, n].color := white;              panduan(m, n, white);              che[m, n].isempty := true;              che[m, n].color := none;              if ((zhdfwhite) > whiteend) then // 玩家面对电脑落子后得分最高              begin                whiteend := zhdfwhite; // 更新最大得分                m1 := m;                N1 := n;              end;            end;          if (zhdfblack - blackstart) > 1000000 then // 能赢直接下          begin            i1 := i;            j1 := j;            Break;          end;          if ((zhdfblack - blackstart) - Trunc((whiteend - whitestart) * 0.9) >            blackend) then              //计算两步时,玩家后下,总分只有电脑90%          // 电脑收益-人最高收益 最大化          begin            blackend := (zhdfblack - blackstart) - (whiteend - whitestart);            i1 := i;            j1 := j;          end;        end;        che[i, j].isempty := true; // 模拟落点后清除        che[i, j].color := none;        if level = 1 then // 智障一号        begin          if ((zhdfblack) > blackend) then // 落子后分数大于最大得分          begin            blackend := zhdfblack; // 更新最大得分            i1 := i;            j1 := j;          end;        end;      end;    image1.Canvas.Brush.color := clblack;    image1.Canvas.Pen.color := clblack;    image1.Canvas.Pen.Width := 1;    if level = 2 then    begin      if blackend < 0 then      begin        i1 := m1;        j1 := N1;      end;    end;    image1.Canvas.Ellipse(j1 * 30, i1 * 30, j1 * 30 + 30, i1 * 30 + 30);    che[i1, j1].isempty := false;    che[i1, j1].color := black;    image5.Visible := false;    image6.Visible := true;    player := player2;    ListBox1.Items.Add(inttostr(i1) + '&' + inttostr(j1));    searchfive(i1, j1, black);

如果我没有猜错的话,我的表述方式很糟糕以至于看到这里你还是有点乱,甚至想揍我,也许将来我看自己的这个也想揍自己,不过第一篇博客嘛,还是一个好的开始,加油!!!


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台