用Python代码实现五子棋游戏

在做python实践的时候突然对python写游戏代码产生兴趣这,于是查了查资料,敲了敲代码,这样能够熟悉pygame模块,发现还挺好玩的

讲解一下编写单机五子棋程序的几个重要部分:
①创建初始化棋盘方法initChessSquare(x,y):根据棋盘图片的交叉点个数,遍历其所有交叉点坐标。
②创建监听各种事件的方法eventHander():如:鼠标点击退出位置,程序能实现退出响应(退出很重要,因为游戏界面的显示就是一个死循环whileTrue;一个不断刷新界面(背景图片)的过程,因此,不做退出操作,此窗口会进入死锁状态,用户将无法操作);鼠标只有点击棋盘的交叉点位置时,才通过pygame.mouse.get_pos()获取鼠标点击的坐标并给出相应的棋子类型value。通过列表封装后,再存入到全局列表initChessList中。
③创建判断输赢的规则方法judgeResult(i,j,value):创建标志位flag为False,当满足赢的规则时,标志位flag再为True;判断横向、纵向、左斜向、右斜向有没有出现5连(在边缘依次向内逐一遍历,是否五个棋子的类型一样,一样则为赢,即五子连珠)
④创建主方法main():其中包含初始化游戏环境pygame.init();绘制游戏窗口pygame.display.set_mode((600,600),0,0)(其中第一个参数(600,600)为设定窗口的大小,第二个参数为标志位,如果不用什么特性就指定为0(指定为FULLSCREEN时,绘制的是一个全屏窗口,如果没有相应的退出机制,只有按
菜单键
才能跳回之前界面),第三个参数为色深);通过pygame.image.load(“图片路径”)的方法加载棋子以及判赢的图片;遍历全局列表initChessList中的子列表,再遍历子列表中封装的棋子类型value,通过之前的响应值来绘制相应棋子类型的图片;当其中一方为赢时,清空棋盘,重新初始化棋盘,绘制赢的图片,再更新显示的视图;最后调用监听事件方法(函数),监听用户的鼠标操作。
⑤定义入口函数,调用主方法main()。

代码如下:

import sys
import time
import pygame        #导入pygame游戏模块
from pygame.locals import *

Chessboardlist = []          #保存棋盘坐标
initRole = 1                #1:代表白棋; 2:代表黑棋
resultFlag = 0              #结果标志

class Gobang():
    def __init__(self,x,y,value):
        '''
        x: 代表x轴坐标
        y: 代表y轴坐标
        value: 当前坐标点的棋子:0:没有棋子 1:白子 2:黑子
        '''
        self.x = x            #初始化成员变量
        self.y = y
        self.value = value

def initChessboard(x,y):     #初始化棋盘
    for i in range(15):       # 每一行的交叉点坐标
        rowlist = []
        for j in range(15):   # 每一列的交叉点坐标
            pointX = x+ j*40
            pointY = y+ i*40
            sp = Gobang(pointX,pointY,0)
            rowlist.append(sp)
        Chessboardlist.append(rowlist)

def eventHander():            #监听各种事件
    for event in pygame.event.get():       #pygame.event.get()    获取事件的返回值
        global initRole
        if event.type == QUIT: #事件类型为退出时
            pygame.quit()      #令Pygame库停止工作
            sys.exit()         #终止程序,在调用sys.exit()终止程序之前,总是应该先调用pygame.quit()
        if event.type == MOUSEBUTTONDOWN: #当点击鼠标时
            x,y = pygame.mouse.get_pos()  #获取点击鼠标的位置坐标
            i=0
            j=0
            for temp in Chessboardlist:
                for point in temp:
                    if x>=point.x-10 and x<=point.x+10 and y>=point.y-10 and y<=point.y+10:
                        if point.value == 0 and initRole == 1:   #当棋盘位置为空;棋子类型为白棋
                            point.value = 1             #鼠标点击时,棋子为白棋
                            judgeResult(i,j,1)
                            initRole = 2                #切换角色
                        elif point.value == 0 and initRole ==2:  #当棋盘位置为空;棋子类型为黑棋
                            point.value = 2             #鼠标点击时,棋子为黑棋
                            judgeResult(i,j,2)
                            initRole = 1                #切换角色
                        break
                    j+=1
                i+=1
                j=0

