基于pygame的象棋游戏三:增加网络支持

用python进行简单的网络编程,代码是很简洁的。

在完成了基本的走棋规则后,我为我的象棋游戏增加了网络功能,代码改动不大,增加了一个网络支持类,在原来的下棋逻辑上增加了网络功能网络支持类代码如下:

NetworkChs.py
1 #-*- encoding: utf-8 -*-
2  import socket
3  import sys
4
5 NETWORK_SUPPORT = 1 #是否提供网络支持
6
7 HOST = 'localhost' # 对方服务器地址
8
9 class ChessNetwork():
10 '''
11 提供网络支持,既是客户端,也是服务器, p2p
12 '''
13 host = ''
14 port = 64255
15
16 def sendChessMove(self, rowFrom, colFrom, rowTo, colTo):
17 '''
18 向对方服务器发送棋子移动信息
19 '''
20 if NETWORK_SUPPORT == 0:
21 return None
22 msg = '%d,%d,%d,%d' % (rowFrom, colFrom, rowTo, colTo)
23 try:
24 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
25 s.connect((HOST, self.port))
26 print 'sendChessMove:'
27 print msg
28 s.send(msg)
29 s.close()
30 except :
31 print 'exception when sendChessMove'
32
33 def getChessMove(self):
34 '''
35 从对方服务器获取棋子移动信息
36 '''
37 if NETWORK_SUPPORT == 0:
38 return None
39 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
40 s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
41 s.bind((self.host,self.port))
42 s.listen(1)
43
44 print 'getChessMove : accept'
45 clientsock,clientaddr = s.accept()
46 while 1:
47 data = clientsock.recv(1024)
48 if not data:
49 break
50 clientsock.close()
51 listRet = data.split(',')
52 for i in range(len(listRet)):
53 listRet[i] = int(listRet[i])
54 return listRet
55
56
57 if __name__ == '__main__':
58 #测试
59 net = ChessNetwork()
60 if len(sys.argv) > 1:
61 #服务器
62 print net.getChessMove()
63 else:
64 #客户端
65 net.sendChessMove(0, 0, 1, 1)
66
67
68

 

在python中,每一个文件都可以被别的文件方便调用,同时每一个文件也可以单独做单元测试,很方便。

 

增加了网络支持的象棋游戏实现了基本的网络对战,不过缺陷也很明显:由于没有增加多线程支持,在等待对方下棋时,界面会卡死。

posted @ 2010-06-03 10:47  stuarts  Views(2526)  Comments(2Edit  收藏  举报