2012-10-29 35 views
5

đây là game board chỉ để cung cấp cho bạn một ý tưởng về cách nó trông giống như (bảng này sẽ được mở rộng đến một 7x6)2 liên tiếp C# chương trình trò chơi

những gì tôi muốn làm là phát hiện một người chiến thắng khi 2 màu sắc trong một hàng tương tự như trò chơi "conmect bốn" có tính đến combo chéo. NHƯNG tôi muốn thực hiện điều này bằng cách sử dụng liệt kê bạo lực ..

mã này nằm phía sau chương trình tôi đã thực hiện Tôi không yêu cầu giải pháp tôi chỉ cần trợ giúp về thuật toán hiệu quả

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     private Button[] btns; 
     private Button[] btns2; 

     public Form1() 
     { 
      InitializeComponent(); 

      btns = new Button[] { button2, button3 }; 
      btns2 = new Button[] { button4, button5 }; 


     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

      foreach (var btn in btns) 
      { 
       btn.Enabled = false; 
       btn.BackColor = Color.LightCyan; 
      } 

      foreach (var btn in btns2) 
      { 
       btn.Enabled = false; 
       btn.BackColor = Color.LightCyan; 
      } 
     } 
     public int state; 
     int cc = 0; 
     private void button1_Click(object sender, EventArgs e) 
     { 
      foreach (var btn in btns) 
      { 
        { 
        if (!btn.Enabled) 
        { 
         btn.Enabled = true; 

         if (cc == 0) 
         { 
          cc = 1; 
          btn.BackColor = Color.Red; 
         } 
         else 
         { 
          cc = 0; 
          btn.BackColor = Color.Yellow; 
         } 
         return; 
        } 

       } 
      }  
     } 

     private void button6_Click(object sender, EventArgs e) 
     { 
      foreach (var btn in btns2) 
      { 
       if (!btn.Enabled) 
       { 
        btn.Enabled = true; 

        if (cc == 0) 
        { 
         cc = 1; 
         btn.BackColor = Color.Red; 
        } 
        else 
        { 
         cc = 0; 
         btn.BackColor = Color.Yellow; 

        } 

        return; 
       } 
      } 
     } 
    } 
} 
+0

Điều này có bao giờ mở rộng hơn 2x2 không? –

+0

tôi sẽ mở rộng nó thành 7x6 – Tacit

+0

Có giới hạn về màu sắc không? Chỉ như 2 hoặc 3? – noMAD

Trả lời

10

Đầu tiên, vì hiệu quả và sự tỉnh táo, tôi sẽ giữ trạng thái bảng của mình trong một mảng 2D.

Thứ hai, để phát hiện thắng quốc gia, cho rằng bạn bắt đầu trò chơi với một (lẽ) ban trống, bạn có thể chỉ nhận được vào trạng thái chiến thắng khi một nút thay đổi trạng thái. Và nếu trạng thái thay đổi nút đặt bạn vào trạng thái chiến thắng, thì nút đó phải được tham gia vào trạng thái chiến thắng đó (tức là nó phải là một phần của bạn).

Vì vậy ... bạn không cần phải brute-buộc toàn bộ hội đồng quản trị. Bạn chỉ cần xác định xem nút vừa thay đổi trạng thái là một phần của một dòng. Nói cách khác, chỉ nhìn vào các nút ở trên, bên dưới, bên trái và bên phải (và có thể là đường chéo, câu hỏi của bạn không rõ ràng nếu bạn bao gồm đường chéo) để xem chúng có cùng màu với màu bạn thay đổi hay không . Nếu bất kỳ một trong số đó là, thì đây là trạng thái chiến thắng. Đây là nơi sử dụng một mảng 2D sẽ làm cho bạn cuộc sống dễ dàng hơn nhiều. Nếu nút ở (x, y) được thay đổi, sau đó bạn chỉ cần kiểm tra (x-1, y), (x + 1, y), (x , y-1) và (x, y + 1), (và có thể là đường chéo) đảm bảo thực hiện kiểm tra ranh giới thích hợp, tất nhiên.

Mở rộng mục này thành 3, 4 hoặc nhiều hơn liên tiếp không khó khăn hơn nhiều, ngoại trừ bạn cần phải nhớ rằng bạn có thể đang ở giữa một hàng thay vì kết thúc hoặc đầu kia.

unoptimized Pseudo Mã cho 2 liên tiếp (lưu ý, tôi đã chuyển sang điểm la bàn để tránh lên-sang trái, lên bên phải, vv bởi vì tôi cảm thấy nó được một chút khó sử dụng):

// cell is the cell that last changes, it has an x and y property and a color property 
// board is a member variable, a 2D array of cells. Note [0,0] is the upper-left (NW) corner of the board. 
// boardHeight and boardWidth are member variable with the dimensions of the board 
// board[boardWidth-1, boardHeight-1] is the lower-right (SE) corner of the board 
// returns true for a win, false otherwise 
function checkWin(cell) returns bool { 
    // check west 
    if (cell.x > 0 && board[cell.x - 1, cell.y].color == cell.color) 
     return true; 
    // check northwest 
    if (cell.x > 0 && cell.y > 0 && board[cell.x-1, cell.y-1].color == cell.color) 
     return true; 
    // check north 
    if (cell.y > 0 && board[cell.x, cell.y-1].color == cell.color) 
     return true; 
    // check northeast 
    if (cell.y > 0 && cell.x < boardWidth && board[cell.x+1, cell.y-1].color == cell.color) 
     return true; 
    // checking the other directions is left as an exercise for the reader, hopefully you get the point 
    return false; 
} 

Nếu bạn đang làm hơn 2, tôi muốn suy nghĩ về một hàm đệ quy để đếm số lượng phù hợp với các tế bào sang trái, phải, lên, xuống, và diagnoals

// k is the number of cells in a row for a win 
function checkWin(cell) returns bool { 
    // check west/east 
    int count = checkWest(cell); 
    if (count > k) 
     return true; 
    count += checkEast(cell); 
    if (count > k) 
     return true; 
    // check nw/se 
    count = checkNW(cell); 
    if (count > k) 
     return true; 
    count += checkSE(cell); 
    if (count > k) 
     return true; 
    // and so on, checking N/S and NE/SW 
    return false; 
} 

function checkWest(cell) returns int { 
    // base case, check the boundaries! 
    if (cell.x == 0) 
     return 0; 
    // base case, the cell next to this one doesn't match 
    if (board[cell.x-1,cell.y].color != cell.color) 
     return 0; 
    // recursion, check the next cell in the line 
    return 1 + checkWest(board[cell.x-1,cell.y]); 
} 
+0

+1 Tôi sắp viết một câu trả lời tương tự. Đây là giải pháp hiệu quả nhất vì nó là O (1) mặc dù kích thước của bảng. –

+0

+1, giải pháp tốt đẹp –

+0

nó sẽ là posible cho u towrite một số giả giả xin (cũng sẽ bao gồm đường chéo) – Tacit

1

Đối với một bảng n by m và một combo chiến thắng của k liên tiếp:

int n, m, k; 
byte[,] color = new byte[n, m]; // for two colors, a 0 would correspond to blue, 1 would be red, or however you like 

for (int i = 0; i <= n - k; i++) // don't check all the way to the right because there's no room to win 
{ 
    for (int j = 0; j <= m - k; j++) // don't check all the way down because there's no room to win 
    { 
     // Check here for a win. Check for a win to the right, down right, and down 
    } 
} 
Các vấn đề liên quan