Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  Bundan 5-6 ay kadar önce aklımıza gelen bir fikir. Bugün yine gündeme geldi, havada kalmasın, hiç olmazsa forumda tartışalım diye şeedeyim dedim.

Bir web sitesi düşünün;
- Bu sitede satranç programları birbirleriyle kapışıyorlar.
- Programların oynadığı satranç karşılaşmalarını site görsel hale getiriyor. İzleyebiliyorsunuz.
- Katılımcılar kendi satranç algoritmalarını yazıp katılabiliyorlar.
- Bunun için sitenin sağladığı ChessClient isimli dll'i indirip, o dll'deki bir interface'i implement etmeleri yeterli. Sonra yazdıkları programı çalıştırıp bekliyorlar.
- Bir başkası da bu işi yapınca site bu ikisini kapıştırıyor.
- ChessClient.dll katılımcının yazdığı programdan sırası geldiğinde hamle yapmasını istiyor.
- Sırayla oyunculara hamle yaptırıldıktan sonra kazanan belli oluyor.
- Site ayrıca bütün bu karşılaşmaları logluyor, istatistiksel bilgiler veriyor, vs.

Böyle bir şey yapsak katılım nasıl olur bilemiyorum ama az da olsa çok eğleniriz eminim. Şunlara dikkat etmek gerekiyor:
- Katılımcıların yazması gereken kod çok az olmalı. Sadece satranç tahtasındaki taşların durumuna bakarak kendi hamlesini hesaplayacak. Sistemin çalışabilmesi için geri kalan tüm kod ChessClient.dll ve web sitesi üzerinde olacak.
- Web sitesinin fazla yorulmaması için ChessClient.dll'in akıllıca yazılması lazım.
- Satranç bilmeyenler için ileride DamaClient da yazılabilir. :)

Yazılım tasarımını bu forum altında yapmayı düşünüyorum. Dileyen katılabilir.
Ayrıca bkz: Taş Fırın Satrancı (makale)
fizikci
20 Aralık 2006 16:59
2.  Sistem üç katmandan oluşacak:
1. Oyunu idare eden web sitesi. (server)
2. Server ile konuşan (haberleşen) katman. (ChessClient.dll)
3. Katılımcı tarafından yazılan executable. (ChessPlayer)

İkinci ve üçüncü katman client bilgisayarda çalışacak.

