最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)AI五子棋游戲的示例代碼

 更新時(shí)間:2022年11月22日 15:57:03   作者:Csharp小記  
這篇文章主要為大家詳細(xì)介紹了C#如何智能AI五子棋游戲中的人工下棋操作以及對(duì)應(yīng)的機(jī)器操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

文章描述

關(guān)于簡(jiǎn)單的介紹,這篇就不贅述了,主要還是來(lái)寫(xiě)一下實(shí)際的人工下棋操作以及對(duì)應(yīng)的機(jī)器操作的算法處理。

還是先大致說(shuō)一下算法實(shí)現(xiàn)方式,我們之前寫(xiě)的五子棋大部分可能主要是基于機(jī)器算法做一個(gè)攔截操作,即判斷橫向、豎向、斜向、反斜向的棋子的數(shù)量去直接進(jìn)行攔截。但是這一篇中主要是使用了一個(gè)分配權(quán)重的算法,根據(jù)權(quán)重來(lái)匹配我是要去攔截你,還是保持自己的勝利。這個(gè)權(quán)重可以根據(jù)自己的需求適當(dāng)調(diào)整(我也是瞎寫(xiě)的)。

萬(wàn)變不離其宗,無(wú)論什么算法,肯定到最后都是根據(jù)五子棋的玩法,去解析橫豎斜的勝率來(lái)進(jìn)行權(quán)衡。

開(kāi)發(fā)環(huán)境

.NET Framework版本:4.5

開(kāi)發(fā)工具

Visual Studio 2013

實(shí)現(xiàn)代碼

 /// <summary>
        /// 轉(zhuǎn)換棋子的繪制位置
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        private Point GetChessPostion(int x, int y)
        {
            return new Point((int)(x * cellSize.Width) - chessSize.Width / 2, (int)(y * cellSize.Height) - chessSize.Height / 2);
        }

 /// <summary>
        /// 判斷勝負(fù)
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="type"></param>
        private void IsWin(int x, int y, bool type)
        {
            for (int w = 0; w < winSum; w++)
            {
                if (wins[x, y, w] == 1)
                {
                    if (!type)
                    {
                        userWin[w]++;
                        aiWin[w] = 6;
                        if (userWin[w] == 5)
                        {
                            graphics.DrawString("贏", new Font("黑體", 11.0f), new SolidBrush(Color.Red), GetChessPostion(x, y));
                            if (MessageBox.Show("你贏了,是否重新開(kāi)始?") == DialogResult.OK)
                            {
                                Reset();
                            }
                            break;
                        }
                    }
                    else
                    {
                        aiWin[w]++;
                        userWin[w] = 6;
                        if (aiWin[w] == 5)
                        {
                            graphics.DrawString("贏", new Font("黑體", 11.0f), new SolidBrush(Color.Red), GetChessPostion(x, y));
                            if (MessageBox.Show("你輸了,是否重新開(kāi)始?") == DialogResult.OK)
                            {
                                Reset();
                            }

                            break;
                        }
                    }
                }
            }
            isUserPlay = !isUserPlay;
        }
 /// <summary>
        /// 人工下棋操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void panel_board_Click(object sender, EventArgs e)
        {
            if (!isUserPlay)
            {
                return;
            }
            MouseEventArgs mouse = e as MouseEventArgs;
            if (mouse.X < cellSize.Width || mouse.X > boardSize.Width - cellSize.Width)
            {
                return;
            }
            if (mouse.Y < cellSize.Height || mouse.Y > boardSize.Height - cellSize.Height)
            {
                return;
            }
            int x = Convert.ToInt32(Math.Round((decimal)mouse.X / (decimal)cellSize.Width, MidpointRounding.AwayFromZero));
            int y = Convert.ToInt32(Math.Round((decimal)mouse.Y / (decimal)cellSize.Width, MidpointRounding.AwayFromZero));
            Point chessPoint = GetChessPostion(x, y);
            if (!chessList.Exists(s => s.point == chessPoint))
            {
                chessList.Add(new ChessModel { point = chessPoint, type = true });

                graphics.DrawImage(Properties.Resources.黑棋子, chessPoint.X, chessPoint.Y, chessSize.Width, chessSize.Height);

                IsWin(x, y, false);
                SetStatus(x, y, false);
                if (!isUserPlay)
                {
                    AIChess();
                }
            }
        }
