Hikayeler

Reklam vermek için turkmmo@gmail.com

ITJA - SATRANC OYUN SİSTEMİ (FULL SYSTEM - FULL UI)

kaya4572

ITJA
TC Kimlik Numarası Doğrulanmış Üye
Developer
TM Üye
Katılım
23 Haz 2010
Konular
57
Mesajlar
315
Online süresi
1ay 1g
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,551
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!

1776358515321.png


📋 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.)

(#ifdef ENABLE_CHESS_SYSTEM)
Virustotal:

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()]...
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.
 
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.
ü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.
 
Teşekkürler. 5 taş versiyonu veya kağıtla oynadığımız o-x oyunu da gelir mi :D
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst