HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!
Proje Özeti (GAME SOURCE TAFAFI)
Özellik | Detay |
|---|---|
Oyun | Metin2 (MMORPG) |
Modül | Satranç Sistemi (Chess System) |
Dil | C++ |
Mimari | Client-Server MMO yapısı |
Sistem Mimarisi
1. Temel Bileşenler
┌─────────────────────────────────────────┐
│ CChessManager │
│ (Singleton - Oyun Yöneticisi) │
├─────────────────────────────────────────┤
│ • Oyuncu davetleri (Invite) │
│ • Oyun eşleştirme (Matchmaking) │
│ • Bot oyunları (AI) │
│ • Oyuncu hareketleri (Move) │
│ • Çıkış yönetimi (Quit/Logout) │
└─────────────────────────────────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌───────────────┐ ┌───────────────┐
│ CChessGame │◄─────►│ CChessGame │
│ (PVP Oyun) │ │ (Bot Oyun) │
└───────────────┘ └───────────────┘
│
▼
┌───────────────┐
│ 8x8 Board │
│ BYTE[8][8] │
└───────────────┘
Fonksiyonel Özellikler
A. Oyun Modları
Mod | Açıklama | Kod |
|---|---|---|
PVP (Player vs Player) | İki gerçek oyuncu arasında | CChessGame(pkWhite, pkBlack, false) |
PvE (Player vs Bot) | Oyuncu vs Yapay Zeka | CChessGame(pkWhite, NULL, true) |
B. Davet Sistemi (Invitation Flow)
[Oyuncu A] ──Invite()──► [Sunucu] ──Paket► [Oyuncu B]
│
┌─────────┴─────────┐
▼ ▼
Accept() Decline()
│ │
Oyun Başlar İptal Mesajı
C. Paket Protokolü (Network)
Subheader | Amaç | Parametreler |
|---|---|---|
CHESS_SUBHEADER_GC_INVITE | Davet gönder | szName (davet eden) |
CHESS_SUBHEADER_GC_START | Oyun başlat | Bot flag, sıra, rakip adı |
CHESS_SUBHEADER_GC_UPDATE | Taş yerleştir | Pozisyon (x,y), taş tipi |
CHESS_SUBHEADER_GC_MOVE | Hareket bildir | from(x,y) → to(x,y) |
Satranç Kuralları Uygulaması
Taş Tanımları (Enum)
BEYAZ: 1-6 │ SİYAH: 7-12
────────────┼────────────
1: Piyon │ 7: Piyon
2: At │ 8: At
3: Fil │ 9: Fil
4: Kale │ 10: Kale
5: Vezir │ 11: Vezir
6: Şah │ 12: Şah
Hareket Doğrulama (IsValidMove)
Taş | Kurallar |
|---|---|
Piyon | İleri 1 kare, başlangıçta 2 kare, çapraz yeme |
At | "L" şekli (2+1 kare) |
Fil | Çapraz, engel kontrolü |
Kale | Düz, engel kontrolü |
Vezir | Fil + Kale kombinasyonu |
Şah | 1 kare her yöne |
Bot Yapay Zekası
// ExecuteBotMove() - Basit Rastgele AI
1. Siyah taşları tarar (7→0, 0→7)
2. Her taş için 3x3 grid dener (-1,+1)
3. İlk geçerli hamleyi yapar
4. Beyaz oyuncuya bildirir
Değerlendirme: Çok basit, strateji yok, sadece legal move üretiyor.
Teknik Detaylar
Bağımlılıklar
#include "stdafx.h" // Precompiled header
#include "char.h" // Karakter sınıfı
#include "packet.h" // Network paketleri
#include "desc.h" // Socket descriptor
#include "char_manager.h" // Oyuncu yönetimi
#include "utils.h" // Yardımcı fonksiyonlar
Veri Yapıları
Yapı | Kullanım |
|---|---|
std::map<DWORD, CChessGame*> | OyuncuID → Oyun eşleştirme |
std::map<DWORD, DWORD> | Davet eden → Davet edilen |
BYTE m_board[8][8] | Oyun tahtası durumu |
Özellik Tamamlama Durumu[/HEADING#include
Teme#includebaşlatma
[H#include]
Piyon, At, Fil, K#includeir, Şah hareket#includeADING]
#includentrolü (slid#includees)
[HEADING#includeDING]
Renk kontrolü (kendi t#includetme)
#includee PvE modları
Davet/Onay/Red sistemleri#includeork paket yönetimi[/B]
[B#includeEADING=1]
Kullanım Senaryosu
1. Oyuncu komut girer: "/chess invite Ahmet"
2. Sunucu CChessManager::Invite() çağırır
3. Ahmet'e davet paketi gönderilir
4. Ahmet "/chess accept Mehmet" yazarsa:
- CChessGame oluşturulur
- Her iki oyuncuya tahta gönderilir
- Beyaz (Mehmet) başlar
5. Hamleler MakeMove() ile işlenir
6. Bot oyununda: ExecuteBotMove() otomatik yanıt verir[#includentrolü=1]
Proje Amacı: Tam Entegre Satranç Sistemi (PYTHON PACK TARAFI)[/HEADING]┌─────────────────────────────────────────────────────────┐
│ METIN2 MMORPG │
├─────────────────────────────────────────────────────────┤
│ SERVER (C++) │ CLIENT (Python) │
│ ───────────── │ ─────────────── │
│ • chess.cpp / chess.h │ • uichess.py │
│ • Oyun mantığı │ • chesswindow.py │
│ • Bot AI │ • Arayüz/Görsel │
│ • Network paketleri │ • Kullanıcı etkileşim │
│ │ • game.py (tuş) │
│ │ • interfacemodule.py │
└─────────────────────────────────────────────────────────┘
Dosya Analizleri
1. uichess.py - Ana Satranç Penceresi Mantığı
Bileşen | Açıklama |
|---|---|
ChessWindow | Ana satranç pencere sınıfı |
board_state | 8x8 tahta durumu (dict) |
pieces | Taş görselleri (UI.ImageBox) |
selected_pos | Seçili kare koordinatı |
is_my_turn | Sıra kontrolü |
is_white | Oyuncu rengi |
Ana Fonksiyonlar:
# Oyun Akışı
__OnInvite() → Davet gönder (CG_INVITE)
__OnStartBot() → Bot ile oyna (CG_START_BOT)
__OnSelectSlot() → Kare seç/hareket et (CG_MOVE)
__OnQuit() → Oyundan çık (CG_QUIT)
# Server'dan Gelen Cevaplar
OnInvite() → Davet geldi (GC_INVITE)
OnStart() → Oyun başladı (GC_START)
OnUpdateBoard() → Taş yerleştir (GC_UPDATE)
OnMove() → Hareket yapıldı (GC_MOVE)
2. chesswindow.py - UI Script (XML Benzeri)
┌────────────────────────────────────────┐
│ 640x480 Pencere │
├────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────────────┐ │
│ │ │ │ Hamle Geçmişi │ │
│ │ 320x320│ │ (history) │ │
│ │ TAHTA │ ├─────────────────┤ │
│ │ │ │ SÜRE PANEL │ │
│ │ │ │ Siyah │ Beyaz │ │
│ │ │ │ 10:00 │ 10:00 │ │
│ └─────────┘ └─────────────────┘ │
│ │
│ [Davet] [Bot] [Çıkış] │
│ [________Oyuncu İsmi________] │
│ Durum: Beklemede │
└────────────────────────────────────────┘
UI Elemanları:
- board_grid: 8x8 satranç tahtası (40x40 kareler)
- history_panel: Hamle geçmişi (henüz aktif değil)
- clock_panel: Süre göstergesi (henüz aktif değil)
- invite_button / bot_button / quit_button: Kontrol butonları
3. game.py - Klavye Entegrasyonu
# Satır ~380: F7 tuşu ataması
onPressKeyDict[app.DIK_F7] = lambda : self.interface.ToggleChessWindow()
# Satır ~900: Server komutları
"chess_invite" : self.__Chess_OnInvite,
"chess_start" : self.__Chess_OnStart,
"chess_update" : self.__Chess_OnUpdate,
"chess_move" : self.__Chess_OnMove,
"chess_end" : self.__Chess_OnEnd,
4. interfacemodule.py - Arayüz Yöneticisi
# Satır ~45: Satranç penceresi tanımı
self.wndChess = None
# Satır ~200: Pencere oluşturma
def __MakeChessWindow(self):
self.wndChess = uichess.ChessWindow()
# Satır ~350: Toggle fonksiyonu
def ToggleChessWindow(self):
if self.wndChess.IsShow():
self.wndChess.Close()
else:
self.wndChess.Open()
# Satır ~800: Get fonksiyonu (game.py için)
def GetChessWindow(self):
return self.wndChess
Client-Server İletişim Akışı
┌─────────┐ CG_INVITE ┌─────────┐
│ Client │ ─────────────────► │ Server │
│ (F7) │ │ (C++) │
└─────────┘ └─────────┘
│ │
│ GC_INVITE (hedefe) │
│ ◄──────────────────────── │
│ │
│ CG_ACCEPT / CG_DECLINE │
│ ────────────────────────► │
│ │
│ GC_START (her ikisine) │
│ ◄──────────────────────── │
│ │
┌────┴────┐ ┌────┴────┐
│ Oyun │ CG_MOVE │ CChess │
│ Başlar │ ─────────────────► │ Game │
│ │ │ │
│ │ GC_MOVE (rakibe) │ │
│ │ ◄───────────────── │ │
│ │ + Bot AI yanıtı │ │
│ │ ◄───────────────── │ │
└─────────┘ └─────────┘
Sistem Özellikleri
Özellik | Durum | Açıklama |
|---|---|---|
PvP (Player vs Player) | Aktif | İki oyuncu arasında |
PvE (Bot) | Aktif | Basit rastgele AI |
Hamle Geçmişi | UI var, fonksiyon yok | Görsel hazır, kod eksik |
Süre Kontrolü | UI var, fonksiyon yok | Saat göstergesi pasif |
Taş Yeme | Aktif | Server tarafında kontrol |
Piyon Terfisi | Yok | Eksik özellik |
Rok (Castling) | Yok | Eksik özellik |
Şah/Mat Kontrolü | Yok | Eksik özellik |
Görsel Özellikler (uichess.py)
# Taş Boyutlandırma (Satır ~150)
img.SetScale(28.0/float(w), 28.0/float(h)) # 28x28 içinde 40x40 kare
# Çoklu Path Desteği (Crash koruması)
self.path_list = [
"d:/ymir work/ui/chess/",
"ymir work/ui/chess/",
"ui/chess/",
]
# Güvenli Resim Yükleme
__SafeLoadBackground() # Eksik resimleri loglar, crash engelli
Tamamlanma Durumu
Network paket yapısı (CG_* / GC_*)
8x8 tahta görseli
12 taş tipi görseli (w/b_pawn, knight, bishop, rook, queen, king)
Kare seçim mekanizması
Temel hareket gönderimi
Bot oyunu desteği
Davet/Onay/Red sistemi.İndirme Linki (Chess sistemini söküp kullanabilirsiniz.)
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
(#ifdef ENABLE_CHESS_SYSTEM)
Virustotal:
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
DİPNOT: https://forum.turkmmo.com/konu/3770...altyapi-server-files-v3-1-26-08-2022-yayinda/
FİLESİNE SORUNSUZ KURULUP DENENMİŞTİR. BURADAN DİREK BUİLLER ALARAK DENEYEBİLİRSİNİZ!
Son düzenleme:
En Çok Reaksiyon Alan Mesajlar
kodunuzda leak mevcut,
=============
C++:void CChessManager::StartBot(LPCHARACTER pkChr) { CChessGame* pkGame = new CChessGame(pkChr, NULL, true); m_mapGames[pkChr->GetPlayerID()] = pkGame; // leak pkGame->SendGameState(pkChr); }
"StartBot" fonksiyonunu aynı oyuncu birden fazla kez invoke ederse sırayla şunlar gerçekleşir;
-> "m_mapGames" içinde alakalı player id aranır
-> alakalı containerda bu id key olarak tutuluyorsa square brackets(köşeli parantez) operatörü bir "mapped_type&"(lvalue ref) döner, yani sizin durumunuzda (CChessGame*&)
-> ilk invoke'da sorun yok, keyi bulamaz, id'yi containera ekler ve değeri value-initialize eder(bu durumda bir ptr zero-initialized edildiğinde nullptr olur) sonrasında bir value-copy gerçekleşir
-> containerdan silinmeden önce ikinci kez invokelarsa heapde yeni bir alan oluşturup, keyin artık bu objeyi göstermesine sebep olur
-> ve artık eski göstediği alan serbest bırakılmamış olur, bildiğiniz leak hikayesi
keza "Accept" member functionda da aynı durum var.
================
aynı anda iki davet atılabilir gibi duruyor
================
C++:for (int dy = -1; dy <= 1; ++dy) { for (int dx = -1; dx <= 1; ++dx)
bu kontrol sanki oyunu kilitleyebilir gibi duruyor, 1 karelik alan kontrol edilmiş sadece
ufak bir göz gezdirmede göze çarpanlar bunlar; şahsi algılamayın ama lütfen Modern C++ kullanın ve "design" konusunun üzerinde durun, şu an pek kullanılabilir durumda gibi görünmüyor şahsımca.
elinize sağlık.
Elinize sağlık. Başarılar.
kodunuzda leak mevcut,
=============
"StartBot" fonksiyonunu aynı oyuncu birden fazla kez invoke ederse sırayla şunlar gerçekleşir;
-> "m_mapGames" içinde alakalı player id aranır
-> alakalı containerda bu id key olarak tutuluyorsa square brackets(köşeli parantez) operatörü bir "mapped_type&"(lvalue ref) döner, yani sizin durumunuzda (CChessGame*&)
-> ilk invoke'da sorun yok, keyi bulamaz, id'yi containera ekler ve değeri value-initialize eder(bu durumda bir ptr zero-initialized edildiğinde nullptr olur) sonrasında bir value-copy gerçekleşir
-> containerdan silinmeden önce ikinci kez invokelarsa heapde yeni bir alan oluşturup, keyin artık bu objeyi göstermesine sebep olur
-> ve artık eski göstediği alan serbest bırakılmamış olur, bildiğiniz leak hikayesi
keza "Accept" member functionda da aynı durum var.
================
aynı anda iki davet atılabilir gibi duruyor
================
bu kontrol sanki oyunu kilitleyebilir gibi duruyor, 1 karelik alan kontrol edilmiş sadece
ufak bir göz gezdirmede göze çarpanlar bunlar; şahsi algılamayın ama lütfen Modern C++ kullanın ve "design" konusunun üzerinde durun, şu an pek kullanılabilir durumda gibi görünmüyor şahsımca.
elinize sağlık.
=============
C++:
void CChessManager::StartBot(LPCHARACTER pkChr)
{
CChessGame* pkGame = new CChessGame(pkChr, NULL, true);
m_mapGames[pkChr->GetPlayerID()] = pkGame; // leak
pkGame->SendGameState(pkChr);
}
"StartBot" fonksiyonunu aynı oyuncu birden fazla kez invoke ederse sırayla şunlar gerçekleşir;
-> "m_mapGames" içinde alakalı player id aranır
-> alakalı containerda bu id key olarak tutuluyorsa square brackets(köşeli parantez) operatörü bir "mapped_type&"(lvalue ref) döner, yani sizin durumunuzda (CChessGame*&)
-> ilk invoke'da sorun yok, keyi bulamaz, id'yi containera ekler ve değeri value-initialize eder(bu durumda bir ptr zero-initialized edildiğinde nullptr olur) sonrasında bir value-copy gerçekleşir
-> containerdan silinmeden önce ikinci kez invokelarsa heapde yeni bir alan oluşturup, keyin artık bu objeyi göstermesine sebep olur
-> ve artık eski göstediği alan serbest bırakılmamış olur, bildiğiniz leak hikayesi
keza "Accept" member functionda da aynı durum var.
================
aynı anda iki davet atılabilir gibi duruyor
================
C++:
for (int dy = -1; dy <= 1; ++dy)
{
for (int dx = -1; dx <= 1; ++dx)
bu kontrol sanki oyunu kilitleyebilir gibi duruyor, 1 karelik alan kontrol edilmiş sadece
ufak bir göz gezdirmede göze çarpanlar bunlar; şahsi algılamayın ama lütfen Modern C++ kullanın ve "design" konusunun üzerinde durun, şu an pek kullanılabilir durumda gibi görünmüyor şahsımca.
elinize sağlık.
üzerinde fazla durulmadan yapıldı. sadece kod kaynaklarını attım düzenleme vb. geliştirmeler kullanıcıya aittir. stabil oyun oynanmakta ve geliştirme mecburen olacaktır.kodunuzda leak mevcut,
=============
C++:void CChessManager::StartBot(LPCHARACTER pkChr) { CChessGame* pkGame = new CChessGame(pkChr, NULL, true); m_mapGames[pkChr->GetPlayerID()] = pkGame; // leak pkGame->SendGameState(pkChr); }
"StartBot" fonksiyonunu aynı oyuncu birden fazla kez invoke ederse sırayla şunlar gerçekleşir;
-> "m_mapGames" içinde alakalı player id aranır
-> alakalı containerda bu id key olarak tutuluyorsa square brackets(köşeli parantez) operatörü bir "mapped_type&"(lvalue ref) döner, yani sizin durumunuzda (CChessGame*&)
-> ilk invoke'da sorun yok, keyi bulamaz, id'yi containera ekler ve değeri value-initialize eder(bu durumda bir ptr zero-initialized edildiğinde nullptr olur) sonrasında bir value-copy gerçekleşir
-> containerdan silinmeden önce ikinci kez invokelarsa heapde yeni bir alan oluşturup, keyin artık bu objeyi göstermesine sebep olur
-> ve artık eski göstediği alan serbest bırakılmamış olur, bildiğiniz leak hikayesi
keza "Accept" member functionda da aynı durum var.
================
aynı anda iki davet atılabilir gibi duruyor
================
C++:for (int dy = -1; dy <= 1; ++dy) { for (int dx = -1; dx <= 1; ++dx)
bu kontrol sanki oyunu kilitleyebilir gibi duruyor, 1 karelik alan kontrol edilmiş sadece
ufak bir göz gezdirmede göze çarpanlar bunlar; şahsi algılamayın ama lütfen Modern C++ kullanın ve "design" konusunun üzerinde durun, şu an pek kullanılabilir durumda gibi görünmüyor şahsımca.
elinize sağlık.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 8
- Görüntüleme
- 412
- Cevaplar
- 13
- Görüntüleme
- 1K
- Cevaplar
- 0
- Görüntüleme
- 71
- Cevaplar
- 22
- Görüntüleme
- 1K

UI var, fonksiyon yok
Yok