01/10/2018, 00:34

Kiểm tra Sự kiện click của 2 button, random hình ảnh từ 1 thư mục vào mảng động Button

Tình hình em đang làm đồ án cuối kỳ game Trúc Xanh. Trức mắt em tạo được mảng button động với gắn mỗi button 1 sự kiện click rồi. Nhưng trong hàm click làm sao để em xử lý 2 click 1 cái click trước, 1 cái click sau trong ùng 1 method vậy mọi người.
Tiếp đó là random ảnh từ 1 thư mục vào các mảng button này. Em chỉ biết random 1 lần, còn nếu random lại thì mấy cái hình nó nhảy lộn xộn, tức là hình ban đầu lại random ra hình khác.
Em cảm ơn!

//Hàm create Button

 private void dễToolStripMenuItem_Click(object sender, EventArgs e)
        {
            soTX = 4;
            bt = new Button[soTX][];
            for(int i=0; i<soTX; i++)
            {
                bt[i] = new Button[soTX];
            }
            int top = 50; //Giá  trị Location Top
            for (int i = 0; i < soTX; i++)
            {
                int Left = 50; //Giá trị Location Left
                for (int j = 0; j < soTX; j++)
                {
                    bt[i][j] = new Button();
                    //Thêm cài đặt cho button
                    bt[i][j].Name = "Button" + i + " " + j;
                    bt[i][j].Size = new Size(150, 150);
                    bt[i][j].Left  += Left ;
                    bt[i][j].Top = top;
                    bt[i][j].Image = Image.FromFile("background.jpg");
                    //Tạo sự kiên cho button và gán tới hàm sử lý sự kiện
                    bt[i][j].Click += new EventHandler(button_Click);
                    this.Controls.Add(bt[i][j]);
                    Left += 150;
                }
                top += 150;
            }
        }
// Hàm sự kiện button

private void button_Click(object sender, EventArgs e)
        {
            int id = rd.Next(0, 7);
            Button TX = ((Button)sender);            
            TX.Image = Image.FromFile("matching" + id + ".jpg");
            TX.Enabled = false;
            ButtonSame();
        }
//Hàm kiểm tra button cùng hình

public void ButtonSame()
        {

            for (int i = 0; i < soTX*soTX -1 ; i++)
            {
                for (int j = i+1; j < soTX*soTX; j++)
                {
                    if (bt[i%soTX][i/soTX].Enabled == false && bt[j%soTX][j/soTX].Enabled == false)
                    {
                        //Nếu 2 button đều đã mở thì kiểm tra tiếp xem tag của 2 button có bằng nhau không, nếu bằng nhau thì xóa button.
                        if (bt[i % soTX][i / soTX].Tag.ToString() == bt[j % soTX][j / soTX].Tag.ToString())
                        {
                            System.Threading.Thread.Sleep(500);
                            bt[i % soTX][i / soTX].Enabled = true;
                            bt[j % soTX][j / soTX].Enabled = true;
                            bt[i % soTX][i / soTX].Visible = false;
                            bt[j % soTX][j / soTX].Visible = false;
                        }
                        else
                        {
                            System.Threading.Thread.Sleep(500);
                            bt[i % soTX][i / soTX].Enabled = true;
                            bt[j % soTX][j / soTX].Enabled = true;
                            bt[i % soTX][i / soTX].Image = Image.FromFile("background.jpg");
                            bt[j % soTX][j / soTX].Image = Image.FromFile("background.jpg");
                        }
                    }

                }
            }
        }

*grab popcorn* viết 02:36 ngày 01/10/2018

Vụ click 2 button thì mình có ý kiến thế này.

Tạo 1 biến gọi là clickedButton lưu button vừa được click (null nếu như chưa có button nào đc click)
Lúc click lần thứ 2, nếu button đc click khác clickedButton (tức nó ko cùng là 1 object đó) thì xử lý và reset lại nút clickedButton lại = null.

Mã giã:

if clickedButton == null: // nếu null tức button thứ 1 đc nhấn
 clickedButton = event.getClickedButton
else: //button thứ 2 được nhấn
 if clickedButton == event.getClickedButton:
  return //do nhấn cùng 1 nút đã nhấn rồi nên ko xử lý gì cả
 process(clickedButotn, event.getClickedButton)
 clickedButton = null

Hy vọng đúng ý bạn

Còn vụ random mình chưa hiểu ý của bạn cho lắm.

bphvcg viết 02:39 ngày 01/10/2018

Thanks bạn để mình test thử. Còn cái random ảnh ý là, mình có 8 ảnh, 16 ô button. làm sao random 8 ảnh đó vào 16 ô(mỗi ảnh 2 lần) để khi mình kiểm tra sự kiện click, 2 ảnh giống nhau thì mình xóa button ấy ^^.

*grab popcorn* viết 02:35 ngày 01/10/2018

À nếu vậy thì đây là cách của mình:

Tthay vì bạn random ngẫu nhiên, thì hãy load hình ảnh vào button một cách trật tự sau đó đổi các vị trí button này

Còn ko nếu khó khăn trong việc swap button thì bạn lưu hình ảnh hiển vị vô mảng. Vậy có thể tạo ra 1 mảng chứa đường dẫn tới từng hình ảnh. Với mỗi lần khởi tạo là ta chỉ hoán đổi vị trí của mảng này. Sau đó gán bt[i][j].Image = ImageArray[i][j]

Mã giã

ImageArray[][]  = {{"1.jpg", "1.jpg", "2.jpg", "2.jpg"},
 {"3.jpg", "3.jpg" ... }, {}, {} } // 4x4 mảng lưu đường dẫn hình ảnh

initNewBoard():
 // random vị trí hình ảnh bằng cách swap ngẫu nhiên cặp i_1, j_1 với i_2 với j_2 với số lần ngẫu nhiên N
 swap(ImageArray) 
 for i in range(0, 4): 
  for j in range(0, 4):
   bt[i][j].Image = ImageArray[i][j] //lấy hình ảnh ở vị trí i, j ra làm hình cho button i, j

EDIT: Ko cần copy mảng phụ

bphvcg viết 02:39 ngày 01/10/2018

Ok bạn cảm ơn bạn rất nhiều, để mình làm. Còn thắc mắc gì mình sẽ pm ^^

Bài liên quan
0