91精产品自偷自偷综合官网版下载-91精产品自偷自偷综合下-91精品-91精品91久久久-91精品成人-91精品成人www

網站建設資訊

NEWS

網站建設資訊

利用c#編寫一個漢諾塔小游戲-創新互聯

利用c# 編寫一個漢諾塔小游戲?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創新互聯公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站設計、網站制作、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的西夏網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

漢諾塔游戲一旦掌握了規律,其實是有點單調和無聊的,不過卻是學習遞歸的一個絕佳例子,想當初學習老譚C的時候,就卡在這兒好長時間。

對初學編程的人來說,遞歸本身就不易理解,如果使用C語言沒有好的調試環境就更難去理解了。在這方面,VS調試輸出是真方便,一目了然。

但要想理解遞歸求解漢諾塔,還是得先玩一玩游戲本身,有點感受。另外,設計一下這個游戲也可以加深對它的理解,同時還可以對數據結構中的棧有一個簡單的認識。

因為漢諾塔的游戲規則本身就是一個棧,只能從平臺最上面取走碟子,然后放在另一個平臺最上面,這明顯是個棧。下面是我設計的游戲界面:

利用c# 編寫一個漢諾塔小游戲

游戲的玩法關鍵:奇數個盤子,第一個先移到C上;偶數個盤子,第一個先移到B上

平臺和背景容器是事先畫好的,碟子是動態生成的,使用了容器控件panel的拖動事件來實現拖動碟子(就是個label控件而已)的功能。

主要代碼:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace 漢諾塔
{
    public partial class Form1 : Form
    {
        int dishNum = 3;
        int dishThick = 20;
        int count;            // 記錄步數
        Stack pileA;     // 存放平臺A的數據
        Stack pileB;     // 存放平臺B的數據
        Stack pileC;     // 存放平臺C的數據
 
        public Form1()
        {
            InitializeComponent();
            InitGame();
            Result.ShowAnswer(dishNum);
        }
 
        private void InitGame()
        {
            pileA = new Stack();
            pileB = new Stack();
            pileC = new Stack();
            panelA.Tag = pileA;
            panelB.Tag = pileB;
            panelC.Tag = pileC;
            for (int i = 0; i < dishNum; i++)
            {
                Label label = new Label();
                label.BackColor = Color.Gold;
                label.BorderStyle = BorderStyle.FixedSingle;
                label.Parent = panelA;
                label.Size = new Size(panelA.Width - (i + 1) * 12, dishThick);    // 從下往上每層寬度減少12
                label.Location = new Point(panelA.Width / 2 - label.Width / 2, panelA.Height - dishThick * (i + 1));
                label.BringToFront();
                label.MouseMove += new MouseEventHandler(Dish_MouseMove);
                label.Text = (dishNum - i).ToString();
                label.TextAlign = ContentAlignment.MiddleCenter;
                label.Name = "dish" + i;
                label.Tag = i;    // 設置碟子的編號
                pileA.Push(i);    // 存儲碟子的編號
            }
            count = 0;
            lblCount.Text = "已走步數:" + count;
            lblLevel.Text = "最少步數:" + (Math.Pow(2, dishNum) - 1);
        }
 
        private void Dish_MouseMove(object sender, MouseEventArgs e)
        {
            Label label = sender as Label;
            if (e.Button == MouseButtons.Left)
            {
                label.DoDragDrop(label, DragDropEffects.Move);
            }
        }
 
        private void panelBox_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(Label)))
            {
                //Console.WriteLine("DragEnter: {0}", (sender as Panel).Name);
                Label label = e.Data.GetData(typeof(Label)) as Label;
                Panel panelFrom = label.Parent as Panel;
                Stack pileFrom = panelFrom.Tag as Stack;
                int index = (int)label.Tag;
                if (pileFrom.Peek() == index) e.Effect = DragDropEffects.Move;    // 只可以拖走最頂層的碟子
                else e.Effect = DragDropEffects.None;
            }
        }
 
        private void panelBox_DragDrop(object sender, DragEventArgs e)
        {
            Panel panelTo = sender as Panel;
            //Console.WriteLine("DragDrop: {0}", panelTo.Name);
            //Point newPoint = panel.PointToClient(new Point(e.X, e.Y));
            Stack pileTo = panelTo.Tag as Stack;
            Label label = e.Data.GetData(typeof(Label)) as Label;
            Panel panelFrom = label.Parent as Panel;
            Stack pileFrom = panelFrom.Tag as Stack;
            int index = (int)label.Tag;
            if (pileTo.Count == 0 || index > pileTo.Peek())    // 只可以放置小的碟子到大的碟子上(棧為空時使用Peek會引發異常)
            {
                label.Parent = panelTo;
                label.Location = new Point(panelTo.Width / 2 - label.Width / 2, panelTo.Height - dishThick * (pileTo.Count + 1));
                label.BringToFront();
                pileFrom.Pop();
                pileTo.Push(index);
                count++;
                lblCount.Text = "已走步數:" + count;
                if (IsWin())
                {
                    if (dishNum < 9)    // 9層夠玩了
                    {
                        MessageBox.Show("OK, be going to next...", "Help", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        dishNum++;
                        Reset();
                        InitGame();
                    }
                    else
                    {
                        MessageBox.Show("You Win!", "Help", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            else e.Effect = DragDropEffects.None;
        }
 
        private bool IsWin()
        {
            if (pileC.Count == dishNum) return true;
            else return false;
        }
 
        private void Reset()    // 刪除現在所有的碟子
        {
            //panelC.Controls.Clear();    // 會把柱子也刪除
            //Console.WriteLine("panelC: {0}", panelC.Controls.Count);
            for (int i = panelC.Controls.Count - 1; i >= 0; i--)    // 注意從前往后移除控件時控件的索引會跟著變化導致難以跟蹤
            {
                //Console.WriteLine(" {0} {1}", i, panelC.Controls[i].Name);
                if (panelC.Controls[i].Name.StartsWith("dish")) panelC.Controls[i].Dispose();
            }
        }
    }
}

網頁標題:利用c#編寫一個漢諾塔小游戲-創新互聯
轉載來源:http://www.yuzhuanjia.cn/article/csghej.html
主站蜘蛛池模板: 国产av网站一区二 | 97视频| 91看片淫黄大片欧美看国产片 | 午夜毛片视频播放 | 91无码在线观看了 | 成年人影视网站 | 午夜在线观看视频免费成人 | H高潮嗯啊娇喘抽搐A片男男视频 | 97伦理97伦理2025最新 | 高清成人一区二区三区 | 日韩av免费无码久久 | www在线小视频免费 www在线一区二区 | 高潮喷水在线视频在线 | 日韩av无码精品一二三区 | 白丝jk女仆爆乳自慰喷水流白浆 | 91福利国产在线观看网站 | 成人午夜免费视频 | 韩国三级电影久久久 | 91精品国产综合精品久久久精品 | 99久9在线视频 | 东京热少 | 闺蜜放荡h肉辣文御书屋姜 贵州美女一级纯黄大片 | 福利精品国产一区 | 国产白丝在线精品免费 | 91视频免费国产成人精品 | 91在线视频国产 | 95国产欧洲精华液 | av无码毛片天天 | 97精品人人a片| 91成人国产综合久久精品 | 99热这里只有精品免费国产 | a在线视频 | 99久久精品一区二区毛片 | 在线步 | 91视免费看nba国产免费 | av无码不卡 | 国产爆乳无码福利电影 | 99久久婷婷免费国产综合精品 | 91日韩视频在线观看 | 91蜜桃精品国产自产在线观看 | 国产精品久久久久久吹潮 |