SORU
12 Kasım 2010, Cuma


Nesne bir Satranç oyunu için Tasarım Odaklı

Ve bir Nesne Odaklı bir şekilde tasarım ve bazı geribildirim almak için bu konuda toplumdan istiyorum nasıl bir fikir almak için çalışıyorum. Aşağıdaki OO bir şekilde dizayn etmek istiyorum bu bir satranç oyunu bir örnektir. Bu çok geniş bir tasarım ve bu aşamada benim odak ne mesajları kimin sorumlu olduğunu ve nesneleri oyunu simüle etmek için birbirleriyle etkileşim nasıl belirlemek için. Lütfen eğer kötü tasarım öğeleri (vb. kötü uyum yüksek kaplin) eğer dışarıda bir nokta ve nasıl onları geliştirmek için.

Satranç oyunu aşağıdaki sınıfları vardır

  • Yönetim Kurulu
  • Oyuncu
  • Parça
  • Kare
  • ChessGame

Kurul, Yönetim Kurulu ve Kare nesneleri yaratmak ve yönetmek için sorumlu olmak üzere iki kez kareler ve. Her parça da her bir parçası da bu kare için bir başvuru var bu yüzden bir kare. (Bu mantıklı mı?). Her parça, daha sonra başka bir kare kendisini taşımak için sorumludur. Oyuncu sınıfı var tüm parçalar için başvuruda bulunduğu ve aynı zamanda kendi yaratılış (oyuncu Parçaları oluşturmak Gerekir?) sorumludur . Oyuncu yerden başka bir konuma geçerli konumundan parçanın yer değiştiren parça Sınıfa ait bir yöntemi movePiece çağıran bir yöntem takeTurn vardır. Şimdi Tahta sınıf için sorumlu olmalıdır ne kafam karıştı. Oyunun o anki durumunu belirlemek ve MAÇ bittiğinde de bilmek gerekli olduğunu düşündüm. Ama bir parça zaman bu konuma nasıl kurulu güncel olsun gereken değişiklikleri? hangi parçalar var ve bu parçalar hareket ettikçe güncellemeler alır kareler ayrı bir dizi korumak gerekir?

Ayrıca, ChessGame intially sırasıyla kareler ve parçaları oluşturmak isteyen Yönetim Kurulu ve oyuncu nesneleri oluşturur ve simülasyon Başlat. Kısaca, bu ChessGame kodu gibi görünebilir ne olabilir

Player p1 =new Player();
Player p2 = new Player();

Board b = new Board();

while(b.isGameOver())
{
  p1.takeTurn(); // calls movePiece on the Piece object
  p2.takeTurn();

}

Kurulu devlet güncellenecektir nasıl belirsiz duyuyorum. Parça tahta için bir referans olmalı? Burada sorumluluk yalan olmalı? Ne başvurular kim tutar? Lütfen giriş için bana yardım et ve bu tasarım sorunları işaret lütfen. Kasıtlı olarak herhangi bir algoritma üzerinde duruluyor değilim ya da daha fazla oyun detayları sadece tasarım yönüyle ilgileniyorum oynamak. Bu toplumun değerli bilgiler sağlayabilir umarım.

CEVAP
12 Kasım 2010, Cuma


Ben aslındasadecetam bir C yazdı# satranç tahtası uygulanması, adet, kurallar, vb. Burada (gerçek uygulama almak istemiyorum beri kaldırıldı . onu örnek alarak yaptım kabacatümsenin kodlama eğlenceli):

public enum PieceType {
    None, Pawn, Knight, Bishop, Rook, Queen, King
}

public enum PieceColor {
    White, Black
}

public struct Piece {
    public PieceType Type { get; set; }
    public PieceColor Color { get; set; }
}

public struct Square {
    public int X { get; set; }
    public int Y { get; set; }

    public static implicit operator Square(string str) {
        // Parses strings like "a1" so you can write "a1" in code instead
        // of new Square(0, 0)
    }
}

public class Board {
    private Piece[,] board;

    public Piece this[Square square] { get; set; }

    public Board Clone() { ... }
}

public class Move {
    public Square From { get; }
    public Square To { get; }
    public Piece PieceMoved { get; }
    public Piece PieceCaptured { get; }
    public PieceType Promotion { get; }
    public string AlgebraicNotation { get; }
}

public class Game {
    public Board Board { get; }
    public IList<Move> Movelist { get; }
    public PieceType Turn { get; set; }
    public Square? DoublePawnPush { get; set; } // Used for tracking valid en passant captures
    public int Halfmoves { get; set; }

    public bool CanWhiteCastleA { get; set; }
    public bool CanWhiteCastleH { get; set; }
    public bool CanBlackCastleA { get; set; }
    public bool CanBlackCastleH { get; set; }
}

public interface IGameRules {
    // ....
}

Temel fikir vb Oyun/forum/sadece oyunun durumunu saklamak. Eğer istediğin buysa, onları örneğin bir pozisyon ayarlamak için manipüle edebilirsiniz. Sorumlu olan benim İGameRules arabirimi uygulayan bir sınıf var:

  • Geçerli, rok dahil olmak üzere belirlenmesi ve en geçerken alma.
  • Belirli bir hareket belirleme geçerlidir.
  • Oyuncular kontrol altında olmadığını belirlemek//çıkmaz Şah Mat.
  • Hareket yürütülüyor.

Oyun kuralları ayıran/board sınıflar da türevleri nispeten kolayca uygulayabilirsiniz anlamına gelir. Kurallar tüm yöntemleri arayüzü geçerli olduğunu belirlemek için kontrol edebilirsiniz Game bir nesne al.

Game oyuncu bilgi deposu değil unutmayın. Oyun ne zaman gerçekleştiğini oyun, vb gibi depolama oyun meta sorumlu olan ayrı bir sınıf Table var.

DÜZENLEME:Bu cevap amacı gerçekten ... doldurabilirsiniz şablon kodu benim kod vermek değil unutmayın aslında biraz daha bilgi her öğe, daha fazla yöntemler, vb saklanan vardır. Amacına ulaşmak için çalışıyoruz hedefe doğru rehberlik etmek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Perihelion

    Perihelion

    23 NİSAN 2008
  • Strata1000

    Strata1000

    28 EYLÜL 2009