過河問題:農夫、羊、狼、青菜
一名農夫帶著一隻狼、一隻羊和一顆高麗菜渡河,河上只有一艘船,一次只能載農夫和一樣東西到對岸,只有農夫會/能划船,如果農夫沒看著,狼會吃羊,羊會吃菜,農夫要如何成功的將狼、羊、高麗菜帶到另一岸,而不會有損失?
程式畫面
【程式列表】
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; } } }