Robot_Steve 发表于 2020-3-13 18:23:42

tkinter VS Pygame (以打飞机为例)

本帖最后由 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 的“碰撞检测”不太完美,请谅解!

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

from pygame import init,mixer
from random import randint
from tkinter import *

version = "Beta-0.2"
root = Tk()
root.title("Plane-warVercion: "+version)
root.iconbitmap("planeicon.ico")
root.geometry("375x500")
root.resizable(0, 0)

px = 180
py = 465
player_dkill = False
score = 0

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

Label(w,text="Score: "+str(score),bg="Lavender",font=("楷体",16)).place(relx=0.001,rely=0.001)
def move(move_position):
    if player_dkill == False:
      global px
      global py
      global p
      if move_position == "A":
            px = px - 10
            w.delete(p)
            p = w.create_image(px, py, image=photo)
      else:
            px = px + 10
            w.delete(p)
            p = w.create_image(px, py, image=photo)
    # print(str(py) + "-----" + str(px))
def amove(ok):
move("A")
def dmove(ok):
move("D")
bullet = PhotoImage(file="bullet.png")
enemy1 = PhotoImage(file="enemy1.png")
by = py
bx = px
b = w.create_image(bx, by, image=bullet)
def bulletmove():
if player_dkill == False:
      global b
      global by
      global bx
      by = by - 30
      w.delete(b)
      b= w.create_image(bx, by, image=bullet)
      if by <= -20:
      w.delete(b)
      by = py - 10
      bx = px + 20
      # global bmafter
      global bmafter
      bmafter = w.after(50, bulletmove)
else:
      w.after_cancel(bmafter)
bulletmove()
photo = PhotoImage(file="player.png")
p = w.create_image(px, py, image=photo)

enemy_plane1_list = {}
epid = -1
clear_plane = PhotoImage(file="d.png")
plane_kill = PhotoImage(file="enemy_plane1_kill.png")
player_kill = PhotoImage(file="player_destro.png")
class Enemy_plane1():
    def __init__(self):
      global epid
      self.ep1_x = int(str(randint(5, 32)) + "0")
      self.ep1_y = 15
      epid = epid + 1
      self.epids = "id: "+str(epid)
      enemy_plane1_list =
      self.tp = w.create_image(self.ep1_x, self.ep1_y, image=enemy1)
      self.enemy_plane1_move()
      self.epaddafter = w.after(1000, Enemy_plane1)
      self.epmafter = w.after(1,self.enemy_plane1_kill)
    def enemy_plane1_move(self):
      while_times = len(enemy_plane1_list) - 1
      start_while_times = 0
      while start_while_times != while_times:
            x = enemy_plane1_list["id: "+str(start_while_times)]
            x = x
            y = enemy_plane1_list["id: "+str(start_while_times)]
            y = y
            if x != None:
                w.create_image(x, y, image=clear_plane)
                y = y + 30
                self.tp = w.create_image(x, y, image=enemy1)
                enemy_plane1_list["id: "+str(start_while_times)] =
                start_while_times = start_while_times + 1
            else:
                start_while_times = start_while_times + 1
    def enemy_plane1_kill(self):
      while_times = len(enemy_plane1_list) - 1
      start_while_times = 0
      while start_while_times != while_times:
            x = enemy_plane1_list["id: " + str(start_while_times)]
            x = x
            y = enemy_plane1_list["id: " + str(start_while_times)]
            y = y
            if x != None:
                if x == bx:
                  init()
                  mixer.music.load("bomm.mp3")
                  mixer.music.play(0, 1)
                  w.create_image(x,y, image=plane_kill)
                  global score
                  score = score + 100
                  Label(w, text="Score: " + str(score), bg="Lavender", font=("楷体", 16)).place(relx=0.001, rely=0.001)
                  kill = None
                  enemy_plane1_list["id: " + str(start_while_times)] =
                  start_while_times = start_while_times + 1
                else:
                  start_while_times = start_while_times + 1
            else:
                start_while_times = start_while_times + 1
      self.kill_player()
    def kill_player(self):
      while_times2 = len(enemy_plane1_list) - 1
      start_while_times2 = 0
      while start_while_times2 != while_times2:
            y1 = enemy_plane1_list["id: " + str(start_while_times2)]
            y1 = y1
            x1 = enemy_plane1_list["id: " + str(start_while_times2)]
            x1 = x1
            if x1 != None:
                if y1 == py and x1 == px:
                  mixer.music.load("bomm.mp3")
                  mixer.music.play(0, 1)
                  w.create_image(px, py, image=player_kill)
                  w.after_cancel(bmafter)
                  w.after_cancel(self.epaddafter)
                  w.after_cancel(self.epmafter)
                  w.after_cancel(bmafter)
                  global player_dkill
                  player_dkill = True
                  for i in range(2000):
                        pass
                  Label(w,text="Game Over",bg="Lavender",font=("楷体",35)).place(relx=0.2,rely=0.45)
                  Label(w, text="Score: " + str(score), bg="Lavender", font=("楷体", 20)).place(relx=0.27, rely=0.55)
                  start_while_times2 = start_while_times2 + 1
                else:
                  start_while_times2 = start_while_times2 + 1
            else:
                start_while_times2 = start_while_times2 + 1
Enemy_plane1()

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

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
---------------------------------------------------------
第三轮,简易性:

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

Pygame:
import pygame
from sys import exit# 用来退出程序
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((600,400))
while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:# 退出
            exit()
    screen.fill((255, 255, 255)) # 设置窗口背景颜色
    font = pygame.font.SysFont('楷体', 60) # 设置字体
    surface = font.render('hello python!', False, (255, 200, 10)) # 显示字体
    screen.blit(surface, (100, 100)) # 填充
    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 结合
他们俩能够结合那将是史无前例的无敌。


秘密:
**** Hidden Message *****

awonhe 发表于 2020-3-27 22:34:26

学习

python小鲨鱼 发表于 2020-4-1 11:53:32

学习

王富帅 发表于 2020-4-2 10:31:09

学习

御诗翔子 发表于 2020-4-7 22:41:08

惊了

cupbbboom 发表于 2020-4-16 14:52:30

你不是说云盘不会过期吗?{:10_277:}

cupbbboom 发表于 2020-4-16 14:54:04

{:10_277:}

innerpeace 发表于 2020-4-16 21:20:19

学习了

Robot_Steve 发表于 2020-4-21 07:52:39

cupbbboom 发表于 2020-4-16 14:52
你不是说云盘不会过期吗?

应该是百度文盘长时间检测到没有人,自动撤回

Robot_Steve 发表于 2020-4-21 07:53:33

cupbbboom 发表于 2020-4-16 14:52
你不是说云盘不会过期吗?

不过上面有原代码

jiangteng250 发表于 2020-4-27 10:52:26

1

aaron.yang 发表于 2020-5-6 12:20:42

看一下

wuqramy 发表于 2020-5-8 21:17:19

哈哈 有趣

阿young 发表于 2020-6-6 22:43:29

{:10_334:}

靳子轩 发表于 2020-6-23 22:48:21

?

Robot_Steve 发表于 2020-8-20 17:20:58

本帖最后由 Robot_Steve 于 2021-8-7 00:25 编辑

学习

一切从简 发表于 2020-8-22 19:06:02

666

ericshuiSC 发表于 2020-8-25 14:03:25

打开查看秘密

VE_Stu 发表于 2020-8-27 23:03:02

学习

鱼cpython学习者 发表于 2020-9-2 22:07:52

学习了
页: [1] 2
查看完整版本: tkinter VS Pygame (以打飞机为例)