24 Nisan 2013 Çarşamba

Python ile Network Oyunu

Python ile network işlemleri yapmakta çok kolaydır. Bunu sizlere gösterebilmek için bir adet network bazlı çalışan sayı tahmini oyunu kodladık. Kodları incelediğinizde tüm olayı anlayacağınıza inanıyoruz.

Bir adet server.py dosyası geliştireceğiz. Bu dosya belirlediğimiz bir TCP portunu dinlemeye alacak ve bu porta bağlantıda bulunan tüm kullanıcılar için oyunu başlatacaktır.




Oyunun Özellikleri
1 - Birden fazla kullanıcı için hizmet verecektir.
2 - Her oyuncu ilk başta bir username belirleyecektir ve aynı username birden çok kullanılamayacaktır.
3 - Her oyuncunun kaç tahminde sayıyı bulduğu hesaplanacaktır.
4 - Bir oyuncu sayıyı tahmin ettiğinde, kanalda ki tüm oyunlara bu broadcast mesaj olarak bildirilecektir.

#!/usr/bin/env python
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
from random import randrange

class OyunProtocol(LineReceiver):
    def __init__(self, factory):
        self.factory=factory
        self.isim=None
        self.state="kayit"

    def connectionMade(self):
        self.factory.numConnections += 1
        self.sendLine("Merhaba oyuncu! Isminiz nedir ? ")

    def connectionLost(self, reason):
        if self.isim in self.factory.users:
            self.factory.numConnections -= 1
            del self.factory.users[self.isim]
            print "[Disconnect] %s kanaldan ayrildi!" % (self.isim)

    def lineReceived(self, line):
        if self.state == "kayit":
            self.chat_kayit(line)
        else:
            self.chat(line)

    def chat_kayit(self, isim):
        if isim in self.factory.users:
            self.sendLine("Bu isim daha once alinmistir! Lutfen baska isim seciniz")
            return
        self.sendLine("Pythonogreniyorum.com'a Hosgeldin %s" % (isim))
        self.isim= isim
        self.sayi= randrange(0,50)
        self.tahminsayisi=0
        self.factory.users[isim] = self
        self.state="kayitli_kullanici"
        print "[Newuser] %s oyuna geldi! Hedef sayisi = %i" % (self.isim, self.sayi)

    def chat(self, gelen):
        tahmin=int(gelen)
        if tahmin < self.sayi:
            self.sendLine("Kucul geldi :)")
            self.tahminsayisi = self.tahminsayisi + 1
        elif tahmin > self.sayi:
            self.sendLine("Buyuk geldi:)")
            self.tahminsayisi = self.tahminsayisi + 1
        else:
            self.tahminsayisi = self.tahminsayisi + 1
            self.sendLine("TEBRIKLER | Aranan sayi = %s , Tahmin sayisi = %i" % (self.sayi, self.tahminsayisi))
            self.broadcastMessage("%s icin alkislar! Oyunu tamamlandi!" % self.isim)
            self.state="kayit"


    def broadcastMessage(self, message):
        for name, protocol in self.factory.users.iteritems():
            if protocol != self:
                protocol.sendLine(message)

class OyunFactory(Factory):
    def __init__(self):
        self.users = {}
        self.numConnections = 0
    def buildProtocol(self, addr):
        return OyunProtocol(self)

reactor.listenTCP(8000, OyunFactory())
reactor.run()

Server.py'yi çalıştırdık ve 2 farklı kullanıcı sisteme bağlandı.

mince@rootlab:~/PycharmProjects/NetworkOyunu$ python server.py
[Newuser] Mehmet oyuna geldi! Hedef sayisi = 6
[Newuser] Dursun oyuna geldi! Hedef sayisi = 28

İlk kullanıcı sisteme bağlanıyor
mince@rootlab:~$ telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Merhaba oyuncu! Isminiz nedir ? 
Dursun
Pythonogreniyorum.com'a Hosgeldin Dursun
Mehmet icin alkislar! Oyunu tamamlandi!

İkinci kullanıcı sisteme bağlanıyor ve oyunu oynaya başlıyor.
mince@rootlab:~$ telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Merhaba oyuncu! Isminiz nedir ? 
Mehmet
Pythonogreniyorum.com'a Hosgeldin Mehmet
10
Buyuk geldi:)
20
Buyuk geldi:)
30
Buyuk geldi:)
40
Buyuk geldi:)
1
Kucul geldi :)
6
TEBRIKLER | Aranan sayi = 6 , Tahmin sayisi = 6
Mehmet isimli kullanıcı oyunu tamamladığında Dursun isimli kullanıcıya broadcast mesajı iletilmekte.

ALIŞTIRMALAR
Benzer bir oyunu yapınız. Yalnız her oyunu için farklı bir sayı değil. Tüm oyunları aynı sayıyı tahmin etmeye çalışsın. İlk tahmin eden kullanıcının kaç tahminde bulduğu diğer tüm kullanıcılara broadcast mesajı olarak iletilsin.

Kaynaklar :
twisted network programming essentials 2nd edition

0 yorum :

Yorum Gönderme