/// <summary>
        /// AI下棋操作
        /// </summary>
        private void AIChess()
        {
            int[,] userScore = new int[xCellCount, yCellCount];
            int[,] aiScore = new int[xCellCount, yCellCount];

            int max = 0;
            Point aiChess = new Point();

            for (int x = 0; x < xCellCount; x++)
            {
                for (int y = 0; y < yCellCount; y++)
                {
                    if (!chessList.Exists(s => s.point == GetChessPostion(x, y)))
                    {
                        for (int w = 0; w < winSum; w++)
                        {
                            if (wins[x, y, w] == 1)
                            {
                                if (userWin[w] == 1)
                                {
                                    userScore[x, y] += 100;
                                }
                                if (userWin[w] == 2)
                                {
                                    userScore[x, y] += 400;
                                }
                                if (userWin[w] == 3)
                                {
                                    userScore[x, y] += 3000;
                                }
                                if (userWin[w] == 4)
                                {
                                    userScore[x, y] += 20000;
                                }


                                if (aiWin[w] == 1)
                                {
                                    aiScore[x, y] += 200;
                                }
                                if (aiWin[w] == 2)
                                {
                                    aiScore[x, y] += 500;
                                }
                                if (aiWin[w] == 3)
                                {
                                    aiScore[x, y] += 3400;
                                }
                                if (aiWin[w] == 4)
                                {
                                    aiScore[x, y] += 30000;
                                }

                            }
                        }

                        if (userScore[x, y] > max)
                        {
                            max = userScore[x, y];

                            aiChess.X = x;
                            aiChess.Y = y;
                        }
                        else if (userScore[x, y] == max)
                        {
                            if (aiScore[x, y] > aiScore[x, y])
                            {
                                aiChess.X = x;
                                aiChess.Y = y;
                            }
                        }


                        if (aiScore[x, y] > max)
                        {
                            max = aiScore[x, y];

                            aiChess.X = x;
                            aiChess.Y = y;
                        }
                        else if (aiScore[x, y] == max)
                        {
                            if (userScore[x, y] > userScore[x, y])
                            {
                                aiChess.X = x;
                                aiChess.Y = y;
                            }
                        }
                    }
                }
            }
            Point chessPoint = GetChessPostion(aiChess.X, aiChess.Y);
            chessList.Add(new ChessModel() { point = chessPoint, type = false });
            graphics.DrawImage(Properties.Resources.白棋子, chessPoint.X, chessPoint.Y, chessSize.Width, chessSize.Height);

            IsWin(aiChess.X, aiChess.Y, true);
            SetStatus(aiChess.X, aiChess.Y, true);
        }

實(shí)現(xiàn)效果

代碼解析:自己看代碼吧,看懂了就拿來(lái)優(yōu)化下,看不懂就直接下載下來(lái)玩玩(除了一個(gè)思路引導(dǎo)外,好像也沒(méi)什么用)

