ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pygame五子棋

2022-07-25 22:34:17  阅读:155  来源: 互联网

标签:BOARDLINE self 五子棋 mixer pygame def CHESSLEN


问题

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

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

已经完成的

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

还需要弄的

实现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+col*CHESSLEN,BOUNDARY+row*CHESSLEN)

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()
`

标签:BOARDLINE,self,五子棋,mixer,pygame,def,CHESSLEN
来源: https://www.cnblogs.com/karl-lighting/p/pygame-chess.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有