用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 = yself.value = valuedef initChessboard(x,y):     #初始化棋盘for i in range(15):       # 每一行的交叉点坐标rowlist = []for j in range(15):   # 每一列的交叉点坐标pointX = x+ j*40pointY = y+ i*40sp = Gobang(pointX,pointY,0)rowlist.append(sp)Chessboardlist.append(rowlist)def eventHander():            #监听各种事件for event in pygame.event.get():       #pygame.event.get()    获取事件的返回值global initRoleif event.type == QUIT: #事件类型为退出时pygame.quit()      #令Pygame库停止工作sys.exit()         #终止程序,在调用sys.exit()终止程序之前,总是应该先调用pygame.quit()if event.type == MOUSEBUTTONDOWN: #当点击鼠标时x,y = pygame.mouse.get_pos()  #获取点击鼠标的位置坐标i=0j=0for 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                #切换角色breakj+=1i+=1j=0def judgeResult(i,j,value):   #横向判断global resultFlagflag = Falsefor  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 = Truebreakpassfor 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 = Truebreakpass# 先判断东北方向的对角下输赢 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 = Trueif flag:               #如果条件成立,证明五子连珠resultFlag = value #获取成立的棋子颜色print("白棋赢" if value ==1 else "黑棋赢")# 加载素材
def main():global Chessboardlist,resultFlaginitChessboard(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

加油加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【youcans 的 OpenCV 例程 200 篇】118. 形态学操作之底帽运算

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】118. 形态学操作之底帽运算 形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征&…

SPSS操作(五):主成分分析

为综合评价我国2006年省级地区服务业发展水平&#xff0c;现构建我国省级地区服务业发展水平综合评价指标体系&#xff0c;具体如下&#xff1a;铁路运输业职工人数(人)、城市公共交通业职工人数(人)、邮政业职工人数(人)、电信和其他信息传输服务业职工人数(人)、客运量(万人)…

SpringBoot创建简单的hello world

用目前流行的SpringBoot框架创建一个简单的hello world. 效果演示 控制台输出Spring 在游览器输入地址出现如下所示 代码演示 在代码正式开始之前我们先看一下目录结构吧 我们只需要关心src/main/java包里的内容和pom.xml里面的内容 主启动程序 Application.java内容 p…

【youcans 的 OpenCV 例程 200 篇】119. 图像的形态学梯度

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】119. 图像的形态学梯度 形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征&…

爬取虎扑步行街论坛数据保存到MySQL、MongoDB

本文内容围绕获取虎扑步行街论坛上所有帖子的数据开展的&#xff0c;爬取的内容包括帖子名称、帖子链接、作者、作者链接、创建时间、回复数、浏览数、最后回复用户和最后回复时间&#xff0c;将爬取的数据分别保存在MongoDB和MySQL里 网页地址&#xff1a; https://bbs.hupu.c…

MyEclipse导入项目后 js文件报错

当我们把项目导入MyEclipse的时候会发现导入的项目报错&#xff0c;点开一看是js文件报错了&#xff0c;那么我们应该如何处理导入MyEclipse之后js文件报错呢&#xff1f;&#xff1f;&#xff1f; 首先&#xff0c;我们要保证我们导入的代码是正确的。 解决js文件报错我总结…

【youcans 的 OpenCV 例程 200 篇】120. 击中-击不中变换

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】120. 击中-击不中变换 形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征&#…

gets函数会自动加空字符吗_Python高手都知道的内置函数,你不知道就low了

xinxin 菜鸟学Python 阅读本文大概需要5分钟python内置了一些非常巧妙而且强大的内置函数&#xff0c;对初学者来说&#xff0c;一般不怎么用到&#xff0c;我也是用了一段时间python之后才发现&#xff0c;哇还有这么好的函数&#xff0c;这个函数都是经典的而且经过严格测试的…

Tableau2019版本安装步骤

因为需要&#xff0c;所以遍地寻找tableau安装包&#xff0c;然后找到2021等版本&#xff0c;安装发现都不能显示表和图&#xff0c;所以继续寻找&#xff0c;然后发现了2019版安装包&#xff0c;安装发现可以正常使用&#xff0c;以下是安装包的下载地址&#xff1a; 链接&…

HTML全屏背景图

当我们在写前端页面的时候为了页面的美观我们通常会为页面设置图片背景&#xff0c;那么我们如何来设置全屏的背景图呢&#xff1f;&#xff1f;&#xff1f; 设置全屏背景图需要三个属性 background-image: url(img/untitled.png);background-repeat: no-repeat;background-s…

【youcans 的 OpenCV 例程200篇】121. 击中-击不中用于特征识别

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】121. 击中-击不中用于特征识别 击中-击不中是形态检测的基本工具&#xff0c;可以实现对象的细…

存储过程双层循环_别出心裁,为锂金属负极贴上“双层保护膜”!

第一作者&#xff1a;Yang Zhao、Maedeh Amirmaleki通讯作者&#xff1a;TobinFilleter、蔡梅、孙学良通讯单位&#xff1a;加拿大多伦多大学、通用汽车研发中心、加拿大西安大略大学研究亮点&#xff1a;1.提出了锂金属负极“双层保护膜”的概念。2.通过ALD/MLD精确控制双层保…

Anaconda安装Wordcloud库失败的解决办法

主要安装出现了如下问题&#xff1a; 当时我也不知道这是出了什么问题&#xff0c;后来我就试试另一个办法安装Wordcloud&#xff0c;因此记录一下&#xff1a; 1、查看自己的Anaconda使用的python版本号 方法&#xff1a;进入Anaconda Prompt&#xff0c;输入python -V 2…

拼图游戏

使用JS制作了一款拼图游戏供大家参考。 原理分析&#xff1a; 1.鼠标的点击和松开事件 2.显示原图作为参考 3.方块的移动替换 4.是否完成拼图的判断 5.完成之后会弹窗提示 效果演示 代码展示 <!DOCTYPE html> <html><head><meta charset"UTF-8&qu…

【youcans 的 OpenCV 例程200篇】122. 形态算法之边界提取

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】122. 形态算法之边界提取 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状…

人机协作机器人发展趋势_发那科童梁:机器人化不是时髦!有效的人机协作投资回报率更高...

编者按&#xff1a;此文是根据上海发那科机器人有限公司技术部部长童梁于2019年5月在浙江宁波余姚举行的第六届中国机器人峰会上的《物联网浪潮下的智能制造》报告录音整理摘编部分而成&#xff0c;题目为编者所加。随着“中国制造2025”的不断推进&#xff0c;越来越多制造业企…

做一个关于我和她微信聊天记录的爱心词云图

前言&#xff1a; 因为最近接触到了词云图&#xff0c;所以就想做一个关于和女朋友聊天的词云图,但是现在很少使用QQ了&#xff0c;所以就不得不使用微信导出聊天记录。于是我坐在电脑面前查阅资料查了一天&#xff0c;但是在走到快导出微信聊天记录的时候&#xff0c;还是被…

【youcans 的 OpenCV 例程200篇】123. 形态算法之孔洞填充

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】123. 形态算法之孔洞填充 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状…

弹框提示

jquery弹框提示框的实现。 原理分析 1.点击按钮出现弹框 2.设置弹框标题和内容 3.设置取消和确定两个按钮 4.点击确定继续执行 5.点击取消返回此页面 效果演示 原始样式 点击之后 点击确认按钮 代码演示 在开始我们的程序之前注意&#xff1a; 引入Jquery.js架包 <…

el-tooltip位置不灵活_美团研究院:超五成生活服务业商户有灵活用工需求

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;美团研究院于 9 月 15 日发布《生活服务业新就业形态和灵活就业的发展特征和发展趋势》报告&#xff0c;报告指出我国目前灵活用工岗位类型众多&#xff0c;是从业者的重要收入来源&#xff0c;从业者通过灵活就业拓宽了…