到此這篇關(guān)于C#實(shí)現(xiàn)AI五子棋游戲的示例代碼的文章就介紹到這了,更多相關(guān)C#五子棋游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用C#9.0新語(yǔ)法如何提升if語(yǔ)句美感

    利用C#9.0新語(yǔ)法如何提升if語(yǔ)句美感

    這篇文章主要給大家介紹了關(guān)于利用C# 9.0新語(yǔ)法如何提升if語(yǔ)句美感的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • c# Base關(guān)鍵字的使用

    c# Base關(guān)鍵字的使用

    c# Base關(guān)鍵字的使用示例代碼,大家可以參考下用法。
    2009-07-07
  • 詳解c# AutoMapper 使用方式

    詳解c# AutoMapper 使用方式

    本篇文章主要介紹了詳解c# AutoMapper 使用方式 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • C#?WPF實(shí)現(xiàn)數(shù)據(jù)記錄導(dǎo)出excel

    C#?WPF實(shí)現(xiàn)數(shù)據(jù)記錄導(dǎo)出excel

    這篇文章主要為大家詳細(xì)介紹了C#如何基于WPF實(shí)現(xiàn)數(shù)據(jù)記錄導(dǎo)出excel的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C#實(shí)現(xiàn)完善Excel不規(guī)則合并單元格數(shù)據(jù)導(dǎo)入的示例代碼

    C#實(shí)現(xiàn)完善Excel不規(guī)則合并單元格數(shù)據(jù)導(dǎo)入的示例代碼

    本文主要介紹了C#實(shí)現(xiàn)完善Excel不規(guī)則合并單元格數(shù)據(jù)導(dǎo)入的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • C#判斷單詞個(gè)數(shù)方法總結(jié)

    C#判斷單詞個(gè)數(shù)方法總結(jié)

    我們給大家總計(jì)了C#中判斷英文單詞個(gè)數(shù)的方法以及排序的技巧,對(duì)此有需要的朋友可以測(cè)試下。
    2018-03-03
  • C#自定義鼠標(biāo)拖拽Drag&Drop效果之基本原理及基本實(shí)現(xiàn)代碼

    C#自定義鼠標(biāo)拖拽Drag&Drop效果之基本原理及基本實(shí)現(xiàn)代碼

    拖拽效果無(wú)論是在系統(tǒng)上、應(yīng)用上、還是在網(wǎng)頁(yè)上,拖拽隨處可見(jiàn),下面通過(guò)本文介紹下C#自定義鼠標(biāo)拖拽Drag&Drop效果之基本原理及基本實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2022-04-04
  • ListView用法中與滾動(dòng)相關(guān)的需求實(shí)現(xiàn)

    ListView用法中與滾動(dòng)相關(guān)的需求實(shí)現(xiàn)

    這篇文章主要介紹了ListView用法中與滾動(dòng)相關(guān)的需求實(shí)現(xiàn),獲取并設(shè)置ListView的滾動(dòng)位置,以及獲取滾動(dòng)位置處的項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#檢查遠(yuǎn)程或本地磁盤(pán)使用率

    C#檢查遠(yuǎn)程或本地磁盤(pán)使用率

    要檢查磁盤(pán)的使用情況確定程序放哪個(gè)服務(wù)器和清理垃圾,所以寫(xiě)個(gè)小程序幫忙檢查。本文給大家介紹C#檢查遠(yuǎn)程或本地磁盤(pán)使用率的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • C#文字換行的實(shí)現(xiàn)方法

    C#文字換行的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#文字換行的實(shí)現(xiàn)方法,通過(guò)自定義函數(shù)實(shí)現(xiàn)針對(duì)特定字符串的換行長(zhǎng)度處理,是比較實(shí)用的技巧,對(duì)于C#的深入學(xué)習(xí)具有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

青阳县| 南宫市| 芦山县| 临朐县| 沈丘县| 宁强县| 和静县| 靖远县| 扬中市| 双鸭山市| 巴马| 信宜市| 乐东| 洛宁县| 泗阳县| 民勤县| 淮北市| 恩施市| 蒲江县| 勐海县| 工布江达县| 鄂托克旗| 汝南县| 平昌县| 泾源县| 崇仁县| 陵川县| 孟津县| 孟津县| 温州市| 鄢陵县| 汶上县| 于都县| 浦江县| 平昌县| 和龙市| 蒲江县| 宜良县| 桃江县| 荣成市| 阳山县|