- Katılım
- 23 Haz 2010
- Konular
- 57
- Mesajlar
- 314
- Online süresi
- 1ay 85311s
- Reaksiyon Skoru
- 192
- Altın Konu
- 0
- Başarım Puanı
- 149
- Yaş
- 28
- TM Yaşı
- 15 Yıl 10 Ay 4 Gün
- MmoLira
- 4,536
- DevLira
- 36
Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. 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()]...
- Katılım
- 4 Ocak 2016
- Konular
- 163
- Mesajlar
- 818
- Online süresi
- 1ay 29g
- Reaksiyon Skoru
- 761
- Altın Konu
- 59
- Başarım Puanı
- 214
- TM Yaşı
- 10 Yıl 3 Ay 18 Gün
- MmoLira
- 3,683
- DevLira
- 3
Elinize sağlık. Başarılar.
- Katılım
- 9 Ocak 2019
- Konular
- 229
- Mesajlar
- 1,346
- Online süresi
- 1y 21g
- Reaksiyon Skoru
- 1,293
- Altın Konu
- 2
- Başarım Puanı
- 309
- TM Yaşı
- 7 Yıl 3 Ay 12 Gün
- MmoLira
- 8,270
- DevLira
- 143
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.
- Katılım
- 23 Haz 2010
- Konular
- 57
- Mesajlar
- 314
- Online süresi
- 1ay 85311s
- Reaksiyon Skoru
- 192
- Altın Konu
- 0
- Başarım Puanı
- 149
- Yaş
- 28
- TM Yaşı
- 15 Yıl 10 Ay 4 Gün
- MmoLira
- 4,536
- DevLira
- 36
ü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 : 1, Üye: 0, Misafir: 1)
Benzer konular
- Cevaplar
- 11
- Görüntüleme
- 1K
- Cevaplar
- 22
- Görüntüleme
- 1K
- Cevaplar
- 19
- Görüntüleme
- 2K



UI var, fonksiyon yok
Yok






