Python+Pygame实现彩色五子棋游戏
作者:武子康 发布时间:2021-03-29 23:47:34
标签:Python,Pygame,五子棋,游戏
项目简介
之前学python的时候 写了个游戏来练手 用的是 pygame 没有别的依赖
只用了一两百行的代码就实现了 整体来说功能并不算完整
项目背后的故事
这个项目是在大学的时候
偶然一个机遇交一个小朋友Python时 小朋友大概10多岁 正在打算上初一
小朋友分非常非常非常聪明!!!
当时给他讲东西 他很快就可以接受 立马就可以模仿出来
小朋友会的东西很多 其中一项我非常感兴趣哈哈 — 围棋 好像还是业余挺高的那种(不好意思 我不太懂段位)
好像是什么定段之后就可以打职业那种?对我来说是非常非常厉害的存在了
当时我还让他简单的交了交我如何下围棋 以及围棋的一些概念
除了五子棋之外 当时还写了 贪吃蛇、扫雷等等这些游戏
还给他讲了爬虫相关的东西 还有HTML啊CSS之类的
当时有一个游戏叫 “人类资源机器(HumanResource)” 游戏是一个通过简单编程 控制小人来实现目标的游戏
就是这个游戏!当时我很惊讶 他过关速度非常快!搞得我压力都上来了哈哈
当时还准备了几页的 “课本” 方便小朋友以后能够回看
项目扩展思路
当然围棋其实也是一个道理 只是计算胜负、计算气的逻辑会不一样
可以改进一下 使用鼠标来落子会更有意思
大家可以参考一下 主项目在GitHub上 除了单机版以外还有一个局域网版
运行截图
安装依赖
pip install pygame
或者
pip3 install pygame
运行游戏
将游戏代码保存后 直接运行即可
上下左右移动光标 空格落子
import pygame
# 初始化
pygame.init()
# 设置窗口标题
screencaption=pygame.display.set_caption('Gobang')
# 设置大小
screen=pygame.display.set_mode([350,285])
# 初始化字体
myfont=pygame.font.Font(None,30)
textImage=myfont.render("Hello Pygame",True,[255,255,255])
screen.blit(textImage,(100,100))
# 棋子状态0为空 1为白色 2为黑色
status_list = {}
for i in range(0, 15*18):
status_list[i] = 0
#print(status_list)
clock = pygame.time.Clock()
# 0 是白棋走 1是黑棋走
flag = 0
# 将要绘制的棋子的位置
movex = 1
movey = 1
while True:
clock.tick(30)
# 绘制棋盘
screen.fill([255,255,255])
for i in range(0, 15):
pygame.draw.line(screen,[0,0,0],[0,i*20],[280,i*20],2)
for i in range(0, 15):
pygame.draw.line(screen,[0,0,0],[i*20,0],[i*20,280],2)
# 绘制棋子
for x in range(0, 15):
for y in range(0, 15):
if status_list[x*15 + y] == 1:
pygame.draw.circle(screen,[255,0,0],[ 2 + y * 20,2 + x*20],10)
elif status_list[x*15 + y] == 2:
pygame.draw.circle(screen,[0,0,0],[ 2 + y * 20, 2 + x*20],10)
# 判断是否获胜
# X轴的判定
if y < 11:
# 白棋获胜
if status_list[x*15 + y] == 1 and status_list[x*15 + y + 1] == 1 and status_list[x*15 + y + 2] == 1 and status_list[x*15 + y + 3] == 1 and status_list[x*15 + y + 4] == 1:
print("白棋胜利")
# break
# 黑棋获胜
if status_list[x*15 + y] == 2 and status_list[x*15 + y + 1] == 2 and status_list[x*15 + y + 2] == 2 and status_list[x*15 + y + 3] == 2 and status_list[x*15 + y + 4] == 2:
print("黑棋胜利")
# break
# 判断是否获胜
# Y轴的判定
if x < 11:
if status_list[x*15 + y] == 1 and status_list[(x+1)*15 + y] == 1 and status_list[(x+2)*15 + y] == 1 and status_list[(x+3)*15 + y] == 1 and status_list[(x+4)*15 + y] == 1:
print("白棋胜利")
# break
if status_list[x*15 + y] == 2 and status_list[(x+1)*15 + y] == 2 and status_list[(x+2)*15 + y] == 2 and status_list[(x+3)*15 + y] == 2 and status_list[(x+4)*15 + y] == 2:
print("黑棋胜利")
# break
# 判断是否获胜
# 斜着判断 正对角线
if status_list[x*15 + y] == 1 and status_list[(x+1)*15 + (y+1)] == 1 and status_list[(x+2)*15 + (y+2)] == 1 and status_list[(x+3)*15 + (y+3)] == 1 and status_list[(x+4)*15 + (y+4)] == 1:
print("白棋胜利")
# break
if status_list[x*15 + y] == 2 and status_list[(x+1)*15 + (y+1)] == 2 and status_list[(x+2)*15 + (y+2)] == 2 and status_list[(x+3)*15 + (y+3)] == 2 and status_list[(x+4)*15 + (y+4)] == 2:
print("黑棋胜利")
# break
# 判断是否获胜
# 斜着判断 反对角线
if status_list[x*15 + y] == 1 and status_list[(x+1)*15 + (y-1)] == 1 and status_list[(x+2)*15 + (y-2)] == 1 and status_list[(x+3)*15 + (y-3)] == 1 and status_list[(x+4)*15 + (y-4)] == 1:
print("白棋胜利")
# break
if status_list[x*15 + y] == 2 and status_list[(x+1)*15 + (y-1)] == 2 and status_list[(x+2)*15 + (y-2)] == 2 and status_list[(x+3)*15 + (y-3)] == 2 and status_list[(x+4)*15 + (y-4)] == 2:
print("黑棋胜利")
# break
# 绘制落棋位置
pygame.draw.circle(screen,[0,0,0],[ 2 + movex*20, 2 + movey*20],10,3)
# 绘制文字 显示到谁落棋子
if flag == 0:
textImage=myfont.render("White",True,[255,0,0])
else:
textImage=myfont.render("Black",True,[0,0,255])
screen.blit(textImage,(290,10))
# 判断事件
for event in pygame.event.get():
# 退出事件
if event.type==pygame.QUIT:
pygame.quit()
quit()
# 键盘事件
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
if movex > 0:
movex = movex - 1
if event.key == pygame.K_RIGHT:
if movex < 14:
movex = movex + 1
if event.key == pygame.K_UP:
if movey > 0:
movey = movey - 1
if event.key == pygame.K_DOWN:
if movey < 14:
movey = movey + 1
if event.key == pygame.K_SPACE:
if flag == 0:
if status_list[movey * 15 + movex] == 0:
status_list[movey * 15 + movex] = 1
flag = 1
elif flag == 1:
if status_list[movey * 15 + movex] == 0:
status_list[movey * 15 + movex] = 2
flag = 0
# 刷新页面
pygame.display.flip()
print("Done!")
来源:https://blog.csdn.net/w776341482/article/details/128930013
0
投稿
猜你喜欢
- 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(
- 怎么用javascript进行拖拽本文译自:http://www.webreference.com/programming/javascri
- 一个站点成功与否,不是在于所用的程序语言是PHP还是ASP,也不在于用BLOG建站或是CMS建站,内容和专业很重要。博客很好起步,CMS体系
- 首先,Python 完整的异常处理语法结构如下:try: #业务实现代码except Exception1 as e: &nbs
- 下面是asp代码实现列出sql数据库中存储过程的功能,可自行添加其它功能:< HTML >< 
- 在开发中有些敏感接口,例如用户余额提现接口,需要考虑在并 * 况下接口是否会发生问题。如果用户将自己的多条提现请求同时发送到服务器,代码能否扛
- 最近从某网站下载了一批文档,但是文件是用数字串命名的文档(很多图书馆都这样吧),现在我也下载完了这些文件,也有这些文件的列表,就是不能一个一
- 使用正则表达式的几个步骤:1、用import re 导入正则表达式模块;2、用re.compile()函数创建一个Regex对象;3、用Re
- 现将几种主要情况进行小结: 一、如何输入NULL值 如果不输入null值,当时间为空时,会默认写入"1900-01-01"
- 分享几个字体设计:1.巧克力2.绿野邂逅是人间四月天3.去年花开的时候4.仲夏梦之夜5.芊芊茉莉香6.玫瑰人生7.真情告白8.遮掩锋芒
- 发现问题比解决问题重要,使用php集成开发环境Appserv网页会提示各种语法错误,但自己配置开发环境无法提示错误,特别当不是语法错误,比如
- 我们先看一个简单的例子:<input type="text" onblur="alert(this.va
- 大概五年前吧,我那时还在为一家约会网站做开发工作。他们是早期创业公司,但他们也开始拥有了一些稳定用户量。不像其他约会网站,这家公司向来以洁身
- 快到 520 了,分享几段 520 专属 Python 代码,不多说了,下面直接上货。No.1效果:主要代码:import tur
- <?php/** * HOST: www.icbase.com *///set_time_limit(0);//
- 切换按钮是QPushButton的特殊模式。它是一个具有两种状态的按钮:按压和未按压。我们通过这两种状态之间的切换来修改其它内容。#!/us
- urllib 是 python 的内置模块, 主要用于处理url相关的一些操作,例如访问url、解析url等操作。urllib 包下面的 r
- <%'asp事务处理。'测试数据库为sql server,服务器为本机,数据库名为test,表名为a,两个字段id(i
- Python画图(线条颜色、大小、线形)先放基础代码,下面讲述效果:import matplotlib.pyplot as pltimpor
- 如下所示:# coding = utf-8import requestsimport jsonhost = "http://47.