大家好,今天我要为大家带来一个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小游戏之五子棋相关推荐

  1. python·pygame小游戏--中国象棋(原码附上,免费下载)

    大家好我是小豪,今天给大家带来的是pygame小游戏-中国象棋 因为看到博客上面很多上传了的中国象棋py文件,都是收费的.所以我大胆的上传个免费的-已经把原码上传了,感兴趣的可以去下载. pygame ...

  2. Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版

    项目简介 之前学python的时候 写了个游戏来练手 用的是 pygame 没有别的依赖 只用了一两百行的代码就实现了 整体来说功能并不算完整 项目背后的故事 这个项目是在大学的时候 偶然一个机遇交一 ...

  3. python pygame小游戏_python:利用pygame实现消消乐小游戏

    消消乐记分小游戏GUI界面 文件结构规划 定义config.py文件存储相关参数:包括界面的宽高,整个方格行列个数,总格数等等. 定义utils.py文件用于存放基础的类和函数:包括整个消除拼图类,游 ...

  4. python pygame小游戏素材图片_pygame 打飞机(小游戏)

    0.游戏的基本实现 ''' 游戏的基本实现 游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟 游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示 ''' 1.安装pyga ...

  5. python pygame小游戏_第一个python+pygame小游戏

    没有周队那么有情调,自己写故事做rpg,又没什么绘画功底,只能做这样的休闲棋类游戏.本来是用java写的,但里面绘图太麻烦了(或者说我不会多线程),又想起前几天看到的pygame,于是果断python ...

  6. python: pygame小游戏(二)——满天星

    """ 满天星: 绘制100颗小星星:随机产生的 1.小星星移动: 左上角到右下角移动 循环形式 2.随机颜色 闪烁 修改一次 """ im ...

  7. python经典小游戏五子棋,适合python编程的小游戏

    python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...

  8. python入门小游戏代码20行,python入门小游戏代码

    python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...

  9. python能制作游戏吗_如何用Python制作小游戏

    要想用Python制作小游戏,必须要安装一个插件Pygame 什么是Pygame Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需 ...

  10. pygame小游戏——中国地图拼图小游戏

    pygame小游戏--中国地图拼图小游戏 游戏简介 本游戏用python开发,可对中国各个省份进行拼图,设置三个模式,便于中小学生熟悉中国地图,省份及简称等.通过鼠标拖动省份到地图相应位置,寓教于乐. ...

最新文章

  1. matlab登录界面密码,关于MATLAB中密码登录界面的问题
  2. 关于Spring的69个面试问答——终极列表
  3. 视频类搜索引擎优化教程侧重点
  4. 树和二叉树的转换代码python_python数据结构之二叉树的统计与转换实例
  5. java下载文件跳转页面_java servlet笔记:设置编码集、文件下载和两种服务器跳转-java下载文件...
  6. 爆赞!Android岗大厂面试官常问的那些问题,论程序员成长的正确姿势
  7. flutter webview浏览器及与js交互、打开第三方app
  8. 中科大 计算机网络2 什么是互联网
  9. vagrant 报unknown filesystem type 'vboxsf' 解决方案
  10. 微信小程序 promise 化
  11. centos安装python2.7.2_Centos6.2 安装Python2.7.x 版本
  12. C#如何直接调用非托管代码
  13. [转] 用GDB调试程序(五)
  14. 掌握中台系统,需要了解哪些技术?
  15. 处女座的比赛资格(拓扑排序)
  16. 计算机中英文打字文章,中英文打字练习文章.docx
  17. 员工工号怎么编码_人事档案编码怎么编
  18. 如何提高人际交往的沟通技巧
  19. MySQL——事务机制
  20. OMAP850 运行android

热门文章

  1. 电脑开机出现警报音后提示要按F1才能进入的分析处理
  2. win 7旗舰版开机提示 :explorer.exe-无法找到入口
  3. 解决Python无法找到入口——无法定位到程序输入点
  4. unity android录制视频教程,Unity3d 录屏功能教程指南 | Cross Platform Replay Kit
  5. 抽象类是不是必须要有抽象方法
  6. 1.定义ddos僵尸网络
  7. 误关闭阿里云主机的网络后如何进行恢复
  8. 赤诚的火焰--致时代里永远不变的规矩
  9. 服务器引导盘装系统怎么选择u盘,小编教你怎么设置u盘为启动盘
  10. Python笔记03:python中用import导入包的机制原理是什么?