问题

有个小问题就是有的时候五个棋子相连却不能判断出来
还有就是黑棋/白棋胜利的字体不能显示出来

游戏的音乐是一个类可以单独考虑,不需要对音乐过度纠结

已经完成的

窗口上画出了棋盘
黑棋下一步,白棋下一步
若横竖斜五子则某方胜利,重开游戏

还需要弄的

实现socket联机
能设置棋盘大小

未来:

以后小型游戏,比较随意的游戏可以用pygame,js
偏大型的游戏客户端还是用unity吧

`
import pygame
import sys
WHITE = (255,255,255)
BLACK = (0,0,0)
BACKCOLOR = (100,180,250)

BOARDLINE = 10
x行x列
BOUNDARY = 50
棋盘到游戏界面边界的距离
CHESSLEN = 50
棋盘里每一棋格的大小
CHESS_R = 20

SCREEN = BOARDLINECHESSLEN+2BOUNDARY
`

`
class Manager:
def init(self):
self.IMG = pygame.image.load('E:/图片/chessboard.jpg')
self.IMG = pygame.transform.scale(self.IMG,(CHESSLEN,CHESSLEN))

self.screen = pygame.display.set_mode((SCREEN,SCREEN))
self.title = pygame.display.set_caption('五子棋')
self.isblack = True
self.boardcount = [[0 for i in range(BOARDLINE)] for i in range(BOARDLINE)]

self.s = Sound()

def mii(self,row,col):
return(BOUNDARY+colCHESSLEN,BOUNDARY+rowCHESSLEN)

def draw(self):
for i in range(BOARDLINE):
for j in range(BOARDLINE):
screenpos = self.mii(i,j)
self.screen.blit(self.IMG,screenpos)

def inarea(self,pos):
return BOUNDARY <= pos[0] <= SCREEN-BOUNDARY and BOUNDARY <= pos[1] <= SCREEN-BOUNDARY

def iim(self,pos):
x = (pos[0]-BOUNDARY)//CHESSLEN
y = (pos[1]-BOUNDARY)//CHESSLEN
return (x,y)

def makemove(self,pos):
if self.boardcount[pos[1]][pos[0]] == 0:
self.boardcount[pos[1]][pos[0]] = 1 if self.isblack else -1
return True
return False

def draw2(self):
for row in range(len(self.boardcount)):
for col in range(len(self.boardcount[row])):
spos = self.mii(row,col)
screenpos = (spos[0]+CHESSLEN/2,spos[1]+CHESSLEN/2)
if self.boardcount[row][col] == 1:
pygame.draw.circle(self.screen,BLACK,screenpos,CHESS_R)
if self.boardcount[row][col] == -1:
pygame.draw.circle(self.screen,WHITE,screenpos,CHESS_R)

def winner(self,a,m2):
if self.heng(m2) or self.shu(m2) or self.xie(m2):
return 1 if a else -1
return 0

def heng(self,m):
x = m[0]
row = self.boardcount[m[1]]
left_start = max(0,x-4)
left_end = x
for i in range(left_start,left_end+1):
if abs(sum(row[i:i+5])) == 5:
return True
return False

def shu(self,m):
y = m[0]
col = self.boardcount[m[0]]
top_start = max(0, y - 4)
top_end = y
for i in range(top_start, top_end + 1):
if abs(sum(col[i:i + 5])) == 5:
return True
return False

def xie(self,m):
x,y = m[0],m[1]
all = []
for i in range(-4,5):
if 0 <= x+i < BOARDLINE and 0 <= y+i < BOARDLINE:
all.append(self.boardcount[y+i][x+i])
roll = self.roll_sum(all,5)
if 5 in roll:
return True

all = []
for i in range(-4, 5):
if 0 <= x + i < BOARDLINE and 0 <= y - i < BOARDLINE:
all.append(self.boardcount[y - i][x + i])
roll = self.roll_sum(all, 5)
if 5 in roll:
return True
return False

def roll_sum(self,values,size):
r = []
for i in range(len(values)-size+1):
r.append(abs(sum(values[i:i+size])))
return r

def end(self,a):
self.draw2()
font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 50)
winner = '黑棋' if a else '白棋'
text = font.render(winner+'获胜了',True,BLACK,None)
self.screen.blit(text,(0,0))
pygame.display.flip()

def main(self):
self.s.back()
while True:
pygame.init()
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit()
sys.exit()
if e.type == pygame.MOUSEBUTTONUP:
clickpos = pygame.mouse.get_pos()#获取鼠标位置
if self.inarea(clickpos):
#self.s.chess_down()
mmp = self.iim(clickpos)
self.isblack = not self.isblack if self.makemove(mmp) else self.isblack
if self.winner(self.isblack,mmp):
self.end(not self.isblack)
self.isblack = True
self.boardcount = [[0 for i in range(BOARDLINE)] for i in range(BOARDLINE)]
self.screen.fill(BACKCOLOR)
self.draw()
self.draw2()
pygame.display.flip()

`

`
class Sound:
def init(self):
pygame.mixer.init()
pygame.mixer.music.load("E:/图片/back.mp3")
self._bomb = pygame.mixer.Sound("E:/图片/walk.mp3")

def back(self,x=0.3,y=-1):
pygame.mixer.music.set_volume(x)
#音量大小
pygame.mixer.music.play(y)
#背景音乐,-1为循环播放

def chess_down(self):
pygame.mixer.Sound.play(self._bomb)

if name == "main":
m = Manager()
m.main()
`