使用WPF寫一個井字小遊戲演算法



井字遊戲演算法(3*3)


如何判斷 某一條已經連成一直線
最簡單的方法
達成直線總共會有  8 種

橫線  3 條
直線  3 條
斜的 2 條


以此類推
5*5  跟  7*7 的斜線 也是兩條 !!!!





圈圈  跟  叉叉 有兩個 State 我們可以分別給 正跟負的數值作為Flag來定義它的State

其中一方達到直線就遊戲結束



我們可以使用陣列來存取這些  State


Sum[9]  存取  0~8 這些按鈕狀態結果


新增好一個WPF專案後

拉一個Button

去右側屬性區塊更改寬、高


版面設定(Layout)  -->  Width  跟 Height 皆設定為 100


一般(Common) --> Content 設為 1

Copy Paste 額外的 八個












完成後的最原始 程式碼

MainWindow.xaml.cs  版本1





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace KinectV2_funnyApp
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        int[] Sum = new int[9];//0~8
        //我們用Sum[1]~Sum[8]來對應連為一直線的累計數值狀態

        int[] ButtonState = new int[10];
        //ButtonState[1]~ButtonState[9]

        private void b1_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[1] = 1;
            CheckSum();
        }

        private void b2_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[2] = 1;
            CheckSum();
        }

        private void b3_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[3] = 1;
            CheckSum();
        }

        private void b4_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[4] = 1;
            CheckSum();
        }

        private void b5_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[5] = 1;
            CheckSum();
        }

        private void b6_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[6] = 1;
            CheckSum();
        }

        private void b7_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[7] = 1;
            CheckSum();
        }

        private void b8_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[8] = 1;
            CheckSum();
        }

        private void b9_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[9] = 1;
            CheckSum();
        }

        private void CheckSum()
        {
            Sum[1] = ButtonState[1] + ButtonState[2] + ButtonState[3];
            Sum[2] = ButtonState[4] + ButtonState[5] + ButtonState[6];
            Sum[3] = ButtonState[7] + ButtonState[8] + ButtonState[9];

            Sum[4] = ButtonState[1] + ButtonState[4] + ButtonState[7];
            Sum[5] = ButtonState[2] + ButtonState[5] + ButtonState[8];
            Sum[6] = ButtonState[3] + ButtonState[6] + ButtonState[9];

            Sum[7] = ButtonState[1] + ButtonState[5] + ButtonState[9];
            Sum[8] = ButtonState[3] + ButtonState[5] + ButtonState[7];

            if (Sum.Contains(3) == true)
                MessageBox.Show("OK");

        }

    }
}








不過你會發現重複好多程式碼
我們其實可以縮短程式碼
讓同一種功能的只用一段程式進行






所以我們把程式全砍只留下  Button1 的事件即可



MainWindow.xaml.cs  版本2



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace KinectV2_funnyApp
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        int[] Sum = new int[9];//0~8
        //我們用Sum[1]~Sum[8]來對應連為一直線的累計數值狀態

        int[] ButtonState = new int[10];
        //ButtonState[1]~ButtonState[9]

        private void b1_Click(object sender, RoutedEventArgs e)
        {
            ButtonState[1] = 1;
            CheckSum();
        }

        private void CheckSum()
        {
            Sum[1] = ButtonState[1] + ButtonState[2] + ButtonState[3];
            Sum[2] = ButtonState[4] + ButtonState[5] + ButtonState[6];
            Sum[3] = ButtonState[7] + ButtonState[8] + ButtonState[9];

            Sum[4] = ButtonState[1] + ButtonState[4] + ButtonState[7];
            Sum[5] = ButtonState[2] + ButtonState[5] + ButtonState[8];
            Sum[6] = ButtonState[3] + ButtonState[6] + ButtonState[9];

            Sum[7] = ButtonState[1] + ButtonState[5] + ButtonState[9];
            Sum[8] = ButtonState[3] + ButtonState[5] + ButtonState[7];

            if (Sum.Contains(3) == true)
                MessageBox.Show("OK");

        }

    }
}








