五一劳动节到了,既然是节日,就要给点“福利”[aru_14]。这次的福利是两段 Python 代码![aru_3]
所需 Python 版本
Python 3.x
Python 安装方法
Windows
戳这里获取安装包:
戳我下载Linux
Linux 通常自带 Python。可以使用命令:
Python3
来验证是否安装 Python 3。如果没有,CentOS 可以这样:
yum -y install python3
Ubuntu 可以这样:
sudo apt install python3
所需 Python 模块
- pygame
- easygui
- winsound(自带)
- time(自带)
- random(自带)
- sys(自带)
模块安装方法
这个不用多讲吧?[aru_31] Python 3.x 的通用方法就是 pip。以上模块可以通过以下命令安装:
pip install pygame && pip install easygui
代码
代码来喽![aru_17] 请看下方。
#--------------------------------
# Coding by www.ych-template.com
#--------------------------------
import pygame, random, winsound, easygui, sys, time
a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
test = a[:][:]
tmp = 0
tmparr = 0
sys.setrecursionlimit(100000)
mark = [0, 0]
def cal():
r = 0
for i in range(3):
for j in range(3):
if a[i][j] != 0:
r = r + 1
return r
# 判断游戏是否结束
def win():
global tmp
tmp = 0
for i in range(3):
if a[0][i] == a[1][i] and a[1][i] == a[2][i]:
return a[1][i]
if a[i][0] == a[i][1] and a[i][1] == a[i][2]:
return a[i][1]
if a[0][0] == a[1][1] and a[1][1] == a[2][2]:
return a[1][1]
if a[0][2] == a[1][1] and a[1][1] == a[2][0]:
return a[1][1]
for i in range(3):
for j in range(3):
if a[i][j] == 0:
tmp = 1
break
if tmp == 0:
return 3
return 0
def trans(n):
if n == 1:
return 0, 0
elif n == 2:
return 0, 1
elif n == 3:
return 0, 2
elif n == 4:
return 1, 0
elif n == 5:
return 1, 1
elif n == 6:
return 1, 2
elif n == 7:
return 2, 0
elif n == 8:
return 2, 1
elif n == 9:
return 2, 2
else:
return None
# AI 的思想部分
def think(com):
global tmparr, a
l = [-1, -1]
tmplist = []
#if cal() == 2 and a[1][1] == 1 and com == 1 and a[0][2] == 0 and a[2][2] == 0 and a[0][0] == 0 and a[2][0] == 0:
# return random.randint(0, 1) * 2, random.randint(0, 1) * 2
if cal() == 1 and a[1][1] == 1 and com == 2:
return random.randint(0, 1) * 2, random.randint(0, 1) * 2
for i in range(3):
for j in range(3):
if a[i][j] == 0:
tmparr = a[i][j]
a[i][j] = com
if win() == com:
a[i][j] = tmparr
return i, j
a[i][j] = 3 - com
if win() == 3 - com:
a[i][j] = tmparr
l = [i, j]
continue
a[i][j] = tmparr
if l != [-1, -1]:
return l[0], l[1]
for x in range(3):
for y in range(3):
if a[x][y] != 0:
continue
tmparr = a[x][y]
a[x][y] = com
for i in range(3):
for j in range(3):
if a[i][j] == 0:
tmparr2 = a[i][j]
a[i][j] = com
if win() == com:
for k in tmplist:
if k == [x, y]:
a[i][j] = tmparr2
a[x][y] = tmparr
return x, y
tmplist.append([x, y])
a[i][j] = tmparr2
a[x][y] = tmparr
return trans(random.randint(1, 9))
def go(com):
if win() == 0:
x, y = think(com)
if a[x][y] != 0:
go(com)
return
a[x][y] = com
return
# 制作出动画
def animate(com):
screen.fill([255, 255, 255])
pygame.draw.rect(screen, [0, 0, 0], [0, 195, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 395, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [195, 0, 10, 600], 0)
pygame.draw.rect(screen, [0, 0, 0], [395, 0, 10, 600], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 590, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 0, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 0, 10, 600], 0)
pygame.draw.rect(screen, [0, 0, 0], [590, 0, 10, 600], 0)
for i in range(3):
for j in range(3):
if a[i][j] == com:
screen.blit(pic2, [j * 200 - 10, i * 200 - 120])
elif a[i][j] == 3 - com:
screen.blit(pic1, [j * 200 - 10, i * 200 - 120])
pygame.display.flip()
# 主体部分
pygame.init()
disp = pygame.font.Font("cour.ttf", 100)
screen = pygame.display.set_mode([600, 600])
pygame.display.set_caption("井字棋游戏 - By 杨承翰")
icon = pygame.image.load("favicon.png").convert_alpha()
pygame.display.set_icon(icon)
pic1_font = pygame.font.Font("cour.ttf", 355)
pic1 = pic1_font.render("o", 1, (0, 0, 255))
pic2_font = pygame.font.Font("cour.ttf", 390)
pic2 = pic2_font.render("×", 1, (0, 0, 255))
running = True
for looper in range(5):
if not running:
break
screen.fill([255, 255, 255])
pygame.draw.rect(screen, [0, 0, 0], [0, 195, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 395, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [195, 0, 10, 600], 0)
pygame.draw.rect(screen, [0, 0, 0], [395, 0, 10, 600], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 590, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 0, 600, 10], 0)
pygame.draw.rect(screen, [0, 0, 0], [0, 0, 10, 600], 0)
pygame.draw.rect(screen, [0, 0, 0], [590, 0, 10, 600], 0)
pygame.display.flip()
a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
test = a[:][:]
tmp = 0
tmparr = 0
if int(time.time() + 1) % 2:
easygui.msgbox(msg = "抽签得出,您是先手。", title = "抽签", ok_button = "知道了")
pygame.time.delay(700)
usr = 1
com = 2
else:
easygui.msgbox(msg = "抽签得出,您是后手。", title = "抽签", ok_button = "知道了")
pygame.time.delay(700)
usr = 2
com = 1
if usr == 2:
time.sleep(1)
go(com)
animate(com)
winsound.Beep(2000, 700)
while running:
e = 1
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.pos[0] < 200 and event.pos[1] < 200 and e and a[0][0] == 0:
a[0][0] = usr
e = 0
elif event.pos[0] > 200 and event.pos[0] < 400 and event.pos[1] < 200 and e and a[0][1] == 0:
a[0][1] = usr
e = 0
elif event.pos[0] > 400 and event.pos[1] < 200 and e and a[0][2] == 0:
a[0][2] = usr
e = 0
elif event.pos[0] < 200 and event.pos[1] > 200 and event.pos[1] < 400 and e and a[1][0] == 0:
a[1][0] = usr
e = 0
elif event.pos[0] > 200 and event.pos[0] < 400 and event.pos[1] > 200 and event.pos[1] < 400 and e and a[1][1] == 0:
a[1][1] = usr
e = 0
elif event.pos[0] > 400 and event.pos[1] > 200 and event.pos[1] < 400 and e and a[1][2] == 0:
a[1][2] = usr
e = 0
elif event.pos[0] < 200 and event.pos[1] > 400 and event.pos[1] < 600 and e and a[2][0] == 0:
a[2][0] = usr
e = 0
elif event.pos[0] > 200 and event.pos[0] < 400 and event.pos[1] > 400 and event.pos[1] < 600 and e and a[2][1] == 0:
a[2][1] = usr
e = 0
elif event.pos[0] > 400 and event.pos[1] > 400 and event.pos[1] < 600 and e and a[2][2] == 0:
a[2][2] = usr
e = 0
break
if e:
continue
animate(com)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
time.sleep(1)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
go(com)
animate(com)
w = win()
if w == 0:
winsound.Beep(2000, 700)
continue
winsound.Beep(1200, 700)
if looper < 4:
if w == 3:
easygui.msgbox(msg = "哎哟,平局了!\n\n目前比分:%d:%d" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
pygame.time.delay(200)
break
elif w == usr:
mark[1] += 1
easygui.msgbox(msg = "恭喜你,你赢了!\n\n目前比分:%d:%d" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
pygame.time.delay(200)
break
elif w == com:
mark[0] += 1
easygui.msgbox(msg = "对不起,你输了!\n\n目前比分:%d:%d" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
pygame.time.delay(200)
break
else:
if w == 3:
if mark[1] < mark[0]:
easygui.msgbox(msg = "哎哟,平局了!\n\n比分为:%d:%d ,你输了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
elif mark[1] > mark[0]:
easygui.msgbox(msg = "哎哟,平局了!\n\n比分为:%d:%d ,你赢了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
else:
easygui.msgbox(msg = "哎哟,平局了!\n\n比分为:%d:%d ,平局了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
pygame.time.delay(200)
break
elif w == usr:
mark[1] += 1
if mark[1] < mark[0]:
easygui.msgbox(msg = "恭喜你,你赢了!\n\n比分为:%d:%d ,你输了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
elif mark[1] > mark[0]:
easygui.msgbox(msg = "恭喜你,你赢了!\n\n比分为:%d:%d ,你赢了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
else:
easygui.msgbox(msg = "恭喜你,你赢了!\n\n比分为:%d:%d ,平局了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
pygame.time.delay(200)
break
elif w == com:
mark[0] += 1
if mark[1] < mark[0]:
easygui.msgbox(msg = "对不起,你输了!\n\n比分为:%d:%d ,你输了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
elif mark[1] > mark[0]:
easygui.msgbox(msg = "对不起,你输了!\n\n比分为:%d:%d ,你赢了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
else:
easygui.msgbox(msg = "对不起,你输了!\n\n比分为:%d:%d ,平局了!" % (mark[1], mark[0]), title = "结果", ok_button = "好的")
pygame.time.delay(200)
break
pygame.quit()
代码没加太多注释,应该 …… 看得懂吧 …… [aru_34]
我们还需要一个字体文件,下载地址:
蓝奏云还有,我们的图标在这里下载:
请注意,只有 Chrome / 火狐 可以使用下载功能,其它浏览器的用户请换浏览器或点击下方按钮,手动保存!
运行方法
新建一个 chess.py 的文件(可以先建立一个文本文档,再 修改其后缀名 为 py),然后将以上代码键入并保存,把之前下载的字体 ttf 文件放在同一目录。[aru_42] 然后使用命令运行:
python chess.py
打包方法
代码敲完之后,我们需要将 py 文件打包。这里举出 Windows 的例子,其它系统请 百度搜索 。[aru_33]
首先,我们需要安装 pyinstaller。安装命令:
pip install pyinstaller
接着,使用两行命令
pyi-makespec chess.py pyinstaller -i 【ico 图标路径】-w chess.py
来进行打包。然后文件夹中会出现一个 dist 目录,打开里面会有“chess”目录(也就是 py 文件的前缀),其中有着我们要的 chess.exe。这时还打不开,记住,要把 ttf 文件和下载的图片放到此目录![aru_59]
本文作者为Blogych,转载请注明。