def judgeResult(i,j,value):   #横向判断
    global resultFlag
    flag = False
    for  x in  range(j - 4, j + 5):  # 横向有没有出现5连(在边缘依次逐一遍历,是否五个棋子的类型一样)
        if x >= 0 and x + 4 < 15 :
            if Chessboardlist[i][x].value == value and \
                Chessboardlist[i][x + 1].value == value and \
                Chessboardlist[i][x + 2].value == value and \
                Chessboardlist[i][x + 3].value == value and \
                Chessboardlist[i][x + 4].value == value :
                flag = True
                break
                pass
    for x in range(i - 4, i + 5):  # 纵向有没有出现5连(在边缘依次逐一遍历,是否五个棋子的类型一样)
        if x >= 0 and x + 4 < 15:
            if Chessboardlist[x][j].value == value and \
                    Chessboardlist[x + 1][j].value == value and \
                    Chessboardlist[x + 2][j].value == value and \
                    Chessboardlist[x + 3][j].value == value and \
                    Chessboardlist[x + 4][j].value == value:
                flag = True
                break
                pass

    # 先判断东北方向的对角下输赢 x 列轴, y是行轴 , i 是行 j 是列(右斜向)(在边缘依次逐一遍历,是否五个棋子的类型一样)
    for x, y in zip(range(j + 4, j - 5, -1), range(i - 4, i + 5)):
        if x >= 0 and x + 4 < 15 and y + 4 >= 0 and y < 15:
            if Chessboardlist[y][x].value == value and \
                    Chessboardlist[y - 1][x + 1].value == value and \
                    Chessboardlist[y - 2][x + 2].value == value and \
                    Chessboardlist[y - 3][x + 3].value == value and \
                    Chessboardlist[y - 4][x + 4].value == value:
                flag = True

    # 2、判断西北方向的对角下输赢 x 列轴, y是行轴 , i 是行 j 是列(左斜向)(在边缘依次逐一遍历,是否五个棋子的类型一样)
    for x, y in zip(range(j - 4, j + 5), range(i - 4, i + 5)):
        if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:
            if Chessboardlist[y][x].value == value and \
                    Chessboardlist[y + 1][x + 1].value == value and \
                    Chessboardlist[y + 2][x + 2].value == value and \
                    Chessboardlist[y + 3][x + 3].value == value and \
                    Chessboardlist[y + 4][x + 4].value == value:
                flag = True


    if flag:               #如果条件成立,证明五子连珠
        resultFlag = value #获取成立的棋子颜色
        print("白棋赢" if value ==1 else "黑棋赢")

# 加载素材
def main():
    global Chessboardlist,resultFlag
    initChessboard(27,27)
    pygame.init()     # 初始化游戏环境
    screen = pygame.display.set_mode((620,620),0,0)          # 创建游戏窗口 # 第一个参数是元组:窗口的长和宽
    pygame.display.set_caption("大碗吃不下")                # 添加游戏标题
    background = pygame.image.load("bg_20190825_083840.png")          #加载背景图片
    whiteStorn = pygame.image.load("storn_white_20190825_083840.png") #加载白棋图片
    blackStorn = pygame.image.load("storn_black.png") #加载黑棋图片
    resultStorn = pygame.image.load("resultStorn.jpg")#加载 赢 时的图片
    rect = blackStorn.get_rect()

    while True:
        screen.blit(background,(0,0))
        for temp in Chessboardlist:
            for point in temp:
                if point.value == 1:          #当棋子类型为1时,绘制白棋
                    screen.blit(whiteStorn,(point.x-18,point.y-18))
                elif point.value == 2:        #当棋子类型为2时,绘制黑棋
                    screen.blit(blackStorn,(point.x-18,point.y-18))

        if resultFlag >0:
            Chessboardlist = []                 # 清空棋盘
            initChessboard(27,27)             # 重新初始化棋盘
            screen.blit(resultStorn,(200,200)) #绘制获胜时的图片
        pygame.display.update()                #更新视图

        if resultFlag >0:
            time.sleep(3)
            resultFlag = 0                     #置空之前的获胜结果
        eventHander()                          #调用之前定义的事件函数
