伊莉討論區

標題: C# 井字遊戲 [打印本頁]

作者: a20199    時間: 2010-10-19 12:44 PM     標題: C# 井字遊戲

我製作一個井字遊戲

想用一個重新開始鈕

不知道要輸入哪些指令

請各位大大幫幫忙~~
作者: Azurekite    時間: 2010-10-31 12:11 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: je42004    時間: 2012-2-27 11:49 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: sango99001    時間: 2020-12-1 07:29 PM

本帖最後由 sango99001 於 2020-12-27 12:37 PM 編輯

這是我這陣子自己寫出來的井字遊戲,無ai,只有雙方玩家輪流下子,請高手多多指教
以下為我的程式碼
  1. //宣告物件陣列及變數
  2.         Label[,] lbl; int[] player = new int[2];
  3.         const int ranks = 3; //行列個數(依照物件數量更改)
  4.         const int line = 3; //連線子數(依需求更改)
  5.         //   最大需求子數        中間數  落子數
  6.         int need = line * 2 - 1, median, counter;
  7.         private void frmOOXX_Load(object sender, EventArgs e)
  8.         {
  9.             //中間數,Label物件陣列設定
  10.             median = need - line;
  11.             lbl = new Label[ranks, ranks]; player[0] = -1; counter = 1;
  12.             for (int x = 0; x < ranks; x++)
  13.             {
  14.                 for (int y = 0; y < ranks; y++)
  15.                 {
  16.                     lbl[x, y] = (Label)this.Controls.Find("label" + (x * ranks + y + 1).ToString(), true).FirstOrDefault();
  17.                 }
  18.             } button1_Click(sender, e);
  19.         }

  20.         private void label1_Click(object sender, EventArgs e)
  21.         {
  22.             //按下物件後的動作int row = -1, col = -1;
  23.             int row = -1, col = -1;
  24.             for (int x = 0; x < ranks; x++)
  25.             {
  26.                 for (int y = 0; y < ranks; y++)
  27.                 {
  28.                     if (lbl[x, y] == sender)
  29.                     {
  30.                         row = x; col = y;
  31.                         if (lbl[x, y].Text == "" && lblText.Text == "")
  32.                         {
  33.                             if (player[1] == 1) lbl[x, y].Text = "○";
  34.                             else lbl[x, y].Text = "●";

  35.                             counter = counter + 1; player[1] = player[1] * -1;
  36.                             c(row, col);
  37.                         }
  38.                     }
  39.                     if (row > -1 && col > -1) break;
  40.                 }
  41.                 if (row > -1 && col > -1) break;
  42.             }
  43.         }

  44.         private void button1_Click(object sender, EventArgs e)
  45.         {
  46.             //遊戲重置
  47.             if (counter > 0)
  48.             {
  49.                 player[0] = player[0] * -1; player[1] = player[0] * -1; counter = 0; lblText.Text = "";
  50.                 for (int x = 0; x < ranks; x++)
  51.                 {
  52.                     for (int y = 0; y < ranks; y++)
  53.                     {
  54.                         lbl[x, y].Text = "";
  55.                     }
  56.                 }
  57.             }
  58.         }

  59.         private void c(int row, int col)
  60.         {
  61.             //宣告變數
  62.             string[,] str = new string[4, need];
  63.             int x1 = line - 2, x2 = ranks - 1, x3 = x2 - x1;
  64.             bool[] t = new bool[4] { true, true, true, true };
  65.             
  66.             //進入判斷4角不足連子數的函式
  67.             for (int cols = 0; cols < x1; cols++)
  68.                 for (int rows = 0; rows == cols; rows++)
  69.                     for (int i = 0; i < 4; i++)
  70.                         b(row, col, rows, cols, i, x1, x2, x3, ref t[i]);

  71.             //依按下物件的行列編號,將對應的線段物件標記寫入陣列(判斷是否連線使用)
  72.             for (int c = 0; c < 4; c++)
  73.             {
  74.                 switch (c)
  75.                 {
  76.                     case 0: //橫線
  77.                         for (int i = 0; i < line; i++)
  78.                         {
  79.                             bool b1 = false, b2 = false;
  80.                             b1 = rc1(col, i);
  81.                             if (b1)
  82.                                 str[c, median - i] = lbl[row, col - i].Text;
  83.                             b2 = rc2(col, i);
  84.                             if (b2)
  85.                                 str[c, median + i] = lbl[row, col + i].Text;
  86.                         }
  87.                         break;
  88.                     case 1: //直線
  89.                         for (int i = 0; i < line; i++)
  90.                         {
  91.                             bool a1 = false, a2 = false;
  92.                             a1 = rc1(row, i);
  93.                             if (a1)
  94.                                 str[c, median - i] = lbl[row - i, col].Text;
  95.                             a2 = rc2(row, i);
  96.                             if (a2)
  97.                                 str[c, median + i] = lbl[row + i, col].Text;
  98.                         }
  99.                         break;
  100.                     case 2: //反斜線
  101.                         for (int i = 0; i < line; i++)
  102.                         {
  103.                             bool a1 = false, b1 = false, a2 = false, b2 = false;
  104.                             a1 = rc1(row, i); b1 = rc1(col, i);
  105.                             if (a1 && b1 && t[0])
  106.                                 str[c, median - i] = lbl[row - i, col - i].Text;
  107.                             a2 = rc2(row, i); b2 = rc2(col, i);
  108.                             if (a2 && b2 && t[1])
  109.                                 str[c, median + i] = lbl[row + i, col + i].Text;
  110.                         }
  111.                         break;
  112.                     case 3: //斜線
  113.                         for (int i = 0; i < line; i++)
  114.                         {
  115.                             bool a1 = false, b2 = false, a2 = false, b1 = false;
  116.                             a1 = rc1(row, i); b2 = rc2(col, i);
  117.                             if (a1 && b2 && t[2])
  118.                                 str[c, median - i] = lbl[row - i, col + i].Text;
  119.                             a2 = rc2(row, i); b1 = rc1(col, i);
  120.                             if (a2 && b1 && t[3])
  121.                                 str[c, median + i] = lbl[row + i, col - i].Text;
  122.                         }
  123.                         break;
  124.                 }
  125.                 result(ref str, c, str[c, median]); if (lblText.Text != "") break;
  126.             }

  127.         }

  128.         private void result(ref string[,] str, int s, string str1)
  129.         {
  130.             ////判斷是否連線或平手
  131.             for (int x = 0; x <= need - line; x++)
  132.             {
  133.                 int y = 0;
  134.                 for (int i = 0; i < line; i++) {
  135.                     if (str[s, i + x] != str1) continue;
  136.                     y++;
  137.                     if (y == line) lblText.Text = str1 + "勝";
  138.                 }
  139.             }
  140.             if (counter == Math.Pow(ranks, 2) && lblText.Text == "")
  141.                 lblText.Text = "平手";
  142.             if (lblText.Text == "")
  143.                 s++;
  144.         }
  145.         bool rc1(int c, int x)
  146.         {//遞減找所需的子
  147.             bool a = false;
  148.             if (c - x > -1) a = true;
  149.             return a;
  150.         }
  151.         bool rc2(int c, int x)
  152.         { //遞增找所需的子
  153.             bool a = false;
  154.             if (c + x < ranks) a = true;
  155.             return a;
  156.         }

  157.         void b(int row, int col, int rows, int cols, int i, int x1, int x2, int x3, ref bool t)
  158.         { //排除連子數不足的線段
  159.             bool[] a = new bool[4] { false, false, false, false };
  160.             switch (i)
  161.             {
  162.                 case 0:
  163.                     a = new bool[4] { rl(row, x1, rows), rl(col, x2, cols), rl(row, x2, rows), rl(col, x1, cols) };
  164.                     break;
  165.                 case 1:
  166.                     a = new bool[4] { lr(row, 0, rows), lr(col, x3, cols), lr(row, x3, rows), lr(col, 0, cols) };
  167.                     break;
  168.                 case 2:
  169.                     a = new bool[4] { rl(row, x1, rows), lr(col, 0, cols), rl(row, x2, rows), lr(col, x3, cols) };
  170.                     break;
  171.                 case 3:
  172.                     a = new bool[4] { lr(row, 0, rows), rl(col, x1, cols), lr(row, x3, rows), rl(col, x2, cols) };
  173.                     break;
  174.             }
  175.             if ((a[0] && a[1]) | (a[2] && a[3])) t = false;
  176.         }
  177.         
  178.         bool rl (int c, int x, int d)
  179.         { //遞減判斷左右上邊界
  180.             bool a = false;
  181.             if (c == x - d) a = true;
  182.             return a;
  183.         }
  184.         bool lr(int c, int x, int d)
  185.         { //遞增判斷右或下邊界
  186.             bool a = false;
  187.             if (c == x + d) a = true;
  188.             return a;
  189.         }
複製代碼







歡迎光臨 伊莉討論區 (http://a402.file-static.com/) Powered by Discuz!