simple turn-based multiplayer game via TCP server/client

alex goretoy aleksandr.goretoy at gmail.com
Sun Jan 4 08:18:45 CET 2009


Since we are on the subject of Rock, Paper, Scissors. I've recntly watched
this one video on how to make a .deb out of .py files and the tutor was
using a rock, paper scissors game.

Not sure how this may come of use to you but, I'll post it anyway for you to
look at. May help somehow.

http://www.google.com/search?hl=en&q=filetype%3Apy+%22rock+paper+scissors%22&btnG=Search

http://www.showmedo.com/videos/video?name=linuxJensMakingDeb&fromSeriesID=37


Hope this help you in your journey for multiplayer game somehow

On Sun, Jan 4, 2009 at 3:58 AM, greywine at gmail.com <greywine at gmail.com>wrote:

> Hi everyone,
>
> I'm learning python to get a multiplayer roleplaying game up and
> running.
>
> I didn't see any simple examples of multiplayer games on the web so I
> thought I'd post mine here.  I choose Rock, Paper, Scissors as a first
> game to experiment with as the game logic/options are easy to
> implement and understand.
>
> Initially, I tried to get the socketserver.TCPServer example in the
> Python Docs to work, but couldn't get my game variables into the
> handle method of the class MyTCPHandler.  And I didn't know how else
> to do it.  I ended up creating my own server & client out of simple
> sockets based on the simple echo server & client examples in the
> Python Docs.
>
> I also wanted to send chat messages OR game variables back & forth,
> but I couldn't figure out how to do the OR, so the basic idea in this
> implementation is to send the dictionary 'game' back and forth.  game
> dict contains all the gaming variables as well as any chat messages.
> The program processes results depending on whether the game is
> starting, there's a chat message, or there's a game move.
>
> Finally, in testing, I ran the server in IDLE, but I had to load a
> command prompt and switch to c:\python30; then type 'python
> rpsmulti.py' for the client every time.  Anyone know how to test
> server/client code strictly in IDLE?
>
> Anyway, try it out and let me know how you would improve it.
>
> John R.
>
> # NAME: rpsmulti.py
> # DESCRIPTION: rock, paper, scissors game multiplayer game
> # AUTHOR: John Robinson
> # DATE: 1/3/09
> # VERSION: Python 3.0
> # TO DO:
> #   .server_address instead of HOST, PORT?
>
> import socket
> from random import choice
> from pickle import dumps, loads
> from pprint import pprint
>
> HOST, PORT = "localhost", 9999  # defined for now
> BUFFSIZE = 1024                 # for socket.send & recv commands
> BACKLOG = 2                     # number of clients supported by
> server
> SECONDS = 3                     # seconds until socket.timeout (not
> implemented)
> # moves dict to translate 'rps' choice
> MOVES = {'r':'Rock',
>         'p':'Paper',
>         's':'Scissors'}
> # outcome dict stores result for all possible scenarios
> OUTCOME = {('p','r'): 'win',
>           ('r','s'): 'win',
>           ('s','p'): 'win',
>           ('p','p'): 'draw',
>           ('r','r'): 'draw',
>           ('s','s'): 'draw',
>           ('r','p'): 'lose',
>           ('s','r'): 'lose',
>           ('p','s'): 'lose'}
>
> def main_menu(game):
>    """ initialize game dict variables & opening screen of the game
> """
>    game['total'] = 0           # total number of games played
>    game['won'] = 0             # total games won by player
>    game['lost'] = 0            # total games lost by player
>    game['drew'] = 0            # total games drew by player
>    game['move'] = ''           # player's move (rps)
>    game['message'] = ''        # player's chat message
>    game['sentmessage'] = ''    # player's previous message
>    game['start'] = True        # setting up the game boolean
>
>    print("\tROCK PAPER SCISSORS\n")
>    if game['name']=='':        # if returning to menu don't display
> the following
>        game['name'] = get_name()
>        print("Welcome "+game['name']+". Remember...")
>        print("Rock smashes scissors! Paper covers Rock! Scissors cuts
> paper!\n")
>    print("1. Play single player game")
>    print("2. Start two player game")
>    print("3. Join two player game")
>    print("4. Quit")
>    print()
>    c = safe_input("Your choice? ", "1234")
>    c = int(c)
>    if c==1:
>        one_player(game)
>    elif c==2:
>        start_two_player(game)
>    elif c==3:
>        two_player_join(game)
>    else:
>        print('Play again soon.')
>
> def safe_input(prompt, values='abcdefghijklmnopqrstuvwxyz'):
>    """ gives prompt, checks first char of input, assures it meets
> given values
>        default is anything goes """
>    while True:
>        i = input(prompt)
>        try:
>            c = i[0].lower()
>        except IndexError:  # the only possible error?!
>            if c=='':
>                print("Try again.")
>        else:
>            if c not in values: # some other character
>                print("Try again.")
>            else:   # looks good. continue.
>                break
>    return i
>
> def get_name():
>    """ returns input as name """
>    while True:
>        name = input("What is your name? ")
>        check = input(name + ". Correct (y/n)? ")
>        if check[0] in 'yY':
>            break
>    return name
>
> def get_result(player, opponent):
>    """ reports opponent's choice;
>        checks player and opponent dicts ['move'] against OUTCOME
> dict;
>        reports result
>        returns player dict with updated values """
>    print(opponent['name'], 'chose %s.' % (MOVES[opponent['move']]))
>    # check lookout dict (OUTCOME dictionary)
>    result = OUTCOME[(player['move'], opponent['move'])]
>    # update game variables
>    player['total'] += 1
>    if result=='win':
>        print('%s beats %s. You win.' % (MOVES[player['move']], MOVES
> [opponent['move']]))
>        player['won'] += 1
>    elif result=='draw':
>        print('%s - %s: no one wins. You draw.' % (MOVES[player
> ['move']], MOVES[opponent['move']]))
>        player['drew'] += 1
>    else:
>        print('%s loses to %s. You lose.' % (MOVES[player['move']],
> MOVES[opponent['move']]))
>        player['lost'] += 1
>    return player
>
> def one_player(game):
>    """ implements one player game with minimal opponent dict """
>    print("\nType (R)ock, (P)aper or (S)cissors to play. (q)uit to
> return to \
> main menu.")
>    opponent = {}
>    opponent['name'] = 'Computer'
>
>    # gaming loop
>    while True:
>        # gets player's choice
>        game['move'] = safe_input('1, 2, 3, GO! ','rpsq')
>        if game['move']=='q':
>            break
>        # computer chooses via random.choice
>        opponent['move'] = choice('rps')
>        # check game outcome dict
>        game = get_result(game, opponent)
>
>    # exit loop
>    print('\nYou won %s, lost %s, drew %s (%s total)\n' % \
>          (game['won'],game['lost'],game['drew'],game['total']))
>    main_menu(game)
>
> def start_two_player(game):
>    """ starts tcp server and implements two player game
>        game dict = player 1"""
>    # Create a socket (SOCK_STREAM means a TCP socket)
>    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>    sock.bind((HOST, PORT))
>    sock.listen(BACKLOG)
>    serverip, serverport = sock.getsockname()
>    print("Running at %s, %s" % (serverip, serverport))
>    print("\nType (R)ock, (P)aper or (S)cissors to play. (q)uit to \
> return to main menu.")
>    print("Waiting for player...")
>
>    client, address = sock.accept()
>    clientip, clientport = address
>    # server/game loop
>    while True:
>        try:
>            P2game = loads(client.recv(BUFFSIZE))   # receive other
> game variables
>        except EOFError:                            # if available
>            print(P2game['name'], "left the game.")
>            break
>        client.send(dumps(game))                    # send our
> variables
>        # it's either the start...
>        if P2game['start']:
>            print(P2game['name'],"logged on at", clientip, clientport)
>            game['start'] = False
>        # or there's a message
>        if P2game['message']!='' and P2game['message']!=game
> ['sentmessage']:
>            print(P2game['name']+': '+P2game['message'])
>            game['sentmessage'] = P2game['message'] # to avoid many
> print calls
>            game['move'] = ''   # message always takes
> priority
>        # or there's a move
>        if game['move']=='':
>            game['move'] = safe_input('1, 2, 3, GO! ')
>            if game['move']=='q':
>                break
>            elif game['move'] not in 'rps':
>                game['message'] = game['move']
>                game['move'] = ''
>        # only check result if P2game also made a move
>        if P2game['move']!='':
>            # check game outcome dict
>            game=get_result(game, P2game)
>            game['move']=''
>    # exit loop
>    client.close()
>    print('\nYou won %s, lost %s, drew %s (%s total)\n' % \
>          (game['won'],game['lost'],game['drew'],game['total']))
>    main_menu(game)
>
> def two_player_join(game):
>    """ joins a tcp server two player game
>        game dict = player 2"""
>    # Create a socket (SOCK_STREAM means a TCP socket)
>    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>    sock.connect((HOST, PORT))
>
>    print("\nType (R)ock, (P)aper or (S)cissors to play. (q)uit to \
> return to main menu.")
>
>    # client/game loop
>    while True:
>        sock.send(dumps(game))
>        try:
>            P1game = loads(sock.recv(BUFFSIZE))
>        except EOFError:
>            print(P1game['name'], "left the game.")
>            break
>        if P1game['start']:
>            print("You're connected to "+P1game['name']+"'s game.")
>            game['start'] = False
>        if P1game['message']!='' and P1game['message']!=game
> ['sentmessage']:
>            print(P1game['name']+': '+P1game['message'])
>            game['sentmessage'] = P1game['message']
>            game['move'] = ''
>        if game['move']=='':
>            game['move'] = safe_input('1, 2, 3, GO! ')
>            if game['move']=='q':
>                break
>            elif game['move'] not in 'rps':
>                game['message'] = game['move']
>                game['move'] = ''
>        if P1game['move']!='':
>            # check game outcome dict
>            game=get_result(game, P1game)
>            game['move']=''
>    # exit loop
>    sock.close()
>    print('\nYou won %s, lost %s, drew %s (%s total)\n' % \
>          (game['won'],game['lost'],game['drew'],game['total']))
>    main_menu(game)
>
> if __name__=='__main__':
>    game = {}               # initialize game dict to store all game
> variables
>    game['name'] = ''       # player's name initially
>    main_menu(game)
>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



-- 
А-Б-В-Г-Д-Е-Ё-Ж-З-И-Й-К-Л-М-Н-О-П-Р-С-Т-У-Ф-Х-Ц-Ч-Ш-Щ-Ъ-Ы-Ь-Э-Ю-Я
а-б-в-г-д-е-ё-ж-з-и-й-к-л-м-н-о-п-р-с-т-у-ф-х-ц-ч-ш-щ-ъ-ы-ь-э-ю-я
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20090104/f54ddc39/attachment.html>


More information about the Python-list mailing list