精华内容
下载资源
问答
  • python五子棋游戏代码实现

    万次阅读 多人点赞 2019-08-25 09:54:01
    单机五子棋代码实现(python五子棋的规则大家肯定都了解,也是大家在百忙之中娱乐的一部分,也都在网上玩过五子棋的游戏,那么大家有没有想过自己编写一个五子棋游戏呢。很多人都感觉做“游戏”这个词汇听着就...

    单机五子棋的代码实现(python)

    五子棋的规则大家肯定都了解,也是大家在百忙之中娱乐的一部分,也都在网上玩过五子棋的游戏,那么大家有没有想过自己编写一个五子棋游戏呢。很多人都感觉做“游戏”这个词汇听着就很难,不知道怎么去实现。那么“接下来就是见证奇迹的时刻”。

    思路:

    (1)准备好棋盘图片,棋子图片(白棋、黑棋),获胜时的图片共四张。想要图片资源可以点击此链接: https://pan.baidu.com/s/13Ajqv29YXL2zWlDNk63rxA 提取码: rvh2 ;最好将图片文件夹放在自己要创建的项目里。
    (2)以下是编写单机五子棋程序的几个重要部分:
    【1】创建初始化棋盘方法initChessSquare(x,y):根据棋盘图片的交叉点个数,遍历其所有交叉点坐标。
    【2】创建监听各种事件的方法eventHander():如:鼠标点击退出位置,程序能实现退出响应(退出很重要,因为游戏界面的显示就是一个死循环whileTrue;一个不断刷新界面(背景图片)的过程,因此,不做退出操作,此窗口会进入死锁状态,用户将无法操作);鼠标只有点击棋盘的交叉点位置时,才通过pygame.mouse.get_pos()获取鼠标点击的坐标并给出相应的棋子类型value。通过列表封装后,再存入到全局列表initChessList中。
    【3】创建判断输赢的规则方法judgeResult(i,j,value):创建标志位flag为False,当满足赢的规则时,标志位flag再为True;判断横向、纵向、左斜向、右斜向有没有出现5连(在边缘依次向内逐一遍历,是否五个棋子的类型一样,一样则为赢,即五子连珠)
    【4】创建主方法main():其中包含初始化游戏环境pygame.init();绘制游戏窗口pygame.display.set_mode((600,600),0,0)(其中第一个参数(600,600)为设定窗口的大小,第二个参数为标志位,如果不用什么特性就指定为0(指定为FULLSCREEN时,绘制的是一个全屏窗口,如果没有相应的退出机制,只有按 菜单键 才能跳回之前界面),第三个参数为色深);通过pygame.image.load(“图片路径”)的方法加载棋子以及判赢的图片;遍历全局列表initChessList中的子列表,再遍历子列表中封装的棋子类型value,通过之前的响应值来绘制相应棋子类型的图片;当其中一方为赢时,清空棋盘,重新初始化棋盘,绘制赢的图片,再更新显示的视图;最后调用监听事件方法(函数),监听用户的鼠标操作。
    【5】定义入口函数,调用主方法main()。
    至此,单机五子棋完成,当然,有的地方还可进一步完善,但对于初学者来说,如上的大体概括已经受用了。如上思路只作为下面具体的代码参考。

    具体实现代码如下:
    import pygame        #导入pygame游戏模块
    import time
    import sys
    from pygame.locals import *
    
    initChessList = []          #保存的是棋盘坐标
    initRole = 1                #1:代表白棋; 2:代表黑棋
    resultFlag = 0              #结果标志
    
    class StornPoint():
        def __init__(self,x,y,value):
            '''
            :param x: 代表x轴坐标
            :param y: 代表y轴坐标
            :param value: 当前坐标点的棋子:0:没有棋子 1:白子 2:黑子
            '''
            self.x = x            #初始化成员变量
            self.y = y
            self.value = value
    
    def initChessSquare(x,y):     #初始化棋盘
        for i in range(15):       # 每一行的交叉点坐标
            rowlist = []
            for j in range(15):   # 每一列的交叉点坐标
                pointX = x+ j*40
                pointY = y+ i*40
                sp = StornPoint(pointX,pointY,0)
                rowlist.append(sp)
            initChessList.append(rowlist)
    
    def eventHander():            #监听各种事件
        for event in pygame.event.get():
            global initRole
            if event.type == QUIT:#事件类型为退出时
                pygame.quit()
                sys.exit()
            if event.type == MOUSEBUTTONDOWN: #当点击鼠标时
                x,y = pygame.mouse.get_pos()  #获取点击鼠标的位置坐标
                i=0
                j=0
                for temp in initChessList:
                    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 initChessList[i][x].value == value and \
                    initChessList[i][x + 1].value == value and \
                    initChessList[i][x + 2].value == value and \
                    initChessList[i][x + 3].value == value and \
                    initChessList[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 initChessList[x][j].value == value and \
                        initChessList[x + 1][j].value == value and \
                        initChessList[x + 2][j].value == value and \
                        initChessList[x + 3][j].value == value and \
                        initChessList[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 initChessList[y][x].value == value and \
                        initChessList[y - 1][x + 1].value == value and \
                        initChessList[y - 2][x + 2].value == value and \
                        initChessList[y - 3][x + 3].value == value and \
                        initChessList[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 initChessList[y][x].value == value and \
                        initChessList[y + 1][x + 1].value == value and \
                        initChessList[y + 2][x + 2].value == value and \
                        initChessList[y + 3][x + 3].value == value and \
                        initChessList[y + 4][x + 4].value == value:
                    flag = True
    
    
        if flag:               #如果条件成立,证明五子连珠
            resultFlag = value #获取成立的棋子颜色
            print("白棋赢" if value ==1 else "黑棋赢")
    
    # 加载素材
    def main():
        global initChessList,resultFlag
        initChessSquare(27,27)
        pygame.init()     # 初始化游戏环境
        screen = pygame.display.set_mode((620,620),0,0)          # 创建游戏窗口 # 第一个参数是元组:窗口的长和宽
        pygame.display.set_caption("老手er五子棋")                # 添加游戏标题
        background = pygame.image.load("images/bg.png")          #加载背景图片
        whiteStorn = pygame.image.load("images/storn_white.png") #加载白棋图片
        blackStorn = pygame.image.load("images/storn_black.png") #加载黑棋图片
        resultStorn = pygame.image.load("images/resultStorn.jpg")#加载 赢 时的图片
        rect = blackStorn.get_rect()
    
        while True:
            screen.blit(background,(0,0))
            for temp in initChessList:
                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:
                initChessList = []                 # 清空棋盘
                initChessSquare(27,27)             # 重新初始化棋盘
                screen.blit(resultStorn,(200,200)) #绘制获胜时的图片
            pygame.display.update()                #更新视图
    
            if resultFlag >0:
                time.sleep(3)
                resultFlag = 0                     #置空之前的获胜结果
            eventHander()                          #调用之前定义的事件函数
    if __name__ == '__main__':
        main()        #调用主函数绘制窗口
        pass
    

    至此,对访问当前博客的你来说,或许对游戏也有了新的认识吧!没错,之前的我也感同身受。时不我待,咱们下篇博客见。当然,如有纰漏,请多指教

    展开全文
  • Python五子棋游戏源代码源程序

    千次阅读 2020-06-02 12:11:04
    五子棋游戏,我们将游戏分为两个方面:一个是棋盘,另一个是棋子,利用横线和纵线将棋盘分成一个个小方格,当黑子或者白子形成5个棋子连线时,显示胜利者,游戏结束。本程序难点在于确定胜利条件。 import pygame ...

    五子棋游戏,我们将游戏分为两个方面:一个是棋盘,另一个是棋子,利用横线和纵线将棋盘分成一个个小方格,当黑子或者白子形成5个棋子连线时,显示胜利者,游戏结束。本程序难点在于确定胜利条件。
    在这里插入图片描述

    
    import pygame as pg
    class Chessboard:  # 设置棋盘
        def __init__(s):
            s.grid_lenght = 26                               #棋盘格子的边长
            s.grid_count = 20                                #格子的数量
            s.start_x = 150                                  #棋盘初始点坐标,左上角的坐标
            s.start_y = 50
            s.edge_lenght = s.grid_lenght / 2                #棋盘周围边缘的长度13
    
    
            s.piece = "black"
            s.winner = None
            s.gameover = False
            s.grid = []
            for i in range(s.grid_count):                      #棋盘大小为20*20个格子
                s.grid.append(list("." * s.grid_count))
    
    
    
    
        def handle_event(s, e):
            origin_x = s.start_x - s.edge_lenght
            origin_y = s.start_y - s.edge_lenght
            chessboard_lenght = (s.grid_count - 1) * s.grid_lenght + s.edge_lenght * 2
            mouse_pos = e.pos                                  #鼠标位置在棋盘坐标内
            if (mouse_pos[0] > origin_x and mouse_pos[0] <= origin_x + chessboard_lenght) and (
                    mouse_pos[1] >= origin_y and mouse_pos[1] <= origin_y + chessboard_lenght):
                if not s.gameover:
                    x = mouse_pos[0] - origin_x                 #X轴方向距离
                    c = int(x / s.grid_lenght)                  #换算出X轴第几格
                    y = mouse_pos[1] - origin_y
                    r = int(y / s.grid_lenght)                  #换算出Y轴第几格
                    if s.set_piece(r, c):
                        s.check_win(r, c)
    
    
        def set_piece(s, r, c):
            if s.grid[r][c] == ".":                             #该位置没有棋子
                s.grid[r][c] = s.piece
                if s.piece == "black":                          #交替使用棋子
                    s.piece = "white"
                else:
                    s.piece = "black"
                return True
            return False
    
    
        def check_win(s, r, c):
            n_count = s.get_continuous_count(r, c, -1, 0)            #上方向相周颜色棋子数量
            s_count = s.get_continuous_count(r, c, 1, 0)             #下方相同颜色棋子数量
            w_count = s.get_continuous_count(r, c, 0, -1)            #左方
            e_count = s.get_continuous_count(r, c, 0, 1)             #右方
            nw_count = s.get_continuous_count(r, c, -1, -1)          #左上方
            ne_count = s.get_continuous_count(r, c, -1, 1)           #右上方
            sw_count = s.get_continuous_count(r, c, 1, -1)           #左下方
            se_count = s.get_continuous_count(r, c, 1, 1)            #右下方
            if (n_count + s_count + 1 >= 5) or (e_count + w_count + 1 >= 5) or (se_count + nw_count + 1 >= 5) or (
                    ne_count + sw_count + 1 >= 5):
                s.winner = s.grid[r][c]
                s.gameover = True
    
    
        def get_continuous_count(s, r, c, dr, dc):            #统计一个方向的同颜色棋子数量
            piece = s.grid[r][c]
            result = 0
            i = 1
            while True:
                new_r = r + dr * i
                new_c = c + dc * i
                if 0 <= new_r < s.grid_count and 0 <= new_c < s.grid_count:
                    if s.grid[new_r][new_c] == piece:              #该方向颜色相同则加上
                        result += 1
                    else:
                        break
                else:
                    break
                i += 1
            return result
    
    
        def draw(s, screen):
            pg.draw.rect(screen, (185, 122, 87), [s.start_x - s.edge_lenght, s.start_y - s.edge_lenght,              #画棋盘
                                                  (s.grid_count - 1) * s.grid_lenght + s.edge_lenght * 2,
                                                  (s.grid_count - 1) * s.grid_lenght + s.edge_lenght * 2], 0)
            for r in range(s.grid_count):                                                                           #画棋盘横线
                y=s.start_y+r*s.grid_lenght
                pg.draw.line(screen,(0,0,0),[s.start_x,y],[s.start_x+s.grid_lenght*(s.grid_count-1),y],2)
            for c in range(s.grid_count):                                                                           #画棋盘竖线
                x = s.start_x+c*s.grid_lenght
                pg.draw.line(screen, (0, 0, 0), [x,s.start_y], [x,s.start_y + s.grid_lenght * (s.grid_count - 1)], 2)
            for r in range(s.grid_count):
                for c in range(s.grid_count):
                    piece=s.grid[r][c]
                    if piece!=".":
                        if piece=="black":                                           #设置棋子颜色
                            color=(0,0,0)
                        else:
                            color=(255,255,255)
                        x=s.start_x+c*s.grid_lenght
                        y=s.start_y+r*s.grid_lenght
                        pg.draw.circle(screen,color,[x,y],s.grid_lenght//2)             #在棋盘上画棋子
    class Gomoku:
        def __init__(s):
            pg.init()
            s.screen=pg.display.set_mode((800,600))
            pg.display.set_caption("五子棋对战")
            s.clock=pg.time.Clock()
            s.font=pg.font.Font(u"C:\Windows\Fonts\Candarab.ttf", 24)
            s.going=True
            s.chessboard=Chessboard()
        def loop(s):                               #主循环
            while s.going:
                s.update()
                s.draw()
                s.clock.tick(50)
            pg.quit()
        def update(s):                            #更新画面
            for e in pg.event.get():
                if e.type==pg.QUIT:
                    s.going=False
                elif e.type==pg.MOUSEBUTTONDOWN:
                    s.chessboard.handle_event(e)
        def draw(s):
            s.screen.fill((255,255,255))                          #窗口底色为白色
            s.screen.blit(s.font.render("FPS:{0:.2F}".format(s.clock.get_fps()),True,(0,0,0)),(10,10))
            s.chessboard.draw(s.screen)                          #画棋盘窗口
            if s.chessboard.gameover:
                s.screen.blit(s.font.render("{0}Win".format("black"if s.chessboard.winner=="black"else"white"),True,(0,0,0)),(500,10))
            pg.display.update()                                 #更新界面
    if __name__=="__main__":
        game=Gomoku()
        game.loop()
    

    更多Python源代码,请关注公众号:Python代码大全
    在这里插入图片描述

    展开全文
  • 简介这是实验室2018年底招新时的考核题目,使用Python编写一个能够完成基本对战的五子棋游戏。面向新手。程序主要包括两个部分,图形创建与逻辑编写两部分。程序的运行结果:样式创建老规矩,先把用到的包导入进来。...

    简介

    这是实验室2018年底招新时的考核题目,使用Python编写一个能够完成基本对战的五子棋游戏。面向新手。

    程序主要包括两个部分,图形创建与逻辑编写两部分。

    程序的运行结果:

    2020828133148337.jpg

    样式创建

    老规矩,先把用到的包导入进来。

    '''

    @Auther : gaoxin

    @Date : 2019.01.01

    @Version : 1.0

    '''

    from tkinter import *

    import math

    然后建立一个样式的类,类名称chessBoard。这里加了很多注释,避免新手看不懂函数的作用,说实话我觉得挺别扭的。

    #定义棋盘类

    class chessBoard() :

    def __init__(self) :

    #创建一个tk对象,即窗口

    self.window = Tk()

    #窗口命名

    self.window.title("五子棋游戏")

    #定义窗口大小

    self.window.geometry("660x470")

    #定义窗口不可放缩

    self.window.resizable(0,0)

    #定义窗口里的画布

    self.canvas=Canvas(self.window , bg="#EEE8AC" , width=470, height=470)

    #画出画布内容

    self.paint_board()

    #定义画布所在的网格

    self.canvas.grid(row = 0 , column = 0)

    def paint_board(self) :

    #画横线

    for row in range(0,15) :

    if row == 0 or row == 14 :

    self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 2)

    else :

    self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 1)

    #画竖线

    for column in range(0,15) :

    if column == 0 or column == 14 :

    self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 ,width = 2)

    else :

    self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 , width = 1)

    #画圆

    self.canvas.create_oval(112, 112, 118, 118, fill="black")

    self.canvas.create_oval(352, 112, 358, 118, fill="black")

    self.canvas.create_oval(112, 352, 118, 358, fill="black")

    self.canvas.create_oval(232, 232, 238, 238, fill="black")

    self.canvas.create_oval(352, 352, 358, 358, fill="black")

    逻辑编写

    这里的主要看每个函数的功能就好了。

    #定义五子棋游戏类

    #0为黑子 , 1为白子 , 2为空位

    class Gobang() :

    #初始化

    def __init__(self) :

    self.board = chessBoard()

    self.game_print = StringVar()

    self.game_print.set("")

    #16*16的二维列表,保证不会out of index

    self.db = [([2] * 16) for i in range(16)]

    #悔棋用的顺序列表

    self.order = []

    #棋子颜色

    self.color_count = 0

    self.color = 'black'

    #清空与赢的初始化,已赢为1,已清空为1

    self.flag_win = 1

    self.flag_empty = 1

    self.options()

    #黑白互换

    def change_color(self) :

    self.color_count = (self.color_count + 1 ) % 2

    if self.color_count == 0 :

    self.color = "black"

    elif self.color_count ==1 :

    self.color = "white"

    #落子

    def chess_moving(self ,event) :

    #不点击“开始”与“清空”无法再次开始落子

    if self.flag_win ==1 or self.flag_empty ==0 :

    return

    #坐标转化为下标

    x,y = event.x-25 , event.y-25

    x = round(x/30)

    y = round(y/30)

    #点击位置没用落子,且没有在棋盘线外,可以落子

    while self.db[y][x] == 2 and self.limit_boarder(y,x):

    self.db[y][x] = self.color_count

    self.order.append(x+15*y)

    self.board.canvas.create_oval(25+30*x-12 , 25+30*y-12 , 25+30*x+12 , 25+30*y+12 , fill = self.color,tags = "chessman")

    if self.game_win(y,x,self.color_count) :

    print(self.color,"获胜")

    self.game_print.set(self.color+"获胜")

    else :

    self.change_color()

    self.game_print.set("请"+self.color+"落子")

    #保证棋子落在棋盘上

    def limit_boarder(self , y , x) :

    if x<0 or x>14 or y<0 or y>14 :

    return False

    else :

    return True

    #计算连子的数目,并返回最大连子数目

    def chessman_count(self , y , x , color_count ) :

    count1,count2,count3,count4 = 1,1,1,1

    #横计算

    for i in range(-1 , -5 , -1) :

    if self.db[y][x+i] == color_count :

    count1 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y][x+i] == color_count :

    count1 += 1

    else:

    break

    #竖计算

    for i in range(-1 , -5 , -1) :

    if self.db[y+i][x] == color_count :

    count2 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y+i][x] == color_count :

    count2 += 1

    else:

    break

    #/计算

    for i in range(-1 , -5 , -1) :

    if self.db[y+i][x+i] == color_count :

    count3 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y+i][x+i] == color_count :

    count3 += 1

    else:

    break

    #\计算

    for i in range(-1 , -5 , -1) :

    if self.db[y+i][x-i] == color_count :

    count4 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y+i][x-i] == color_count :

    count4 += 1

    else:

    break

    return max(count1 , count2 , count3 , count4)

    #判断输赢

    def game_win(self , y , x , color_count ) :

    if self.chessman_count(y,x,color_count) >= 5 :

    self.flag_win = 1

    self.flag_empty = 0

    return True

    else :

    return False

    #悔棋,清空棋盘,再画剩下的n-1个棋子

    def withdraw(self ) :

    if len(self.order)==0 or self.flag_win == 1:

    return

    self.board.canvas.delete("chessman")

    z = self.order.pop()

    x = z%15

    y = z//15

    self.db[y][x] = 2

    self.color_count = 1

    for i in self.order :

    ix = i%15

    iy = i//15

    self.change_color()

    self.board.canvas.create_oval(25+30*ix-12 , 25+30*iy-12 , 25+30*ix+12 , 25+30*iy+12 , fill = self.color,tags = "chessman")

    self.change_color()

    self.game_print.set("请"+self.color+"落子")

    #清空

    def empty_all(self) :

    self.board.canvas.delete("chessman")

    #还原初始化

    self.db = [([2] * 16) for i in range(16)]

    self.order = []

    self.color_count = 0

    self.color = 'black'

    self.flag_win = 1

    self.flag_empty = 1

    self.game_print.set("")

    #将self.flag_win置0才能在棋盘上落子

    def game_start(self) :

    #没有清空棋子不能置0开始

    if self.flag_empty == 0:

    return

    self.flag_win = 0

    self.game_print.set("请"+self.color+"落子")

    def options(self) :

    self.board.canvas.bind("",self.chess_moving)

    Label(self.board.window , textvariable = self.game_print , font = ("Arial", 20) ).place(relx = 0, rely = 0 ,x = 495 , y = 200)

    Button(self.board.window , text= "开始游戏" ,command = self.game_start,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=15)

    Button(self.board.window , text= "我要悔棋" ,command = self.withdraw,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=60)

    Button(self.board.window , text= "清空棋局" ,command = self.empty_all,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=105)

    Button(self.board.window , text= "结束游戏" ,command = self.board.window.destroy,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=420)

    self.board.window.mainloop()

    最后,main函数

    if __name__ == "__main__":

    game = Gobang()

    将以上的所有程序复制粘贴,即为完整的程序了,可以运行。

    最后来一个完整程序,一个一个复制粘贴简直不要太麻烦。

    '''

    @Auther : gaoxin

    @Date : 2019.01.01

    @Version : 1.0

    '''

    from tkinter import *

    import math

    #定义棋盘类

    class chessBoard() :

    def __init__(self) :

    self.window = Tk()

    self.window.title("五子棋游戏")

    self.window.geometry("660x470")

    self.window.resizable(0,0)

    self.canvas=Canvas(self.window , bg="#EEE8AC" , width=470, height=470)

    self.paint_board()

    self.canvas.grid(row = 0 , column = 0)

    def paint_board(self) :

    for row in range(0,15) :

    if row == 0 or row == 14 :

    self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 2)

    else :

    self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 1)

    for column in range(0,15) :

    if column == 0 or column == 14 :

    self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 ,width = 2)

    else :

    self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 , width = 1)

    self.canvas.create_oval(112, 112, 118, 118, fill="black")

    self.canvas.create_oval(352, 112, 358, 118, fill="black")

    self.canvas.create_oval(112, 352, 118, 358, fill="black")

    self.canvas.create_oval(232, 232, 238, 238, fill="black")

    self.canvas.create_oval(352, 352, 358, 358, fill="black")

    #定义五子棋游戏类

    #0为黑子 , 1为白子 , 2为空位

    class Gobang() :

    #初始化

    def __init__(self) :

    self.board = chessBoard()

    self.game_print = StringVar()

    self.game_print.set("")

    #16*16的二维列表,保证不会out of index

    self.db = [([2] * 16) for i in range(16)]

    #悔棋用的顺序列表

    self.order = []

    #棋子颜色

    self.color_count = 0

    self.color = 'black'

    #清空与赢的初始化,已赢为1,已清空为1

    self.flag_win = 1

    self.flag_empty = 1

    self.options()

    #黑白互换

    def change_color(self) :

    self.color_count = (self.color_count + 1 ) % 2

    if self.color_count == 0 :

    self.color = "black"

    elif self.color_count ==1 :

    self.color = "white"

    #落子

    def chess_moving(self ,event) :

    #不点击“开始”与“清空”无法再次开始落子

    if self.flag_win ==1 or self.flag_empty ==0 :

    return

    #坐标转化为下标

    x,y = event.x-25 , event.y-25

    x = round(x/30)

    y = round(y/30)

    #点击位置没用落子,且没有在棋盘线外,可以落子

    while self.db[y][x] == 2 and self.limit_boarder(y,x):

    self.db[y][x] = self.color_count

    self.order.append(x+15*y)

    self.board.canvas.create_oval(25+30*x-12 , 25+30*y-12 , 25+30*x+12 , 25+30*y+12 , fill = self.color,tags = "chessman")

    if self.game_win(y,x,self.color_count) :

    print(self.color,"获胜")

    self.game_print.set(self.color+"获胜")

    else :

    self.change_color()

    self.game_print.set("请"+self.color+"落子")

    #保证棋子落在棋盘上

    def limit_boarder(self , y , x) :

    if x<0 or x>14 or y<0 or y>14 :

    return False

    else :

    return True

    #计算连子的数目,并返回最大连子数目

    def chessman_count(self , y , x , color_count ) :

    count1,count2,count3,count4 = 1,1,1,1

    #横计算

    for i in range(-1 , -5 , -1) :

    if self.db[y][x+i] == color_count :

    count1 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y][x+i] == color_count :

    count1 += 1

    else:

    break

    #竖计算

    for i in range(-1 , -5 , -1) :

    if self.db[y+i][x] == color_count :

    count2 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y+i][x] == color_count :

    count2 += 1

    else:

    break

    #/计算

    for i in range(-1 , -5 , -1) :

    if self.db[y+i][x+i] == color_count :

    count3 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y+i][x+i] == color_count :

    count3 += 1

    else:

    break

    #\计算

    for i in range(-1 , -5 , -1) :

    if self.db[y+i][x-i] == color_count :

    count4 += 1

    else:

    break

    for i in range(1 , 5 ,1 ) :

    if self.db[y+i][x-i] == color_count :

    count4 += 1

    else:

    break

    return max(count1 , count2 , count3 , count4)

    #判断输赢

    def game_win(self , y , x , color_count ) :

    if self.chessman_count(y,x,color_count) >= 5 :

    self.flag_win = 1

    self.flag_empty = 0

    return True

    else :

    return False

    #悔棋,清空棋盘,再画剩下的n-1个棋子

    def withdraw(self ) :

    if len(self.order)==0 or self.flag_win == 1:

    return

    self.board.canvas.delete("chessman")

    z = self.order.pop()

    x = z%15

    y = z//15

    self.db[y][x] = 2

    self.color_count = 1

    for i in self.order :

    ix = i%15

    iy = i//15

    self.change_color()

    self.board.canvas.create_oval(25+30*ix-12 , 25+30*iy-12 , 25+30*ix+12 , 25+30*iy+12 , fill = self.color,tags = "chessman")

    self.change_color()

    self.game_print.set("请"+self.color+"落子")

    #清空

    def empty_all(self) :

    self.board.canvas.delete("chessman")

    #还原初始化

    self.db = [([2] * 16) for i in range(16)]

    self.order = []

    self.color_count = 0

    self.color = 'black'

    self.flag_win = 1

    self.flag_empty = 1

    self.game_print.set("")

    #将self.flag_win置0才能在棋盘上落子

    def game_start(self) :

    #没有清空棋子不能置0开始

    if self.flag_empty == 0:

    return

    self.flag_win = 0

    self.game_print.set("请"+self.color+"落子")

    def options(self) :

    self.board.canvas.bind("",self.chess_moving)

    Label(self.board.window , textvariable = self.game_print , font = ("Arial", 20) ).place(relx = 0, rely = 0 ,x = 495 , y = 200)

    Button(self.board.window , text= "开始游戏" ,command = self.game_start,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=15)

    Button(self.board.window , text= "我要悔棋" ,command = self.withdraw,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=60)

    Button(self.board.window , text= "清空棋局" ,command = self.empty_all,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=105)

    Button(self.board.window , text= "结束游戏" ,command = self.board.window.destroy,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=420)

    self.board.window.mainloop()

    if __name__ == "__main__":

    game = Gobang()

    更多有趣的经典小游戏实现专题,分享给大家:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • python实现的五子棋,能够自动判断输赢,没有是实现电脑对战功能# 1、引入pygame 和 pygame.localsimport pygamefrom pygame.locals import *import timeimport sysinitChessList = []initRole = 1 # 代表白子下 2:...

    python实现的五子棋,能够自动判断输赢,没有是实现电脑对战功能

    # 1、引入pygame 和 pygame.locals

    import pygame

    from pygame.locals import *

    import time

    import sys

    initChessList = []

    initRole = 1 # 代表白子下 2:代表当前是黑子下

    resultFlag = 0

    userFlag = True

    class StornPoint():

    def __init__(self, x, y, value = 0):

    '''

    :param x: 代表x轴坐标

    :param y: 代表y轴坐标

    :param value: 当前坐标点的棋子:0:没有棋子 1:白子 2:黑子

    '''

    self.x = x

    self.y = y

    self.value = value

    pass

    def initChessSquare(x, y):

    '''

    初始化棋盘的坐标

    :param x:

    :param y:

    :return:

    '''

    # 使用二维列表保存了棋盘是的坐标系,和每个落子点的数值

    for i in range(15): # 每一行的交叉点坐标

    rowList = []

    for j in range(15): # 每一列的交叉点坐标

    pointX = x + j*40

    pointY = y + i*40

    # value = 0

    sp = StornPoint(pointX, pointY, 0)

    rowList.append(sp)

    pass

    initChessList.append(rowList)

    pass

    # 处理事件

    def eventHandler():

    global userFlag

    '''

    监听各种事件

    :return:

    '''

    for event in pygame.event.get():

    global initRole

    # 监听点积退出按钮事件

    if event.type == QUIT:

    pygame.quit()

    sys.exit()

    pass

    # 监听鼠标点积事件

    if event.type == MOUSEBUTTONDOWN:

    x, y = pygame.mouse.get_pos() #

    print((x, y))

    i = j = 0

    for temp in initChessList:

    for point in temp:

    if x >= point.x - 15 and x <= point.x + 15 \

    and y >= point.y - 15 and y <= point.y + 15:

    # 当前区域没有棋子,并且是白子下

    if point.value == 0 and initRole == 1 and userFlag:

    point.value = 1

    judgeResult(i, j, 1)

    initRole = 2 # 切换棋子颜色

    pass

    elif point.value == 0 and initRole == 2 and userFlag:

    point.value = 2

    judgeResult(i, j, 2)

    initRole = 1 # 切换棋子颜色

    pass

    break

    pass

    j += 1

    pass

    i += 1

    j = 0

    pass

    pass

    pass

    # 判断输赢函数

    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 initChessList[i][x].value == value and \

    initChessList[i][x + 1].value == value and \

    initChessList[i][x + 2].value == value and \

    initChessList[i][x + 3].value == value and \

    initChessList[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 initChessList[x][j].value == value and \

    initChessList[x + 1][j].value == value and \

    initChessList[x + 2][j].value == value and \

    initChessList[x + 3][j].value == value and \

    initChessList[x + 4][j].value == value:

    flag = True

    break

    pass

    # 判断东北方向的对角线是否出现了5连

    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 initChessList[y][x].value == value and \

    initChessList[y - 1][x + 1].value == value and \

    initChessList[y - 2][x + 2].value == value and \

    initChessList[y - 3][x + 3].value == value and \

    initChessList[y - 4][x + 4].value == value:

    flag = True

    break

    pass

    pass

    pass

    # 判断西北方向的对角是否出现了五连

    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 initChessList[y][x].value == value and \

    initChessList[y + 1][x + 1].value == value and \

    initChessList[y + 2][x + 2].value == value and \

    initChessList[y + 3][x + 3].value == value and \

    initChessList[y + 4][x + 4].value == value:

    flag = True

    break

    pass

    pass

    pass

    if flag:

    resultFlag = value

    pass

    pass

    # 加载素材

    def main():

    global resultFlag, initChessList

    initChessSquare(27, 27) # 初始化棋牌

    pygame.init() # 初始化游戏环境

    # 创建游戏窗口

    screen = pygame.display.set_mode((620,620), 0, 0) # 第一个参数是元组:窗口的长和宽

    # 添加游戏标题

    pygame.display.set_caption("五子棋小游戏")

    # 图片的加载

    background = pygame.image.load('images/bg.png')

    blackStorn = pygame.image.load('images/storn_black.png')

    whiteStorn = pygame.image.load('images/storn_white.png')

    winStornW = pygame.image.load('images/white.png')

    winStornB = pygame.image.load('images/black.png')

    rect = blackStorn.get_rect()

    while True:

    screen.blit(background, (0, 0))

    # 更新棋盘棋子

    for temp in initChessList:

    for point in temp:

    if point.value == 1:

    screen.blit(whiteStorn, (point.x - 18, point.y - 18))

    pass

    elif point.value == 2:

    screen.blit(blackStorn, (point.x - 18, point.y - 18))

    pass

    pass

    pass

    # 如果已经判决出输赢

    if resultFlag > 0:

    initChessList = [] # 清空棋盘

    initChessSquare(27, 27) # 重新初始化棋盘

    if resultFlag == 1:

    screen.blit(winStornW, (50,100))

    else:

    screen.blit(winStornB, (50,100))

    pass

    pygame.display.update()

    if resultFlag >0:

    time.sleep(3)

    resultFlag = 0

    pass

    eventHandler()

    pass

    pass

    if __name__ == "__main__":

    main()

    pass

    2019122683222398.jpg

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下目录简介实现过程结语简介使用python实现pygame版的五子棋游戏;环境:Windows系统+python3.8.0游戏规则:1.分两位棋手对战,默认黑棋先...
  • python 五子棋

    2018-12-29 14:39:12
    Python五子棋程序设计课程大作业,五子棋游戏,支持两人一个鼠标对下,黑方用黑子代替,白方用白子代替,谁先下均可,落子无悔,下过的棋子对方点击后也不可更改。游戏双方需遵循一次下一子的规则。
  • 很好的五子棋源代码,适合新手学习 很好的五子棋源代码,适合新手学习 很好的五子棋源代码,适合新手学习
  • flag = 0 return True def main(): # 创建棋盘对象 board = RenjuBoard() # 用于判断是下黑棋还是白棋 is_black = True # pygame初始化函数,固定写法 pygame.init() pygame.display.set_caption('五子棋') # 改...
  • 一个比较简单的五子棋源代码,适合于初学者研读。结构比较简单,不是很复杂
  • Python五子棋游戏 (附完整源代码

    万次阅读 多人点赞 2019-11-07 13:49:11
    五子棋执黑是必赢的,代码中,玩家就是执黑先手,电脑执白后手,所以,下的好是完全可以赢电脑的,不过一个小小失误也很可能被电脑翻盘。 全部源码: ManAndMachine.py """五子棋之人机对战""" import ...
  • Python五子棋游戏实现

    2019-04-12 15:00:14
    五子棋游戏(python+pyqt5)实现,采取棋盘评分与博弈树搜索进行AI决策
  • #最后决定就写个五子棋人机对战吧! #这个源码我在多年前曾用VB6写过,当时毕业设计拿了优秀,之后经过了几次修改计算机Ai还不算太差,想投机赢是没机会的。 #由于本人初学Python(第一个完整的Python程序),有些技巧...
  • 里面含有AI算法,仅供大家学习。
  • 本案例基于UDP的socket编程方法来制作五子棋程序,网络五子棋采用C/S架构,分为服务器端和客户端,游戏时服务端首先启动,当客户端启动连接后,服务器端可以走棋,轮到自己棋才可以在棋盘上落子,同时下方标签会显示...
  • Python五子棋】基于Socket的多人五子棋-通信部分 这篇博客中介绍了基于Python语言编写的多人五子棋(两人或三人)游戏主体框架中的多人联机通信部分,考虑到多人五子棋通常情况下是在本地网络下进行,因此我选择了...
  • Python写的五子棋

    2020-05-12 16:13:58
    Python引入Turtle包写的五子棋游戏,源代码分享。适合初学者练手。 15*15格的简单五子棋
  • Python五子棋的小程序

    2015-06-02 16:28:00
    代码是在开源中国上看到的,源代码网址:http://www.oschina.net/code/snippet_2365439_48010 需要安装graphics模块,下载地址:http://mcsp.wartburg.edu/zelle/python/graphics.py 保存到C:\Python27\Lib\site-...
  • Python简单小游戏源代码《完美解决大作业》 Python大作业实验报告+编程源代码--爬虫【轻松搞定大作业】 python大作业分享--30多个项目任你选(由于上传大小限制分多个文件上传。爬虫...
  • Python项目案例开发从入门到实战源代码第14章 网络通讯案例——基于UDP的网络五子棋.rar
  • 写的很详细的源代码,注释写的很清楚,有助于学习计算机博弈。推荐。
  • &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt; &lt;meta name="ProgId" content="Word.Document"...Microsoft Word 12&quo
  • python大作业编程源代码+实验报告--爬虫【完美搞定大作业】 python大作业--爬虫(完美应付大作业) python大作业分享--30多个项目任你选(由于上传大小限制分多个文件上传。爬虫...
  • Python写的五子棋源代码,欢迎下载。
  • python大作业实验报告+源代码--爬虫【完美搞定大作业】 python大作业分享--30多个项目任你选(由于上传大小限制分多个文件上传。爬虫https://download.csdn.net/download/dhyuan_88/19651195小游戏:...
  • python实现五子棋游戏(pygame版)

    千次阅读 多人点赞 2020-01-17 10:53:33
    使用python实现pygame版的五子棋游戏;  环境:Windows系统+python3.8.0  游戏规则:  1.分两位棋手对战,默认黑棋先下;当在棋盘点击左键,即在该位置绘制黑棋;  2.自动切换到白棋,当在棋盘点击左键,即...
  • Python实现AI五子棋

    2020-11-27 16:46:49
    **Python版本:**3.6.4 相关模块: graphics模块。 关注转发后私信回复:“AI五子棋”即可获取相关文件 环境搭建 安装Python并添加到环境变量即可。 注: graphics模块在相关文件中已经提供,就是一个py文件,直接...
  • python大作业 五子棋 人人对战

    热门讨论 2013-12-17 19:55:09
    python编写的五子棋人人对战。某学校的python课程大作业,需要用到graphics.py库(这里免积分下载:http://download.csdn.net/detail/w1135181854u/6730647),把graphics.py 放进python安装文件夹的lib文件夹里就好...
  • Python大作业实验报告+编程源代码--爬虫【轻松搞定大作业】 python大作业分享--30多个项目任你选(由于上传大小限制分多个文件上传。爬虫https://download.csdn.net/download/dhy1688/19880359小游戏...
  • 最近,我阅读了李刚大神编著的《疯狂Python讲义》一书,本书的4.6.3节是一个简易的五子棋游戏程序。原有程序功能尚不完善,仅实现了单方的下棋功能。我对该程序进行了修改完善,除了已有功能之外,还实现了如下功能...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 295
精华内容 118
关键字:

python五子棋源代码

python 订阅