文章目录
  1. 1. CDF
  2. 2. 代码

无影冬瓜写了个黑白棋,所以我也写了个黑白棋有些代码照搬了冬瓜的代码

初稿,无说明,只有源码。
冬瓜的代码链接!黑白棋

CDF

代码

Manipulate[Deploy@Row[{Graphics[{
      Table[With[{i = i, j = j}, Button[{Disk[{j, 9 - i} - 0.5, .4]}, set[i, j]]], {i, 8}, {j, 8}],
      {RGBColor[0, .5, 0], Rectangle[{0, 0}, {8, 8}]}, 
      {Thick, Line[Table[{ {i, 0}, {i, 8}}, {i, 0, 8}]]}, 
      {Thick, Line[Table[{ {0, i}, {8, i}}, {i, 0, 8}]]},
      drawchess[chess],
      {If[color == 1, Black, White], Orange, PointSize[0.03], Point[{# 2, 9 - # 1} - 0.5 & @@@      
             FindSetable[chessmat, color][[All, 2]]]},
      Dynamic@{If[color == 1, Black, White], Opacity[.5], 
             Disk[MousePosition[{"Graphics", Graphics}, {-2, -2}], .4]},
      }, ImageSize -> 300, PlotRange -> { {0, 8}, {0, 8}}], 
     Column[{
      Column[{Graphics[{Black, AbsolutePointSize[18], Point[{0, 0}], 
          Text[Dynamic@Style[Count[chess, 1, 2], 18, Bold], {4, 0}]}, ImageSize -> {80, 20}], 
        Graphics[{White, AbsolutePointSize[18], Point[{0, 0}], 
          Text[Dynamic@Style[Count[chess, -1, 2], 18, Bold], {4, 0}]},ImageSize -> {80, 20}]}, 
          Alignment -> Left, ItemSize -> {8, 2}],
      RadioButtonBar[Dynamic[type], # 1 -> Style[# 2, 16, Bold] & @@@ { {2, 
          "双人对弈"}, {1, "人机对弈"}}, Appearance -> "Vertical"],
      Button[Style["重新开始", 16, Bold], initialize[], ImageSize -> Automatic]
      }, ItemSize -> {8, 8}, Alignment -> {Center, Center}]}, 
   Background -> Brown, Alignment -> {Center, Center}, 
   Frame -> True], { {type, 2}, {}, ControlType -> None},
 Initialization :> {
   initialize[] := {
     chessmat = Array[{# 1, # 2, 0} &, {8, 8}];
     (chessmat[[# 1, # 2, 3]] = # 3) & @@@ { {4, 4, 1}, {4, 5, -1}, {5, 4, -1}, {5, 5, 1}};
     color = 1;
     };
   chess := chessmat[[All, All, 3]];
   initialize[];
   drawchess[mat_] := 
    Join[{Black, Disk[{# 2, 9 - # 1} - 0.5, .4]} & @@@ Position[mat, 1], 
      {White, Disk[{# 2, 9 - # 1} - 0.5, .4]} & @@@ Position[mat, -1]];
   FindSetable[mat_, c_] := 
    SequenceCases[# , { {i1_, j1_, c}, {_, _, -c} .., {i2_, j2_, 
            0}} | { {i2_, j2_, 0}, {_, _, -c} .., {i1_, j1_, 
            c}} :> { {i1, j1}, {i2, j2}}] & /@ (Join @@ {mat, 
         Transpose@mat, Diagonal[mat, # ] & /@ Range[-5, 5], 
         Diagonal[Reverse@mat, # ] & /@ Range[-5, 5]}) // Join @@ #  &;
   GetTurnPosition[{p1 : {i1_, j1_}, p2 : {i2_, j2_}}] := 
    NestList[#  + Sign[p2 - p1] &, p1, Max[Abs /@ {i2 - i1, j2 - j1}]];
   set[i_, j_] := Module[{pos},
     If[(pos = Cases[FindSetable[chessmat, color], { {_, _}, {i, j}}]) != {},
      (chessmat[[# 1, # 2, 3]] = color) & @@@ (Join @@ GetTurnPosition /@ pos);
      color *= -1;
      ];
     WinQ[];
     If[type == 1 && color == -1, AISet[]]
     ];
   WinQ[] := If[FindSetable[chessmat, color] == {} || FreeQ[chess, 0],
     CreateDialog[{Style["游戏结束," <> Switch[Total[chess, 2], _?(#  > 0 &), "黑方胜", _?(#  < 0 &), 
          "白方胜", _, "平局"], 16, Bold], 
       ChoiceButtons[{"再来一局", "取消"}, {initialize[];
         DialogReturn[], DialogReturn[]}]}]
     ];
   AISet[] := set @@ Last@RandomChoice@FindSetable[chessmat, color];
   }]

文章目录
  1. 1. CDF
  2. 2. 代码