if __name__ == '__main__':
    main()        #调用主函数绘制窗口
    pass

注意!!!
其中用到的图片:黑棋、白棋、棋盘,可以通过百度网盘获取,但一定记得要将图片与代码源文件保存在一个文件夹中才可以运行成功

链接:https://pan.baidu.com/s/1EXnVDuuSxYaI2HrmXhpHog
提取码:eujv

加油加油
  • 10
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,以下是实现五子棋游戏Python代码: ```python import numpy as np BOARD_SIZE = 15 EMPTY = 0 PLAYER_X = 1 PLAYER_O = 2 WIN_N = 5 class GameState: def __init__(self): self.board = np.zeros((BOARD_SIZE, BOARD_SIZE), dtype=int) self.current_player = PLAYER_X self.winner = None self.is_ended = False def get_valid_moves(self): return np.transpose(np.where(self.board == EMPTY)) def move(self, point): if self.is_ended: raise ValueError("Game has already ended.") if self.board[point[0], point[1]] != EMPTY: raise ValueError(f"Invalid move: {point}") self.board[point[0], point[1]] = self.current_player self._check_win() if self.winner is not None: self.is_ended = True else: self.current_player = PLAYER_O if self.current_player == PLAYER_X else PLAYER_X def _check_win(self): for r in range(BOARD_SIZE): for c in range(BOARD_SIZE): if self.board[r, c] == EMPTY: continue if c + WIN_N <= BOARD_SIZE and np.all(self.board[r, c:c + WIN_N] == self.board[r, c]): self.winner = self.current_player if r + WIN_N <= BOARD_SIZE and np.all(self.board[r:r + WIN_N, c] == self.board[r, c]): self.winner = self.current_player if c + WIN_N <= BOARD_SIZE and r + WIN_N <= BOARD_SIZE and \ np.all(self.board[r:r + WIN_N, c:c + WIN_N].diagonal() == self.board[r, c]): self.winner = self.current_player if c >= WIN_N - 1 and r + WIN_N <= BOARD_SIZE and \ np.all(np.fliplr(self.board[r:r + WIN_N, c - WIN_N + 1:c + 1]).diagonal() == self.board[r, c]): self.winner = self.current_player if __name__ == '__main__': game = GameState() while not game.is_ended: print(game.board) valid_moves = game.get_valid_moves() print(f"Valid moves: {valid_moves}") player_input = input(f"Player {game.current_player}, enter move (row, col): ") move = tuple(map(int, player_input.split(','))) game.move(move) print(f"Game is over. Winner: {game.winner}") ``` 这个代码实现了一个基本的五子棋游戏,可以在命令行运行。首先创建一个 `GameState` 实例,用它来管理游戏状态。`board` 属性是一个二维数组,代表棋盘状态;`current_player` 属性记录当前轮到哪个玩家下棋;`winner` 属性记录赢家,如果游戏还没有结束则为 `None`;`is_ended` 属性记录游戏是否结束。`get_valid_moves` 方法返回一个二维数组,包含了当前能够下的合法位置。`move` 方法用于让当前玩家下棋,它会检查游戏状态是否合法,并且判断是否有任何一方已经获胜,如果有则将 `winner` 标记为赢家,将 `is_ended` 设为 `True`。最后在主循环中不断打印棋盘状态和合法位置,接收用户输入下棋位置,并更新游戏状态,直到游戏结束。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值