OOXX電 機 2 B
第 十 組
102103224 許嘉玳
102103244 李偉弘
102103245 許峻杰
102103251 游馭成
井字遊戲(又稱OOXX)
 一個是圈(O),一個是叉(X),輪流在3x3的方格上點自己的
符號。
 最先以橫線、直線、斜線連成者,皆為獲勝的一方。
 當九格都填滿雙方平手。
 分出勝負才能按
namespace OOXX
{
public partial class MainWindow : Window
{
bool turn = true; // true = "X"; false = "O";
int turn_conut = 0; //被點擊按鈕計數
Image pic;
BitmapImage bit;
Record rec;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
againButton.IsEnabled = false;
rec = new Record();
}
private void button_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
if (turn)
{
loadImage(“X”); //讀取O.png或X.png圖檔
btn.Content = pic; //將圖檔賦予給Content
rec.ROW(btn.Name,‘X’); //堆入暫存器(一維陣列)
}
else
{
loadImage("O"); //讀取O.png或X.png圖檔
btn.Content = pic; //將圖檔賦予給Content
rec.ROW(btn.Name, 'O'); //堆入暫存器(一維陣列)
}
btn.IsEnabled = false;
turn_conut++;
check_Winner();
turn = !turn;
}
共
用
同
事
件
省
程
式
碼
private void button_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
Button btn = (Button)sender;
if (btn.IsEnabled)
{
if (turn)
{
loadImage("X");
btn.Content = pic;
}
else
{
loadImage("O");
btn.Content = pic;
}
}
}
private void button_Leave(object sender, System.Windows.Input.MouseEventArgs e)
{
Button btn = (Button)sender;
if (btn.IsEnabled)
btn.Content = "";
}
private void loadImage(string i)
{
pic = new Image();
bit = new BitmapImage();
bit.BeginInit();
bit.UriSource = new Uri("Images/" + i.ToString() + ".png", UriKind.Relative);
bit.EndInit();
pic.Stretch = Stretch.Fill;
pic.Source = bit;
}
namespace OOXX
{
class Record
{
public char[] nineGrid=new char[9];
public void ROW(string Grid, char Both)//例如丟入Record.ROW(A1, 'O');
{
switch (Grid)
{
case "A1":
nineGrid[0] = Both;
break;
case "A2":
nineGrid[1] = Both;
break;
case "A3":
nineGrid[2] = Both;
break;
case "B1":
nineGrid[3] = Both;
break;
case "B2":
nineGrid[4] = Both;
break;
case "B3":
nineGrid[5] = Both;
break;
case "C1":
nineGrid[6] = Both;
break;
case "C2":
nineGrid[7] = Both;
break;
case "C3":
nineGrid[8] = Both;
break;
}
btn.Content = pic;此屬性已是圖檔
將圖檔ToString()轉成字串,不管是OX圖片
都是”System.Window.Contorl.Image”
還有其他疑難雜症…所以就想到…
土法煉鋼法
程式碼又長又臭~~
private void check_Winner()
{
bool born_Winner = false; //有贏家true 沒贏家false
//九宮格暫存器的水平連線判斷
if ((rec.nineGrid[0] == rec.nineGrid[1]) && (rec.nineGrid[1] == rec.nineGrid[2]) && (!A1.IsEnabled))
born_Winner = true;
else if ((rec.nineGrid[3] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[5]) && (!B1.IsEnabled))
born_Winner = true;
else if ((rec.nineGrid[6] == rec.nineGrid[7]) && (rec.nineGrid[7] == rec.nineGrid[8]) && (!C1.IsEnabled))
born_Winner = true;
//九宮格暫存器的垂直連線判斷
else if ((rec.nineGrid[0] == rec.nineGrid[3]) && (rec.nineGrid[3] == rec.nineGrid[6]) && (!A1.IsEnabled))
born_Winner = true;
else if ((rec.nineGrid[1] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[7]) && (!A2.IsEnabled))
born_Winner = true;
else if ((rec.nineGrid[2] == rec.nineGrid[5]) && (rec.nineGrid[5] == rec.nineGrid[8]) && (!A3.IsEnabled))
born_Winner = true;
//九宮格暫存器的橫向連線判斷
else if ((rec.nineGrid[0] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[8]) && (!A1.IsEnabled))
born_Winner = true;
else if ((rec.nineGrid[2] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[6]) && (!A3.IsEnabled))
born_Winner = true;
if (born_Winner)
{
if (turn) //true:"X" ; false:"O"
{
MessageBox.Show("贏家是【X】一方", "恭喜");
disable();
}
else
{
MessageBox.Show("贏家是【O】一方", "恭喜");
disable();
}
}
else if (turn_conut == 9)
{
MessageBox.Show("平手!!!", "Notice");
disable();
}
}
private void disable()
{
//參考http://blog.sina.com.cn/s/blog_87398e6701013j5y.html
foreach (UIElement element in gridUCContent.Children)//進行遍歷
{
if (element is Button)
{
element.IsEnabled = false;
againButton.IsEnabled = true;
}
}
}
private void againButton_Click(object sender, RoutedEventArgs e)
{
againButton.IsEnabled = false;
turn = true;
turn_conut = 0;
Array.Clear(rec.nineGrid, 0, 9); //九宮格暫存器歸零
A1.Content = ""; A2.Content = ""; A3.Content = "";
B1.Content = ""; B2.Content = ""; B3.Content = "";
C1.Content = ""; C2.Content = ""; C3.Content = "";
foreach (UIElement element in gridUCContent.Children)//進行遍歷
{
if (element is Button)
{
if(!(element == againButton))
element.IsEnabled = true;
}
}
}
心得與反省
●以 純字串,判斷輸贏跟顯示太容易沒挑戰性
●採用 來顯示遇到許多困難,測試很久才解決
●太依賴VS C#寫好的物件,反而沒想到直接用C語言
時學的array、swith等
●有時小專案對各狀態逐一key上程式沒關係,
這樣才不會陷入思考的迴圈,除非你要寫演算法
●學到共同事件的用法

OOXX

  • 1.
    OOXX電 機 2B 第 十 組 102103224 許嘉玳 102103244 李偉弘 102103245 許峻杰 102103251 游馭成
  • 2.
  • 3.
    namespace OOXX { public partialclass MainWindow : Window { bool turn = true; // true = "X"; false = "O"; int turn_conut = 0; //被點擊按鈕計數 Image pic; BitmapImage bit; Record rec; public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { againButton.IsEnabled = false; rec = new Record(); } private void button_Click(object sender, RoutedEventArgs e) { Button btn = (Button)sender; if (turn) { loadImage(“X”); //讀取O.png或X.png圖檔 btn.Content = pic; //將圖檔賦予給Content rec.ROW(btn.Name,‘X’); //堆入暫存器(一維陣列) } else { loadImage("O"); //讀取O.png或X.png圖檔 btn.Content = pic; //將圖檔賦予給Content rec.ROW(btn.Name, 'O'); //堆入暫存器(一維陣列) } btn.IsEnabled = false; turn_conut++; check_Winner(); turn = !turn; } 共 用 同 事 件 省 程 式 碼
  • 4.
    private void button_MouseEnter(objectsender, System.Windows.Input.MouseEventArgs e) { Button btn = (Button)sender; if (btn.IsEnabled) { if (turn) { loadImage("X"); btn.Content = pic; } else { loadImage("O"); btn.Content = pic; } } } private void button_Leave(object sender, System.Windows.Input.MouseEventArgs e) { Button btn = (Button)sender; if (btn.IsEnabled) btn.Content = ""; } private void loadImage(string i) { pic = new Image(); bit = new BitmapImage(); bit.BeginInit(); bit.UriSource = new Uri("Images/" + i.ToString() + ".png", UriKind.Relative); bit.EndInit(); pic.Stretch = Stretch.Fill; pic.Source = bit; }
  • 5.
    namespace OOXX { class Record { publicchar[] nineGrid=new char[9]; public void ROW(string Grid, char Both)//例如丟入Record.ROW(A1, 'O'); { switch (Grid) { case "A1": nineGrid[0] = Both; break; case "A2": nineGrid[1] = Both; break; case "A3": nineGrid[2] = Both; break; case "B1": nineGrid[3] = Both; break; case "B2": nineGrid[4] = Both; break; case "B3": nineGrid[5] = Both; break; case "C1": nineGrid[6] = Both; break; case "C2": nineGrid[7] = Both; break; case "C3": nineGrid[8] = Both; break; } btn.Content = pic;此屬性已是圖檔 將圖檔ToString()轉成字串,不管是OX圖片 都是”System.Window.Contorl.Image” 還有其他疑難雜症…所以就想到… 土法煉鋼法 程式碼又長又臭~~
  • 6.
    private void check_Winner() { boolborn_Winner = false; //有贏家true 沒贏家false //九宮格暫存器的水平連線判斷 if ((rec.nineGrid[0] == rec.nineGrid[1]) && (rec.nineGrid[1] == rec.nineGrid[2]) && (!A1.IsEnabled)) born_Winner = true; else if ((rec.nineGrid[3] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[5]) && (!B1.IsEnabled)) born_Winner = true; else if ((rec.nineGrid[6] == rec.nineGrid[7]) && (rec.nineGrid[7] == rec.nineGrid[8]) && (!C1.IsEnabled)) born_Winner = true; //九宮格暫存器的垂直連線判斷 else if ((rec.nineGrid[0] == rec.nineGrid[3]) && (rec.nineGrid[3] == rec.nineGrid[6]) && (!A1.IsEnabled)) born_Winner = true; else if ((rec.nineGrid[1] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[7]) && (!A2.IsEnabled)) born_Winner = true; else if ((rec.nineGrid[2] == rec.nineGrid[5]) && (rec.nineGrid[5] == rec.nineGrid[8]) && (!A3.IsEnabled)) born_Winner = true; //九宮格暫存器的橫向連線判斷 else if ((rec.nineGrid[0] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[8]) && (!A1.IsEnabled)) born_Winner = true; else if ((rec.nineGrid[2] == rec.nineGrid[4]) && (rec.nineGrid[4] == rec.nineGrid[6]) && (!A3.IsEnabled)) born_Winner = true;
  • 7.
    if (born_Winner) { if (turn)//true:"X" ; false:"O" { MessageBox.Show("贏家是【X】一方", "恭喜"); disable(); } else { MessageBox.Show("贏家是【O】一方", "恭喜"); disable(); } } else if (turn_conut == 9) { MessageBox.Show("平手!!!", "Notice"); disable(); } } private void disable() { //參考http://blog.sina.com.cn/s/blog_87398e6701013j5y.html foreach (UIElement element in gridUCContent.Children)//進行遍歷 { if (element is Button) { element.IsEnabled = false; againButton.IsEnabled = true; } } }
  • 8.
    private void againButton_Click(objectsender, RoutedEventArgs e) { againButton.IsEnabled = false; turn = true; turn_conut = 0; Array.Clear(rec.nineGrid, 0, 9); //九宮格暫存器歸零 A1.Content = ""; A2.Content = ""; A3.Content = ""; B1.Content = ""; B2.Content = ""; B3.Content = ""; C1.Content = ""; C2.Content = ""; C3.Content = ""; foreach (UIElement element in gridUCContent.Children)//進行遍歷 { if (element is Button) { if(!(element == againButton)) element.IsEnabled = true; } } }
  • 9.
    心得與反省 ●以 純字串,判斷輸贏跟顯示太容易沒挑戰性 ●採用 來顯示遇到許多困難,測試很久才解決 ●太依賴VSC#寫好的物件,反而沒想到直接用C語言 時學的array、swith等 ●有時小專案對各狀態逐一key上程式沒關係, 這樣才不會陷入思考的迴圈,除非你要寫演算法 ●學到共同事件的用法