五子棋起源于中国,是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。
本内容仅仅涉及到人机对战版,人人对战版后续再推出。
思路:
1、画棋盘
2、人先下白棋,电脑根据自己的算法下黑棋,
3、如此反复,直至某方胜出。
难点在于:
1、电脑五子棋的算法
2、判断哪方赢了
按照这个思路准备,计划代码组成是这样的:
一、
参数文件params.py
'''参数配置文件'''Params = {'WIDTH': 615, #游戏界面宽度'HEIGHT': 615, #游戏界面高度'blockSize': 40, #每块大小'ROWS' : 15, #棋盘共15行,15列,15*15个交叉点'resourcePath': './resource', #资源文件夹'imgFolder': 'imgs', #图片文件夹'fontFolder': 'fonts', #字体文件夹'soundFolder': 'sounds', #声音文件夹'bgColor': (38, 38, 38) #背景色}
从定义上看,五子棋是15*15的,当然这个可以自行调整。
二、
棋子类piece.py,从pygame的Sprite继承一个
import os
import pygame
import math
from params import Paramspygame.init()class Piece(pygame.sprite.Sprite):def __init__(self,pos,color):pygame.sprite.Sprite.__init__(self)self.imagepath = os.path.join(Params.get('resourcePath'), Params.get('imgFolder') , color)self.image = pygame.image.load(self.imagepath).convert_alpha()self.rect = self.image.get_rect()self.pos = posself.blocksize = int(Params.get('blockSize'))self.rows = int(Params.get('ROWS'))
此时我们应该考虑到,棋盘是15*15个交叉点,但是我们再下棋时,往往不会正好下到交叉点上,所以需要是区域中判断,如图:点击红色区域内的都应该算是同一个交叉点的。
所以在piece.py中添加代码如下:
import os
import pygame
import math
from params import Paramspygame.init()class Piece(pygame.sprite.Sprite):...def pointtrans(self):x = []y = []pos_x = pos_y = Nonefor i in range(0,self.rows):x.append(28 + i * self.blocksize)for i in range(0,self.rows):y.append(28 + i * self.blocksize)for each in x:if math.fabs(each - self.pos[0]) < self.blocksize // 2:pos_x = eachfor each in y:if math.fabs(each - self.pos[1]) < self.blocksize // 2:pos_y = eachreturn pos_x,pos_ydef image_rect(self):return self.location()[0] - self.rect.width//2, self.location()[1] - self.rect.height//2
就是说严格按坐标让x=[28,68,108,148,188...,548,588],y也是同样,再循环判断出来就可以形成这么样的(pos_x,pos_y)的结构来表示的棋盘上所有交叉点及下棋点转换:
(28,28),(68,28),(108,28),(148,28),(188,28)....(548,28),(588,28)
(28,68),(68,68),(108,68),(148,68),(188,68)....(548,68),(588,68)
...
(28,548),(68,548),(108,548),(148,548),(188,548)....(548,548),(588,548)
(28,588),(68,588),(108,588),(148,588),(188,588)....(548,588),(588,588)
image_rect函数是获取图片的rect,这是pygame的基本操作,这里就不详细说了。
后续讲解下棋的过程。
python+pygame实现五子棋人机对战之二