過河問題:農夫、羊、狼、青菜

過河問題:農夫、羊、狼、青菜

過河問題:農夫、羊、狼、青菜

一名農夫帶著一隻狼、一隻羊和一顆高麗菜渡河,河上只有一艘船,一次只能載農夫和一樣東西到對岸,只有農夫會/能划船,如果農夫沒看著,狼會吃羊,羊會吃菜,農夫要如何成功的將狼、羊、高麗菜帶到另一岸,而不會有損失?

程式畫面

【程式列表】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string farmerLocation = "L"; //農夫的位置,一開始在左邊

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            lstBoxL.Enabled = true; L.Text = "西岸(可選取)";
            lstBoxR.Enabled = false; R.Text = "東岸(不可選取)";
        }

        /*
         * 當按了往右邊移動,有三個狀況:
         * 1.若農夫已在右邊,不需要移動,離開
         * 2.只有農夫自己一人過河
         * 3.農夫帶著一物過河,選取的物品從左邊移入右邊(Add),並從左邊移除(Remove)
         * 
         * 2與3共同步驟:
         * 設定農夫位值在右邊
         * 對調左右2個清單方塊的可選取狀態
         */
        private void btn2Right_Click(object sender, EventArgs e) //按下往右移動
        {
            if (farmerLocation == "R") return; //如果農夫已在右邊的話就離開

            if (lstBoxL.SelectedItem != null) //若左邊方塊有選取
            {
                lstBoxR.Items.Add(lstBoxL.SelectedItem); //將左邊方塊的選取項目加到右邊方塊
                lstBoxL.Items.Remove(lstBoxL.SelectedItem); //將左邊方塊選取項目移除掉(移到另一邊的意思)
            }
            lstBoxL.Enabled = false; L.Text = "西岸(不可選取)";
            lstBoxR.Enabled = true; R.Text = "東岸(可選取)";

            btnFarmer.Location = new Point(312, 120); //移動農夫 
            farmerLocation = "R"; //標記農夫的位置在右邊
        }

        private void btn2Left_Click(object sender, EventArgs e)
        {
            if (farmerLocation == "L") return; //如果農夫已在右邊的話就離開

            if (lstBoxR.SelectedItem != null)
            {
                lstBoxL.Items.Add(lstBoxR.SelectedItem);
                lstBoxR.Items.Remove(lstBoxR.SelectedItem);
            }
            lstBoxR.Enabled = false; R.Text = "東岸(不可選取)";
            lstBoxL.Enabled = true; L.Text = "西岸(可選取)";

            btnFarmer.Location = new Point(192, 120);
            farmerLocation = "L";
        }

        private void button1_Click(object sender, EventArgs e)
        {  //取消二邊清單方塊的選取
            lstBoxL.SelectedItem = null;
            lstBoxR.SelectedItem = null;
        }
    }
}

【程式英文】

1.ListBox 清單方塊

2.Item 項目 (清單方塊裏的)

3.Items 項目集合

4.Enabled  啟用的

5.SelectedItem 選取的項目

6.null 未指定/空

7.Location 位置

8.point 點

【遊戲判斷】

1.測試清單方塊裏的項目是否同時出現? 當農夫在另一邊時,此時,遊戲失敗!

a.羊和高麗菜,羊會吃了高麗菜

b.狼和羊,狼會吃了羊

2.若羊、狼、高麗菜同時出現在右邊清單方塊時,此時,遊戲過關!

【程式判斷是否失敗】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        string farmerLocation = "L"; //農夫的位置,一開始在左邊

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            lstBoxL.Enabled = true; L.Text = "西岸(可選取)";
            lstBoxR.Enabled = false; R.Text = "東岸(不可選取)";
        }

        private void lstBoxL_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private bool isGameFailed()
        {
            bool hasSheep = false, hasWolf = false, hasCab = false;
            if (farmerLocation == "L")
            {
                foreach (object o in lstBoxR.Items)
                {
                    string s = o.ToString();
                    if (s == "羊") hasSheep = true;
                    if (s == "狼") hasWolf = true;
                    if (s == "高麗菜") hasCab = true;
                }

            } else
            {
                foreach (object o in lstBoxL.Items)
                {
                    string s = o.ToString();
                    if (s == "羊") hasSheep = true;
                    if (s == "狼") hasWolf = true;
                    if (s == "高麗菜") hasCab = true;
                }


            }

            bool gameFailed = false;
            if (hasSheep && hasCab) gameFailed = true;
            if (hasSheep && hasWolf) gameFailed = true;
            return gameFailed;
        }

        private void btn2Left_Click(object sender, EventArgs e)
        {
            if (farmerLocation == "L") return; //如果農夫已在右邊的話就離開

            if (lstBoxR.SelectedItem != null)
            {
                lstBoxL.Items.Add(lstBoxR.SelectedItem);
                lstBoxR.Items.Remove(lstBoxR.SelectedItem);
            }
            lstBoxR.Enabled = false; R.Text = "東岸(不可選取)";
            lstBoxL.Enabled = true; L.Text = "西岸(可選取)";

            btnFarmer.Location = new Point(168, 101);
            farmerLocation = "L";

            if (isGameFailed()) MessageBox.Show("You losed!");
        }

        private void btn2Right_Click(object sender, EventArgs e)
        {
            if (farmerLocation == "R") return; //如果農夫已在右邊的話就離開

            if (lstBoxL.SelectedItem != null) //若左邊方塊有選取
            {
                lstBoxR.Items.Add(lstBoxL.SelectedItem); //將左邊方塊的選取項目加到右邊方塊
                lstBoxL.Items.Remove(lstBoxL.SelectedItem); //將左邊方塊選取項目移除掉(移到另一邊的意思)
            }
            lstBoxL.Enabled = false; L.Text = "西岸(不可選取)";
            lstBoxR.Enabled = true; R.Text = "東岸(可選取)";
            
            btnFarmer.Location = new Point(312, 101); //移動農夫 
            farmerLocation = "R"; //標記農夫的位置在右邊

            if (isGameFailed()) MessageBox.Show("You losed!");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //取消二邊清單方塊的選取
            lstBoxL.SelectedItem = null;
            lstBoxR.SelectedItem = null;
        }
    }
}