2010-08-09 35 views
5

Cách cơ bản nhất để biểu diễn một mặt phẳng tứ giác (một nhóm ô vuông) là sử dụng mảng hai chiều.Hình thức và biểu diễn chuyển động của mặt phẳng lục giác

Trong C# chúng ta tuyên bố này như int[,] và có thể làm cho máy bay của chúng tôi lớn như chúng ta muốn:

string[3,3] => tic-tac-toe board (or similar) 
string[8,8] => chess or checkers board 

Để "di chuyển" một mục trên máy bay, chúng tôi sẽ chỉ asign nó toa mới "vị trí"

//using our tic-tac-toe board: 
string[0,0] = "x"; //top-left 
string[1,1] = "o"; //middle-middle 

//to move 
string[0,1] = bN; //Black Knight's starting positon 
string[2,2] = bN; //Black Knight moves 
string[0,1] = String.Empty; 

Vì vậy, làm cách nào bạn đại diện cho mặt phẳng lục giác (một loạt hình lục giác) và cách di chuyển từ vị trí này sang vị trí tiếp theo sẽ được xử lý?

Lưu ý: Đây không phải là lý thuyết hoàn toàn, vì tôi có ý tưởng cho một trò chơi nhỏ trong đầu của tôi, điều này sẽ yêu cầu loại chuyển động này, nhưng tôi không thể xoay quanh đầu nó. Tôi đã xem xét một số câu hỏi khác ở đây, nhưng thực sự không thể tìm thấy một kết quả phù hợp ...

+0

Bạn đã giải thích "mặt phẳng quadrile", nhưng mặt đất lục giác là cái quái gì? một mặt phẳng 6 chiều? Hay nó là một mặt phẳng 2 chiều có hình dạng như một hình lục giác với một chùm các nửa hình vuông ở hai bên góc cạnh? Các ô vuông có vị trí có sẵn không? –

+0

@Jimmy Hoffa ví dụ về một bảng. http://www.mrlsmath.com/wp-content/uploads/2009/02/hex-game-11x11.gif –

+0

Khá buồn cười khi bạn đưa ra câu hỏi này.Tôi mới bắt đầu làm việc trên trò chơi gạch hình lục giác 2D vào cuối tuần qua. –

Trả lời

7

Tôi không biết đây có phải là giải pháp tối ưu hay không, nhưng tôi sẽ tạo một lớp mới hội đồng quản trị sẽ là một bộ sưu tập của "tế bào" mỗi tế bào sẽ chứa một con trỏ đến mỗi ô lân cận của nó (hoặc null nếu tế bào là trên một cạnh). Bạn có thể thực hiện một số trình vòng lặp trên lớp bảng sẽ đi các ô.

Bạn sẽ phải coi nó giống như Danh sách thay vì vectơ. Nhưng đó là ít nhất là một sự khởi đầu.


Một giải pháp khác được thiết lập bạn lên lên như thế này alt text http://img833.imageshack.us/img833/4739/hexgame11x11.gif

và vẫn chỉ sử dụng [,] để truy cập vào từng tế bào nhưng nó sẽ mất một chút toán hơn để tìm ra nếu bạn đang đi qua tế bào (Phía trên bên phải là [+ 1, -1], Bên phải là [+1,0], Bên phải là [0, + 1], Xuống dưới là [-1, + 1], Bên trái là [-1,0], up Left là [0, -1])

EDIT

Nếu bạn muốn những bức tường thẳng đứng thay vì một nghiêng chỉ cần làm cho chiều rộng của bạn (X) bằng X + Y * 2 sau đó trên mỗi hàng làm cho số hàng hiện tại (y) và làm cho các tế bào 0 Y-y và X-y để X off giới hạn.

Ví dụ:

const int X = 10; 
const int Y = 10; 
int grid[,] = new int[X+(2*Y), Y]; 

bool IsCellOffLimits(int x, int y) 
{ 
    return (x < Y-y || x > X-y || y < 0 || y > Y); 
} 

bạn lãng phí một không gian bộ nhớ nhỏ nhưng nó mang lại cho bạn một bảng như thế này alt text http://img192.imageshack.us/img192/5580/gridw.png

Nếu bạn Rất Clever © bạn chỉ có thể sử dụng không gian bình thường nhưng chỉ có bạn mã có bất kỳ thứ gì trong phạm vi Yy hoặc Xy đó nằm ở phía đối diện của bảng. Tuy nhiên, bệnh tật để lại mã cho người đọc.

+0

Đây có lẽ là giải pháp tốt nhất của bạn. Sự khác biệt thực sự duy nhất giữa một bảng các ô vuông và một bảng các hình lục giác là cách bạn hiển thị nó, không phải cách bạn lưu trữ nó. –

0

Ba hướng, trái/phải, lên/xuống, góc hài hước một chiều/cách khác.

public class Player 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public void MoveLeft() { X++; } 
    public void MoveRight() { X--; } 

    public void MoveUp() { Y++; } 
    public void MoveDown() { Y--; } 

    public void MoveFunny() { Y++; X++; } 
    public void MoveOtherFunny() { Y--; X--; } 
} 
Các vấn đề liên quan