Bunlar arasında iletişim şöyle olacak:
- ChessPlayer çalıştırıldığı zaman, ChessClient.dll server'a yeni bir oyuncunun hazır olduğunu bildirecek. Bunun için server'a kullanıcı adı, şifre gönderecek.
- Eğer bu kullanıcı ilk defa oyuna katılıyorsa server kullanıcı adı ve şifresi ile bunu kaydedecek. Eğer daha önce katılmışsa şifresi kontrol edilecek. Ve client'a session id verilecek.
- Bundan sonra her 15 sn'de bir ChessClient.dll servera "durum" soracak. Server şu cevapları verebilir:
- Rakip bekleniyor. (yani henüz rakip yok)
- Rakibin hamlesi bekleniyor. (sıra rakipte)
- Sıra sende (bu durumda ChessClient.dll, ChessPlayer'dan hamleyi öğrenip servera gönderir.)
- Kaybettin
- Kazandın
- Rakip oyundan çekildi

Yani bir haberleşme örneği şöyle olabilir:
ChessClient: username=fizikci/passwd=hjdsgdfg
     Server: SESSIONID=jksd734hfe83hfjd78
ChessClient: Durum nedir?
     Server: Rakip bekleniyor.
ChessClient: Durum nedir?
     Server: Rakip bekleniyor.
ChessClient: Durum nedir?
     Server: Rakip bekleniyor.
ChessClient: Durum nedir?
     Server: Sıra sende.
ChessClient: hamle=Ab1-c4
     Server: Yanlış hamle!
ChessClient: hamle=Ab1-c3
     Server: Kabul edildi.
ChessClient: Durum nedir?
     Server: Rakibin hamlesi bekleniyor.
ChessClient: Durum nedir?
     Server: Rakibin hamlesi bekleniyor.
ChessClient: Durum nedir?
     Server: Rakibin hamlesi bekleniyor.
ChessClient: Durum nedir?
     Server: Sıra sende.
ChessClient: hamle=Ac3-d5
     Server: Kabul edildi.
...
...
ChessClient: Durum nedir?
     Server: Kazandın.

Bu haberleşme tamamen ChessClient.dll ile server arasında geçecek. Katılımcıların işin bu tarafına kafa yorması gerekmeyecek. Onlar sadece ChessClient.dll içindeki bir interface'i implement edecek ve onunla oyunu başlatacak. Bu interface şöyle bir şey olabilir.
public interface IPlayer
{
   string Username {get;}
   string Password {get;}
   Move DoMove(ChessBoard board);
}

Katılımcı bu interface implement eden bir sınıf yazar ve program çalıştırdığında bu sınıfın bir instance'ını oluşturup ChessClient.dll'e parametre olarak geçer. Aşağıdaki gibi;
public static void Main()
{
   IPlayer player = new MyPlayer();
   ChessClient.StartGame(player);
}
Bundan gerisini ChessClient.dll halledecektir.
fizikci
20 Aralık 2006 18:26 ~ 20 Aralık 2006 19:04
3.  Ben de bu ortamın geliştirilmesine katkıda bulunmak isterim. fizikci'nin kurduğu örnek yapı konusunda da ufak bir değişiklik önerim olacak.

ChessClient belli periyodlarla server'i kontrol etmesin. çok dikkatli yazılması kaydıyla Remoting yaparak gerçek zaman üzerinden işlem yapılsın. Bunun nedeni, satranç oyunu da dahil birçok oyunda oyuncuların oynadıkları süre istatistiki olarak tutuluyor. Bu sürelerin doğru olması açısından böyle bir yapının kurulması gerekir. Client belli periyodlarla durumu kontrol ederse bu süre yanlış olur. bkz: http://www.satranc.net/dersler/saat.asp

Ayrıca bu yapı birçok oyun için uyarlanabilir ve yazılımcıların yarışı haline gelebilir. gelmese de biz eğleniriz :o)
bateristt
21 Aralık 2006 23:10
4.  Katıldığın için sağol bateristt.

Remoting kullanırsak firewall'larla, proxy'lerle başımız derde girebilir. Remoting servisini 80 nolu porttan çalıştırmak mümkün ama bu sefer aynı makinada web server kullanamayız. Artı bizim sitenin üzerinde çalıştığı işletim sistemi Linux. Aslında saat meselesini ChessClient.dll takip edebilir. "Sıra sende" cevabını aldıktan sonra ChessPlayer'ın hamlesini (Move) açıkladığı ana kadar geçen süreyi hamleyle birlikte server'a gönderir. Böylece gayet real time olur.

Gerçi ben satrançta saatin ne işe yaradığını tam olarak bilmiyorum. Berabere kalındığı* zaman mı dikkate  alınıyor?
fizikci
22 Aralık 2006 01:52
5.  Bende detaylı bilmiyorum fakat verdiğim linkte "iki tarafın ne kadar zaman harcadığını gösterir" diye açıklamış. Oyunun kazananını belirlemesi ile ilgili değil yani, sadece süre tutmak amaçlı. Fakat süre konusunun da doğru olması sürenin önemli olduğu oyun türlerinde bize fayda sağlar.

Ayrıca süre konusunda söylediğin doğru. Server'in takip etmesi durumunu da unutalım :o) Çünkü server takip ederse Server-client arası iletişim sırasında da süre kaybı olacak. Sonuç olarak oyuncu "Sıra Sende" komutunu aldığı anda süresinin başlaması gerektiği için server'in takip etmesi yanlış oluyor.

public interface IPlayer
{
   string Username {get;}
   string Password {get;}
   Move DoMove(ChessBoard board, TimeSpan duration);
}


interface tasarımı yukarıdaki gibi değişebilir.
bateristt
22 Aralık 2006 09:34
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.
© 2005, Bilişim Kulübü. (1093 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen