鱼C论坛

 找回密码
 立即注册
查看: 6293|回复: 25

[技术交流] tkinter VS Pygame (以打飞机为例)

[复制链接]
发表于 2020-3-13 18:23:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Robot_Steve 于 2020-3-14 13:50 编辑

tkinterVSPygame

Pygame编游戏有点复杂,而 tkinter 呢,资料太少
于是就只能用 Pygame 编游戏了
tkinter 能很好的构建 GUI 窗口,但是不适用于编写游戏。
而 Pygame 能很好的编写游戏(里边有现成的碰撞检测和动画精灵函数),但是不能很好的构建 GUI ,像按钮或者是标签。
我上网查过。别人说 Pygame 设计按钮需要找一个图片把图片给P上去,在检测鼠标有没有点击到图片(说白了就是检测坐标)
额... 说了这么多,好像是废话 ...

咳咳,言归正传。今天呢,就是来一场 tkinter 和 Pygame 的 “对战”
以打飞机游戏作为今天的 “考题”
我是先用 tkinter 做了一个打飞机游戏 (因为我只会用 tkinter,Pygame 有点太复杂

链接如下:
链接: https://pan.baidu.com/s/1D2fuWRB5aRL65U2WqZ75hQ
提取码: 5f26
先别着急着复制链接,先看下面的使用问题,以免你碰到
这个呢需要你手动的复制,然后找一个网页,把链接复制上去

======================================
        使用问题:
问1: 如果他让你下载一个软件,怎么办?
答1: 你不要去下载它,打开那个文件夹,把里边的文件全部勾选,然后再点击普通下载。他会给你下载一个批量文件
------------------------------------------------------------
问2: 无法 exe 下载怎么办?
答2: 先下载图片,后面有具体代码
------------------------------------------------------------
问3(最担心的问题): 会不会过期?
答3(最担心的问题): 不会过期,是永久的
======================================

呃,在这里我不能给大家发图片,我没有拍图片(实际上是我没有权限发图片,这句话你不要看)
大家可以体验体验。额,由于 tkinter 的“碰撞检测”不太完美,请谅解!

好啦,先给代码上来(代码敲得过于着急没有加注释,见谅):
注:如果代码有中文(除了注释),把翻译关掉就好了

  1. from pygame import init,mixer
  2. from random import randint
  3. from tkinter import *

  4. version = "Beta-0.2"
  5. root = Tk()
  6. root.title("Plane-war  Vercion: "+version)
  7. root.iconbitmap("planeicon.ico")
  8. root.geometry("375x500")
  9. root.resizable(0, 0)

  10. px = 180
  11. py = 465
  12. player_dkill = False
  13. score = 0

  14. w = Canvas(root,width=600,height=500)
  15. w.pack()
  16. bg = PhotoImage(file="bg.png")
  17. w.create_image(10,10,image=bg)

  18. Label(w,text="Score: "+str(score),bg="Lavender",font=("楷体",16)).place(relx=0.001,rely=0.001)
  19. def move(move_position):
  20.     if player_dkill == False:
  21.         global px
  22.         global py
  23.         global p
  24.         if move_position == "A":
  25.             px = px - 10
  26.             w.delete(p)
  27.             p = w.create_image(px, py, image=photo)
  28.         else:
  29.             px = px + 10
  30.             w.delete(p)
  31.             p = w.create_image(px, py, image=photo)
  32.     # print(str(py) + "-----" + str(px))
  33. def amove(ok):
  34.   move("A")
  35. def dmove(ok):
  36.   move("D")
  37. bullet = PhotoImage(file="bullet.png")
  38. enemy1 = PhotoImage(file="enemy1.png")
  39. by = py
  40. bx = px
  41. b = w.create_image(bx, by, image=bullet)
  42. def bulletmove():
  43.   if player_dkill == False:
  44.       global b
  45.       global by
  46.       global bx
  47.       by = by - 30
  48.       w.delete(b)
  49.       b= w.create_image(bx, by, image=bullet)
  50.       if by <= -20:
  51.         w.delete(b)
  52.         by = py - 10
  53.         bx = px + 20
  54.       # global bmafter
  55.       global bmafter
  56.       bmafter = w.after(50, bulletmove)
  57.   else:
  58.       w.after_cancel(bmafter)
  59. bulletmove()
  60. photo = PhotoImage(file="player.png")
  61. p = w.create_image(px, py, image=photo)

  62. enemy_plane1_list = {}
  63. epid = -1
  64. clear_plane = PhotoImage(file="d.png")
  65. plane_kill = PhotoImage(file="enemy_plane1_kill.png")
  66. player_kill = PhotoImage(file="player_destro.png")
  67. class Enemy_plane1():
  68.     def __init__(self):
  69.         global epid
  70.         self.ep1_x = int(str(randint(5, 32)) + "0")
  71.         self.ep1_y = 15
  72.         epid = epid + 1
  73.         self.epids = "id: "+str(epid)
  74.         enemy_plane1_list[self.epids] = [self.ep1_x, self.ep1_y]
  75.         self.tp = w.create_image(self.ep1_x, self.ep1_y, image=enemy1)
  76.         self.enemy_plane1_move()
  77.         self.epaddafter = w.after(1000, Enemy_plane1)
  78.         self.epmafter = w.after(1,self.enemy_plane1_kill)
  79.     def enemy_plane1_move(self):
  80.         while_times = len(enemy_plane1_list) - 1
  81.         start_while_times = 0
  82.         while start_while_times != while_times:
  83.             x = enemy_plane1_list["id: "+str(start_while_times)]
  84.             x = x[0]
  85.             y = enemy_plane1_list["id: "+str(start_while_times)]
  86.             y = y[1]
  87.             if x != None:
  88.                 w.create_image(x, y, image=clear_plane)
  89.                 y = y + 30
  90.                 self.tp = w.create_image(x, y, image=enemy1)
  91.                 enemy_plane1_list["id: "+str(start_while_times)] = [x, y]
  92.                 start_while_times = start_while_times + 1
  93.             else:
  94.                 start_while_times = start_while_times + 1
  95.     def enemy_plane1_kill(self):
  96.         while_times = len(enemy_plane1_list) - 1
  97.         start_while_times = 0
  98.         while start_while_times != while_times:
  99.             x = enemy_plane1_list["id: " + str(start_while_times)]
  100.             x = x[0]
  101.             y = enemy_plane1_list["id: " + str(start_while_times)]
  102.             y = y[1]
  103.             if x != None:
  104.                 if x == bx:
  105.                     init()
  106.                     mixer.music.load("bomm.mp3")
  107.                     mixer.music.play(0, 1)
  108.                     w.create_image(x,y, image=plane_kill)
  109.                     global score
  110.                     score = score + 100
  111.                     Label(w, text="Score: " + str(score), bg="Lavender", font=("楷体", 16)).place(relx=0.001, rely=0.001)
  112.                     kill = None
  113.                     enemy_plane1_list["id: " + str(start_while_times)] = [kill, kill]
  114.                     start_while_times = start_while_times + 1
  115.                 else:
  116.                     start_while_times = start_while_times + 1
  117.             else:
  118.                 start_while_times = start_while_times + 1
  119.         self.kill_player()
  120.     def kill_player(self):
  121.         while_times2 = len(enemy_plane1_list) - 1
  122.         start_while_times2 = 0
  123.         while start_while_times2 != while_times2:
  124.             y1 = enemy_plane1_list["id: " + str(start_while_times2)]
  125.             y1 = y1[1]
  126.             x1 = enemy_plane1_list["id: " + str(start_while_times2)]
  127.             x1 = x1[0]
  128.             if x1 != None:
  129.                 if y1 == py and x1 == px:
  130.                     mixer.music.load("bomm.mp3")
  131.                     mixer.music.play(0, 1)
  132.                     w.create_image(px, py, image=player_kill)
  133.                     w.after_cancel(bmafter)
  134.                     w.after_cancel(self.epaddafter)
  135.                     w.after_cancel(self.epmafter)
  136.                     w.after_cancel(bmafter)
  137.                     global player_dkill
  138.                     player_dkill = True
  139.                     for i in range(2000):
  140.                         pass
  141.                     Label(w,text="Game Over",bg="Lavender",font=("楷体",35)).place(relx=0.2,rely=0.45)
  142.                     Label(w, text="Score: " + str(score), bg="Lavender", font=("楷体", 20)).place(relx=0.27, rely=0.55)
  143.                     start_while_times2 = start_while_times2 + 1
  144.                 else:
  145.                     start_while_times2 = start_while_times2 + 1
  146.             else:
  147.                 start_while_times2 = start_while_times2 + 1
  148. Enemy_plane1()

  149. root.bind("<Key-d>",dmove)
  150. root.bind("<Key-a>",amove)

  151. mainloop()
复制代码


=================================
        PVP 开始
=================================
tkinter 分数:  0
Pygame 分数: 0
----------------------------------------------------------
第一轮,碰撞检测函数:

呃,好像第一轮 tkinter 就要败下阵来tkinter 是做界面的,可以说他对游戏 “一无所知”
如上代码示例:tkinter 只有当子弹“穿过”小飞机时,小飞机才能爆炸,但是 Pygame (虽然我没有给你 Pygame 做的游戏) 只要轻轻一碰就可以使小飞机爆炸。
但是它也有弊端,如果你碰撞检测函数没有写好,小飞机没有碰到玩家飞机时,游戏就 Game Over 了。
但总体来说,Pygame 略胜一筹!
分数:
tkinter 分数:  0
Pygame 分数: 1
---------------------------------------------------------
第二轮,播放音乐:

呃,好像第二轮 tkinter 又要败下阵来了。
如上代码示例:我并没有使用 tkinter 来播放音乐,我使用的是 Pygame。
为了播放音乐,我查过好多资料。但是“一无所获”,tkinter 没有提供可以播放音乐的工具。而 Pygame 作为专门制作游戏的工具,它提供了播放音乐这个功能。
所以这一轮,Pygame 获胜!
小提示:如果 Pygame 正在播放一个音乐,如打飞机的背景音乐,但是如果你突然子弹打到小飞机,播放了一个BOOM的音乐,背景音乐就会停止。
分数:
tkinter 分数:  0
Pygame 分数: 2
---------------------------------------------------------
第三轮,简易性:

嗯,什么叫简易性?对我来说简易性就是简单
小甲鱼说过,Pygame 是由 C 语言编写,为了提升效率。所以按照这个逻辑,Pygame 的一些东西,他是不是有个专门的模块或者是什么别的东西。
对我来说,Pygame 没有 tkinter 简单。以例子服人:
例子:  在屏幕上显示  hello, world
tkinter:  
  1. from tkinter import *
  2. root = Tk()
  3. Label(root, text="hello, world").pack()
  4. mainloop() # 这句话必须写
复制代码


Pygame:
  1. import pygame
  2. from sys import exit  # 用来退出程序
  3. # 初始化pygame
  4. pygame.init()
  5. screen = pygame.display.set_mode((600,400))
  6. while True:
  7.     for event in pygame.event.get():
  8.         if event.type == pygame.QUIT:  # 退出
  9.             exit()
  10.     screen.fill((255, 255, 255)) # 设置窗口背景颜色
  11.     font = pygame.font.SysFont('楷体', 60) # 设置字体
  12.     surface = font.render('hello python!', False, (255, 200, 10)) # 显示字体
  13.     screen.blit(surface, (100, 100)) # 填充
  14.     pygame.display.update() # 画面刷新
复制代码


大家说相比起来哪个更简单?
对了,tkinter !
但是 Pygame 是专门做游戏的,他对字体不太擅长,但相比其他的而言,Pygame 略胜一筹(碰撞检测、动画精灵)
所以 Pygame 得一分...
哎哎,跑题了,我们说的是简易性,而不是“其他”...
所以,分数是:
tkinter 分数:  1
Pygame 分数: 2
----------------------------------------------------------
第四轮(最后一轮),窗口设计:

哎呀!这应该不用我说了吧。
前面就说到了。
但是我还要说一次,但并不是让 Pygame 出丑
我说过,tkinter 设计 GUI 是特别擅长的,但是 Pygame 就落后了一点。
在这里。我所指的 GUI 并一般人理解的 GUI,而是窗口设计!
观众: 你说的什么呀?两个不就一样吗?
我  :NO,NO,NO
我这里所指的窗口设计,是整个窗口的布局,而不是一般代码能替代的。
之前也许我一直都说错。tkinter 是对那些GUI组件(像 Label 组件、Button 组件...)擅长,而不是窗口布局。
tkinter 能精准到毫米的布局管理器只有 place
tkinter 每一次布局,都必须运行代码查看位置适合不适合。所以说,用 tkinter 设计窗口比较麻烦,但对于那些 GUI 组件 特别擅长。
意思注释:
擅长: 他提供的组建非常多。
怎么又跑题了?
tkinter 比 Pygame 更擅长 GUI设计
分数:
tkinter 分数:  2
Pygame 分数: 2
=================================
        结果:
=================================
虽然他们俩平局了,但是我还是有个希望的。
我不偏向哪一边。但是我希望(即使这个希望无法实现):
        Pygame 能和 tkinter 结合
他们俩能够结合那将是史无前例的无敌。


秘密:
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1荣誉 +2 收起 理由
斑比酱 + 2 学习

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-27 22:34:26 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 11:53:32 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-2 10:31:09 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-7 22:41:08 | 显示全部楼层
惊了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-16 14:52:30 | 显示全部楼层
你不是说云盘不会过期吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-16 14:54:04 | 显示全部楼层
1587020001(1).jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-16 21:20:19 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 07:52:39 | 显示全部楼层
cupbbboom 发表于 2020-4-16 14:52
你不是说云盘不会过期吗?

应该是百度文盘长时间检测到没有人,自动撤回
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 07:53:33 | 显示全部楼层
cupbbboom 发表于 2020-4-16 14:52
你不是说云盘不会过期吗?

不过上面有原代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 10:52:26 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-6 12:20:42 | 显示全部楼层
看一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-8 21:17:19 | 显示全部楼层
哈哈 有趣
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-6 22:43:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-23 22:48:21 | 显示全部楼层
?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-20 17:20:58 | 显示全部楼层
本帖最后由 Robot_Steve 于 2021-8-7 00:25 编辑

学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 19:06:02 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-25 14:03:25 | 显示全部楼层
打开查看秘密
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 23:03:02 From FishC Mobile | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-2 22:07:52 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-27 05:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表