python-pygame小游戏之五子棋
大家好,今天我要为大家带来一个pygame小游戏——五子棋!
还是推荐你看看之前的三篇
python-pygame小游戏之球球大作战
python-pygame作品之黑客帝国代码雨
python-pygame作品之MineCraft小鸡
温馨提醒:
没有安装过pygame模块的人们,尤其是新人,没有安装过pygame模块的需要(必须!)在cmd里导入pygame模块哦~方法如下:
打开运行,输入cmd,然后输入以下代码
pip install pygame
---------------------------------------------------开始写代码了!---------------------------------------------------------
一、初始化
导入模块,初始化程序
import pygame
import sys
#调用常用关键字常量
from pygame.locals import QUIT,KEYDOWN
import numpy as np
#初始化pygame
pygame.init()
#获取对显示系统的访问,并创建一个窗口screen
#窗口大小为670x670
screen = pygame.display.set_mode((670,670))
screen_color=[238,154,73]#设置画布颜色,[238,154,73]对应为棕黄色
line_color = [0,0,0]#设置线条颜色,[0,0,0]对应黑色
二、主体函数定义
首先写判断是否五子连心的函数。
小细节:五子连心了会用小方格连接它们(子)。
def check_win(over_pos):#判断五子连心mp=np.zeros([15,15],dtype=int)for val in over_pos:x=int((val[0][0]-27)/44)y=int((val[0][1]-27)/44)if val[1]==white_color:mp[x][y]=2#表示白子else:mp[x][y]=1#表示黑子for i in range(15):pos1=[]pos2=[]for j in range(15):if mp[i][j]==1:pos1.append([i,j])else:pos1=[]if mp[i][j]==2:pos2.append([i,j])else:pos2=[]if len(pos1)>=5:#五子连心return [1,pos1]if len(pos2)>=5:return [2,pos2]for j in range(15):pos1=[]pos2=[]for i in range(15):if mp[i][j]==1:pos1.append([i,j])else:pos1=[]if mp[i][j]==2:pos2.append([i,j])else:pos2=[]if len(pos1)>=5:return [1,pos1]if len(pos2)>=5:return [2,pos2]for i in range(15):for j in range(15):pos1=[]pos2=[]for k in range(15):if i+k>=15 or j+k>=15:breakif mp[i+k][j+k]==1:pos1.append([i+k,j+k])else:pos1=[]if mp[i+k][j+k]==2:pos2.append([i+k,j+k])else:pos2=[]if len(pos1)>=5:return [1,pos1]if len(pos2)>=5:return [2,pos2]for i in range(15):for j in range(15):pos1=[]pos2=[]for k in range(15):if i+k>=15 or j-k<0:breakif mp[i+k][j-k]==1:pos1.append([i+k,j-k])else:pos1=[]if mp[i+k][j-k]==2:pos2.append([i+k,j-k])else:pos2=[]if len(pos1)>=5:return [1,pos1]if len(pos2)>=5:return [2,pos2]return [0,[]]
再写下子和判断是否有子的函数。
def find_pos(x,y):#找到显示的可以落子的位置for i in range(27,670,44):for j in range(27,670,44):L1=i-22L2=i+22R1=j-22R2=j+22if x>=L1 and x<=L2 and y>=R1 and y<=R2:return i,jreturn x,ydef check_over_pos(x,y,over_pos):#检查当前的位置是否已经落子for val in over_pos:if val[0][0]==x and val[0][1]==y:return Falsereturn True#表示没有落子
三、主程序
接下来要写主程序了!
先定义变量,好用于下方运行主程序和函数。
flag=False
tim=0over_pos=[]#表示已经落子的位置
white_color=[255,255,255]#白棋颜色
black_color=[0,0,0]#黑棋颜色
然后使用while True循环来开始游戏。
先写防卡程序。
while True:#不断训练刷新画布for event in pygame.event.get():#获取事件,如果鼠标点击右上角关闭按钮,关闭if event.type in (QUIT,KEYDOWN):sys.exit()
然后运行主程序。
小细节:在鼠标箭头下方路过的地方会有一个小方格,可以让玩家知道下子位置。
小贴士:别忘了写update(更新函数)啊!
while True:#不断训练刷新画布for event in pygame.event.get():#获取事件,如果鼠标点击右上角关闭按钮,关闭if event.type in (QUIT,KEYDOWN):sys.exit()screen.fill(screen_color)#清屏for i in range(27,670,44):#先画竖线if i==27 or i==670-27:#边缘线稍微粗一些pygame.draw.line(screen,line_color,[i,27],[i,670-27],4)else:pygame.draw.line(screen,line_color,[i,27],[i,670-27],2)#再画横线if i==27 or i==670-27:#边缘线稍微粗一些pygame.draw.line(screen,line_color,[27,i],[670-27,i],4)else:pygame.draw.line(screen,line_color,[27,i],[670-27,i],2)#在棋盘中心画个小圆表示正中心位置pygame.draw.circle(screen, line_color,[27+44*7,27+44*7], 8,0)for val in over_pos:#显示所有落下的棋子pygame.draw.circle(screen, val[1],val[0], 20,0)#判断是否存在五子连心res=check_win(over_pos)if res[0]!=0:for pos in res[1]:pygame.draw.rect(screen,[238,48,167],[pos[0]*44+27-22,pos[1]*44+27-22,44,44],2,1)pygame.display.update()#刷新显示continue#游戏结束,停止下面的操作#获取鼠标坐标信息x,y = pygame.mouse.get_pos()x,y=find_pos(x,y)if check_over_pos(x,y,over_pos):#判断是否可以落子,再显示pygame.draw.rect(screen,[0 ,229 ,238 ],[x-22,y-22,44,44],2,1)keys_pressed = pygame.mouse.get_pressed()#获取鼠标按键信息#鼠标左键表示落子,tim用来延时的,因为每次循环时间间隔很断,容易导致明明只按了一次左键,却被多次获取,认为我按了多次if keys_pressed[0] and tim==0:flag=Trueif check_over_pos(x,y,over_pos):#判断是否可以落子,再落子if len(over_pos)%2==0:#黑子over_pos.append([[x,y],black_color])else:over_pos.append([[x,y],white_color])#鼠标左键延时作用if flag:tim+=1if tim%50==0:#延时200msflag=Falsetim=0pygame.display.update()#刷新显示
整个程序就写好了!虽然有点难,但是做出来还是很好玩的!
四、完整代码
奉上全部代码:
#调用pygame库
import pygame
import sys
#调用常用关键字常量
from pygame.locals import QUIT,KEYDOWN
import numpy as np
#初始化pygame
pygame.init()
#获取对显示系统的访问,并创建一个窗口screen
#窗口大小为670x670
screen = pygame.display.set_mode((670,670))
screen_color=[238,154,73]#设置画布颜色,[238,154,73]对应为棕黄色
line_color = [0,0,0]#设置线条颜色,[0,0,0]对应黑色def check_win(over_pos):#判断五子连心mp=np.zeros([15,15],dtype=int)for val in over_pos:x=int((val[0][0]-27)/44)y=int((val[0][1]-27)/44)if val[1]==white_color:mp[x][y]=2#表示白子else:mp[x][y]=1#表示黑子for i in range(15):pos1=[]pos2=[]for j in range(15):if mp[i][j]==1:pos1.append([i,j])else:pos1=[]if mp[i][j]==2:pos2.append([i,j])else:pos2=[]if len(pos1)>=5:#五子连心return [1,pos1]if len(pos2)>=5:return [2,pos2]for j in range(15):pos1=[]pos2=[]for i in range(15):if mp[i][j]==1:pos1.append([i,j])else:pos1=[]if mp[i][j]==2:pos2.append([i,j])else:pos2=[]if len(pos1)>=5:return [1,pos1]if len(pos2)>=5:return [2,pos2]for i in range(15):for j in range(15):pos1=[]pos2=[]for k in range(15):if i+k>=15 or j+k>=15:breakif mp[i+k][j+k]==1:pos1.append([i+k,j+k])else:pos1=[]if mp[i+k][j+k]==2:pos2.append([i+k,j+k])else:pos2=[]if len(pos1)>=5:return [1,pos1]if len(pos2)>=5:return [2,pos2]for i in range(15):for j in range(15):pos1=[]pos2=[]for k in range(15):if i+k>=15 or j-k<0:breakif mp[i+k][j-k]==1:pos1.append([i+k,j-k])else:pos1=[]if mp[i+k][j-k]==2:pos2.append([i+k,j-k])else:pos2=[]if len(pos1)>=5:return [1,pos1]if len(pos2)>=5:return [2,pos2]return [0,[]]def find_pos(x,y):#找到显示的可以落子的位置for i in range(27,670,44):for j in range(27,670,44):L1=i-22L2=i+22R1=j-22R2=j+22if x>=L1 and x<=L2 and y>=R1 and y<=R2:return i,jreturn x,ydef check_over_pos(x,y,over_pos):#检查当前的位置是否已经落子for val in over_pos:if val[0][0]==x and val[0][1]==y:return Falsereturn True#表示没有落子
flag=False
tim=0over_pos=[]#表示已经落子的位置
white_color=[255,255,255]#白棋颜色
black_color=[0,0,0]#黑棋颜色while True:#不断训练刷新画布for event in pygame.event.get():#获取事件,如果鼠标点击右上角关闭按钮,关闭if event.type in (QUIT,KEYDOWN):sys.exit()screen.fill(screen_color)#清屏for i in range(27,670,44):#先画竖线if i==27 or i==670-27:#边缘线稍微粗一些pygame.draw.line(screen,line_color,[i,27],[i,670-27],4)else:pygame.draw.line(screen,line_color,[i,27],[i,670-27],2)#再画横线if i==27 or i==670-27:#边缘线稍微粗一些pygame.draw.line(screen,line_color,[27,i],[670-27,i],4)else:pygame.draw.line(screen,line_color,[27,i],[670-27,i],2)#在棋盘中心画个小圆表示正中心位置pygame.draw.circle(screen, line_color,[27+44*7,27+44*7], 8,0)for val in over_pos:#显示所有落下的棋子pygame.draw.circle(screen, val[1],val[0], 20,0)#判断是否存在五子连心res=check_win(over_pos)if res[0]!=0:for pos in res[1]:pygame.draw.rect(screen,[238,48,167],[pos[0]*44+27-22,pos[1]*44+27-22,44,44],2,1)pygame.display.update()#刷新显示continue#游戏结束,停止下面的操作#获取鼠标坐标信息x,y = pygame.mouse.get_pos()x,y=find_pos(x,y)if check_over_pos(x,y,over_pos):#判断是否可以落子,再显示pygame.draw.rect(screen,[0 ,229 ,238 ],[x-22,y-22,44,44],2,1)keys_pressed = pygame.mouse.get_pressed()#获取鼠标按键信息#鼠标左键表示落子,tim用来延时的,因为每次循环时间间隔很断,容易导致明明只按了一次左键,却被多次获取,认为我按了多次if keys_pressed[0] and tim==0:flag=Trueif check_over_pos(x,y,over_pos):#判断是否可以落子,再落子if len(over_pos)%2==0:#黑子over_pos.append([[x,y],black_color])else:over_pos.append([[x,y],white_color])#鼠标左键延时作用if flag:tim+=1if tim%50==0:#延时200msflag=Falsetim=0pygame.display.update()#刷新显示
五、效果图
六、知识总结
pygame模块十分实用。它很厉害,大家可以学习学习pygame,以后可以自己开发游戏啊。
python-pygame小游戏之五子棋相关推荐
- python·pygame小游戏--中国象棋(原码附上,免费下载)
大家好我是小豪,今天给大家带来的是pygame小游戏-中国象棋 因为看到博客上面很多上传了的中国象棋py文件,都是收费的.所以我大胆的上传个免费的-已经把原码上传了,感兴趣的可以去下载. pygame ...
- Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
项目简介 之前学python的时候 写了个游戏来练手 用的是 pygame 没有别的依赖 只用了一两百行的代码就实现了 整体来说功能并不算完整 项目背后的故事 这个项目是在大学的时候 偶然一个机遇交一 ...
- python pygame小游戏_python:利用pygame实现消消乐小游戏
消消乐记分小游戏GUI界面 文件结构规划 定义config.py文件存储相关参数:包括界面的宽高,整个方格行列个数,总格数等等. 定义utils.py文件用于存放基础的类和函数:包括整个消除拼图类,游 ...
- python pygame小游戏素材图片_pygame 打飞机(小游戏)
0.游戏的基本实现 ''' 游戏的基本实现 游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟 游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示 ''' 1.安装pyga ...
- python pygame小游戏_第一个python+pygame小游戏
没有周队那么有情调,自己写故事做rpg,又没什么绘画功底,只能做这样的休闲棋类游戏.本来是用java写的,但里面绘图太麻烦了(或者说我不会多线程),又想起前几天看到的pygame,于是果断python ...
- python: pygame小游戏(二)——满天星
""" 满天星: 绘制100颗小星星:随机产生的 1.小星星移动: 左上角到右下角移动 循环形式 2.随机颜色 闪烁 修改一次 """ im ...
- python经典小游戏五子棋,适合python编程的小游戏
python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...
- python入门小游戏代码20行,python入门小游戏代码
python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...
- python能制作游戏吗_如何用Python制作小游戏
要想用Python制作小游戏,必须要安装一个插件Pygame 什么是Pygame Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需 ...
- pygame小游戏——中国地图拼图小游戏
pygame小游戏--中国地图拼图小游戏 游戏简介 本游戏用python开发,可对中国各个省份进行拼图,设置三个模式,便于中小学生熟悉中国地图,省份及简称等.通过鼠标拖动省份到地图相应位置,寓教于乐. ...
最新文章
- matlab登录界面密码,关于MATLAB中密码登录界面的问题
- 关于Spring的69个面试问答——终极列表
- 视频类搜索引擎优化教程侧重点
- 树和二叉树的转换代码python_python数据结构之二叉树的统计与转换实例
- java下载文件跳转页面_java servlet笔记:设置编码集、文件下载和两种服务器跳转-java下载文件...
- 爆赞!Android岗大厂面试官常问的那些问题,论程序员成长的正确姿势
- flutter webview浏览器及与js交互、打开第三方app
- 中科大 计算机网络2 什么是互联网
- vagrant 报unknown filesystem type 'vboxsf' 解决方案
- 微信小程序 promise 化
- centos安装python2.7.2_Centos6.2 安装Python2.7.x 版本
- C#如何直接调用非托管代码
- [转] 用GDB调试程序(五)
- 掌握中台系统,需要了解哪些技术?
- 处女座的比赛资格(拓扑排序)
- 计算机中英文打字文章,中英文打字练习文章.docx
- 员工工号怎么编码_人事档案编码怎么编
- 如何提高人际交往的沟通技巧
- MySQL——事务机制
- OMAP850 运行android
热门文章
- 电脑开机出现警报音后提示要按F1才能进入的分析处理
- win 7旗舰版开机提示 :explorer.exe-无法找到入口
- 解决Python无法找到入口——无法定位到程序输入点
- unity android录制视频教程,Unity3d 录屏功能教程指南 | Cross Platform Replay Kit
- 抽象类是不是必须要有抽象方法
- 1.定义ddos僵尸网络
- 误关闭阿里云主机的网络后如何进行恢复
- 赤诚的火焰--致时代里永远不变的规矩
- 服务器引导盘装系统怎么选择u盘,小编教你怎么设置u盘为启动盘
- Python笔记03:python中用import导入包的机制原理是什么?