之後我們到

MainWindow.xaml






但是目前程式執行後不管你按下哪個都只會針對 編號為1的按鈕進行狀態切換


因此我們到右側屬性去搜尋  Uid 更改每一個Button的ID屬性內容
可以作為辨別按鈕的依據




改完後的
MainWindow.xaml






之後我們再回到

MainWindow.xaml.cs

寫 按下去之後取得對應的 Uid 及更改按鈕上面數值為 圈圈 符號的程式





效果呈現



接著就到了探討  是自己 還是  對手 的回合

判斷

我們可以使用  boolean 去做切換







最後程式碼的修改

增加  我方(Player1)  和    敵方(Player2) 的判斷


各自增加 一組  ButtonState 及  SumPlayer

紀錄 各自的 按鈕狀態 及 切換為正1狀態的統計陣列





最後程式碼


MainWindow.xaml.cs  版本3 (Final)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace KinectV2_funnyApp
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        int[] SumPlayer1 = new int[9];//0~8
        //我們用Sum[1]~Sum[8]來對應連為一直線的累計數值狀態

        int[] SumPlayer2 = new int[9];//0~8


        int[] ButtonState1 = new int[10];
        //ButtonState[1]~ButtonState[9]

        int[] ButtonState2 = new int[10];


        bool myTurn = true;

        private void b1_Click(object sender, RoutedEventArgs e)
        {
            Button tmpButton = (Button)sender;//tmpButton中會有Uid
            
            //ButtonState[1] = 1;
            if (myTurn )
            {
                tmpButton.Content = "O";
                ButtonState1[Convert.ToInt16(tmpButton.Uid)] = 1;
                CheckSum();
                myTurn = false;
            }    
            else
            {
                tmpButton.Content = "X";
                ButtonState2[Convert.ToInt16(tmpButton.Uid)] = 1;
                CheckSum();
                myTurn = true;
            }
        }

        private void CheckSum()
        {
            SumPlayer1[1] = ButtonState1[1] + ButtonState1[2] + ButtonState1[3];
            SumPlayer1[2] = ButtonState1[4] + ButtonState1[5] + ButtonState1[6];
            SumPlayer1[3] = ButtonState1[7] + ButtonState1[8] + ButtonState1[9];

            SumPlayer1[4] = ButtonState1[1] + ButtonState1[4] + ButtonState1[7];
            SumPlayer1[5] = ButtonState1[2] + ButtonState1[5] + ButtonState1[8];
            SumPlayer1[6] = ButtonState1[3] + ButtonState1[6] + ButtonState1[9];

            SumPlayer1[7] = ButtonState1[1] + ButtonState1[5] + ButtonState1[9];
            SumPlayer1[8] = ButtonState1[3] + ButtonState1[5] + ButtonState1[7];


            SumPlayer2[1] = ButtonState2[1] + ButtonState2[2] + ButtonState2[3];
            SumPlayer2[2] = ButtonState2[4] + ButtonState2[5] + ButtonState2[6];
            SumPlayer2[3] = ButtonState2[7] + ButtonState2[8] + ButtonState2[9];
                     
            SumPlayer2[4] = ButtonState2[1] + ButtonState2[4] + ButtonState2[7];
            SumPlayer2[5] = ButtonState2[2] + ButtonState2[5] + ButtonState2[8];
            SumPlayer2[6] = ButtonState2[3] + ButtonState2[6] + ButtonState2[9];
                     
            SumPlayer2[7] = ButtonState2[1] + ButtonState2[5] + ButtonState2[9];
            SumPlayer2[8] = ButtonState2[3] + ButtonState2[5] + ButtonState2[7];


            if (myTurn)
                if (SumPlayer1.Contains(3) == true)
                    MessageBox.Show("你(玩家1)贏了");
            else
                if (SumPlayer2.Contains(3) == true)
                    MessageBox.Show("對方(玩家2)贏了");

        }

    }
}







最後可成功對於 玩家1 及 玩家2 做判斷













留言

這個網誌中的熱門文章

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題