Crossin的编程教室

标题: 【Pygame 第12课】 屡败屡战 [打印本页]

作者: crossin先生    时间: 2013-9-6 23:58
标题: 【Pygame 第12课】 屡败屡战
打飞机游戏,我们已经做得差不多了。今天要再加上两个功能,让它看上去更完整:显示分数、重新开始。这样,玩家才能一次接一次地玩下去。

要显示分数,首先得有一个变量记录分数:
  1. score = 0
复制代码
当打中敌机的时候,把分数增加。为了达到这个目的,修改一下之前的checkHit函数,让它和checkCrash一样,返回一个bool值,表示是否发生了碰撞:
  1. def checkHit(enemy, bullet):
  2.     if (bullet.x > enemy.x and bullet.x < enemy.x + enemy.image.get_width()) and (
  3.         bullet.y > enemy.y and bullet.y < enemy.y + enemy.image.get_height()
  4.     ):
  5.         enemy.restart()
  6.         bullet.active = False
  7.         #增加返回值
  8.         return True
  9.     return False
复制代码
在主循环里,当checkHit为True时,就增加分数:
  1. for b in bullets:
  2.     if b.active:
  3.         for e in enemies:
  4.             #击中敌机后,分数加100
  5.             if checkHit(e, b):
  6.                 score += 100
  7.         b.move()
  8.         screen.blit(b.image, (b.x, b.y))
复制代码
这样,就用score记录了游戏中的分数。

在pygame中要显示文字,不能直接print,那样只会在命令行里输出,无法显示在屏幕上。需要先创建一个font对象:
  1. font = pygame.font.Font(None, 32)
复制代码
None表示使用默认字体,32是字号。

然后,用font渲染出字体,再绘制到screen上:
  1. text = font.render("Socre: %d" % score, 1, (0, 0, 0))
  2. screen.blit(text, (0, 0))
复制代码
(0,0)是屏幕左上角的位置。
当游戏结束后,我们要把分数显示在屏幕中间,改变这个坐标就可以了。

为了让游戏结束后能方便地重新开始,我们再往事件响应的代码中增加一段处理:
  1. #判断在gameover状态下点击了鼠标
  2. if gameover and event.type == pygame.MOUSEBUTTONUP:
  3.     #重置游戏
  4.     plane.restart()
  5.     for e in enemies:
  6.         e.restart()
  7.     for b in bullets:
  8.         b.active = False
  9.     score = 0
  10.     gameover = False
复制代码
当gameover状态下发生了鼠标按钮抬起的事件(即玩家点击了鼠标),我们就把本体和敌机都重置位置,子弹都设active为False,分数清零,gameover为False,游戏重新开始。

好了,现在你可以一次又一次地去迎战敌机,再一次又一次地被撞毁了。不限次数,不用向好友索要飞机哦。至于记录最高分什么的,我想你应该也可以搞定吧。


12-1.jpg

12-2.jpg

12-3.jpg

12-4.jpg

#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:156630350

面向零基础初学者的编程课
每天5分钟,轻松学编程

12.py

3.95 KB, 下载次数: 837

源代码


作者: Victor    时间: 2013-9-7 08:46
本帖最后由 Victor 于 2013-9-7 11:42 编辑

为什么我在checkHit函数里面直接加分,最后得出的Score永远是0呢

wrong checkHit.jpg (22.1 KB, 下载次数: 426)

wrong checkHit.jpg


作者: 匠逍之岿    时间: 2013-9-7 11:40
我在程序里加了两段代码想记录和显示一下最高分,为什么有的时候能记录最高分  有时候不是最高分也记录呢?

搜狗截图20130907113237.png (2.69 KB, 下载次数: 447)

搜狗截图20130907113237.png

搜狗截图20130907113827.png (15.84 KB, 下载次数: 417)

搜狗截图20130907113827.png


作者: crossin先生    时间: 2013-9-7 16:48
匠逍之岿 发表于 2013-9-7 11:40
我在程序里加了两段代码想记录和显示一下最高分,为什么有的时候能记录最高分  有时候不是最高分也记录呢? ...

那你就输出score和high_score,看看发生了什么情况
作者: crossin先生    时间: 2013-9-7 16:49
匠逍之岿 发表于 2013-9-7 11:40
我在程序里加了两段代码想记录和显示一下最高分,为什么有的时候能记录最高分  有时候不是最高分也记录呢? ...

当你游戏中创造了一次最高分后,有没有去更新high_score的值?
作者: dark    时间: 2013-9-8 15:01
听说回复有钱挣……
作者: waller516435165    时间: 2013-9-8 22:56
crossin先生,你编程用的是什么字体啊?
作者: crossin先生    时间: 2013-9-10 00:12
waller516435165 发表于 2013-9-8 22:56
crossin先生,你编程用的是什么字体啊?

这个截图里是sublime text 2的默认字体,据说是Consolas
linux下我用的是ubuntu mono
作者: liqing215    时间: 2013-9-10 20:44
        text = font.render("Socre:&d"% score,1,(0,0,0))
中间的1 是什么意思呢?
作者: liqing215    时间: 2013-9-10 20:45
        text = font.render("Socre:&d"% score,1,(0,0,0))
中间的1 是什么意思呢?

还有之前的screen = pygame.display.set_mode((450, 700), 0, 32)
后面的0, 32??
作者: liqing215    时间: 2013-9-10 20:45
        text = font.render("Socre:&d"% score,1,(0,0,0))
中间的1 是什么意思呢?

还有之前的screen = pygame.display.set_mode((450, 700), 0, 32)
后面的0, 32??
作者: liqing215    时间: 2013-9-10 20:51
还有在屏幕里面怎么换行吖。。。用“\n” 只显示一个空格
作者: liqing215    时间: 2013-9-10 21:04
哈哈, Crossssssssin 老师节日快乐有木有~~
作者: crossin先生    时间: 2013-9-10 23:21
liqing215 发表于 2013-9-10 20:51
还有在屏幕里面怎么换行吖。。。用“\n” 只显示一个空格

pygame的文字显示不能换行,要换行的话,得再用一个font
作者: liqing215    时间: 2013-9-11 20:16
crossin先生 发表于 2013-9-10 23:21
pygame的文字显示不能换行,要换行的话,得再用一个font

嗯,好的。谢谢、
作者: simple    时间: 2013-9-24 19:55
liqing215 发表于 2013-9-10 20:45
text = font.render("Socre:&d"% score,1,(0,0,0))
中间的1 是什么意思呢?

0,32应该指的是颜色质量是32位 。这个是我猜的,其实你把后面的0,32去掉还是能编译的。

1表示True吧。
text = font.render(question, True, (0,0,0))
这个还请大神再讲解下


作者: shallecker    时间: 2013-10-24 16:51
楼主威武,,,
  1. # -*- coding: utf-8 -*-

  2. import pygame
  3. from sys import exit
  4. import random

  5. pygame.init()
  6. screen = pygame.display.set_mode((450, 600), 0, 32)
  7. background = pygame.image.load("back.jpg").convert()
  8. plane = pygame.image.load("plane.png").convert_alpha()
  9. pygame.display.set_icon(plane)
  10. pygame.display.set_caption("打飞机")

  11. class Enemy:
  12.         def restart(self):
  13.                 #重置敌机位置和速度
  14.                 self.x = random.randint(50, 400)
  15.                 self.y = random.randint(-200, -50)
  16.                 self.speed = random.random() + 0.1
  17.                
  18.         def __init__(self):
  19.                         #初始化
  20.                 self.restart()
  21.                 self.image = pygame.image.load('enemy.png').convert_alpha()

  22.         def move(self):
  23.                 if self.y < 600:
  24.                         #向下移动
  25.                     self.y += 0.3
  26.                 else:
  27.                         #重置
  28.                     self.restart()
  29. #enemy = Enemy()
  30. enemies = []
  31. for i in range(3):
  32.     enemies.append(Enemy())

  33. class Bullet:
  34.         def __init__(self):
  35.                 #初始化成员变量,x,y,image
  36.                 self.x = 0
  37.                 self.y = -1
  38.                 self.image = pygame.image.load('bullet.png').convert_alpha()
  39.                 self.active = False
  40.         def restart(self):
  41.                 mouseX, mouseY = pygame.mouse.get_pos()
  42.                 self.x = mouseX - self.image.get_width() / 2
  43.                 self.y = mouseY - self.image.get_height() /2
  44.                 self.active = True
  45.         def move(self):
  46.                 #处理子弹的运动
  47.                 if self.y < 0:
  48.                         self.active = False
  49.                 if self.active:
  50.                         self.y -= 3         
  51. #创建子弹的list
  52. bullets = []
  53. #向list中添加5发子弹
  54. for i in range(5):
  55.     bullets.append(Bullet())
  56. #子弹总数
  57. count_b = len(bullets)
  58. #即将激活的子弹序号
  59. index_b = 0
  60. #发射子弹的间隔
  61. interval_b = 0

  62. class Plane:
  63.     def restart(self):
  64.         self.x = 200
  65.         self.y = 600
  66.         
  67.     def __init__(self):
  68.         self.restart()
  69.         self.image = pygame.image.load('plane.png').convert_alpha()

  70.     def move(self):
  71.         x, y = pygame.mouse.get_pos()
  72.         x-= self.image.get_width() / 2
  73.         y-= self.image.get_height() / 2
  74.         self.x = x
  75.         self.y = y

  76. plane = Plane()
  77. bullet = Bullet()
  78. enemy = Enemy()
  79. def checkHit(enemy, bullet):
  80.         if (bullet.x > enemy.x and bullet.x < enemy.x + enemy.image.get_width()) and (bullet.y > enemy.y and bullet.y < enemy.y + enemy.image.get_height()):
  81.             enemy.restart()
  82.             bullet.active = False
  83.             return True
  84.         return False

  85. def checkCrash(enemy, plane):
  86.     if (plane.x + 0.7*plane.image.get_width() > enemy.x) and (plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and (plane.y + 0.7*plane.image.get_height() > enemy.y) and (plane.y + 0.3*plane.image.get_height() < enemy.y + enemy.image.get_height()):
  87.         return True
  88.     return False

  89. gameover = False
  90. score = 0
  91. Hscore = []
  92. font = pygame.font.SysFont('楷体', 16)
  93. text1 = font.render(u"点击鼠标左键重新开始", 1, (0, 0, 0))

  94. while True:
  95.         for event in pygame.event.get():
  96.                 if event.type == pygame.QUIT:
  97.                     pygame.quit()
  98.                     exit()
  99.                 #判断在gameover状态下点击了鼠标
  100.                 if gameover and event.type == pygame.MOUSEBUTTONUP:
  101.                     #重置游戏
  102.                     plane.restart()
  103.                     for e in enemies:
  104.                         e.restart()
  105.                     for b in bullets:
  106.                         b.active = False
  107.                     score = 0
  108.                     gameover = False
  109.         screen.blit(background, (0,0))  
  110.         if not gameover:
  111.                 interval_b -= 1
  112.                 if interval_b < 0:
  113.                         bullets[index_b].restart()
  114.                         interval_b = 100
  115.                         index_b = (index_b+1) % count_b
  116.                 for b in bullets:
  117.                         if b.active:
  118.                                 for e in enemies:
  119.                                         if checkHit(e, b):
  120.                                                 score += 100
  121.                                         if checkCrash(e, plane):
  122.                                                 gameover = True
  123.                                        
  124.                                 b.move()
  125.                                 screen.blit(b.image, (b.x-23, b.y))
  126.                                 screen.blit(b.image, (b.x+25, b.y))
  127.                 for e in enemies:
  128.                         e.move()
  129.                         screen.blit(e.image, (e.x, e.y))
  130.                 plane.move()
  131.                 screen.blit(plane.image, (plane.x, plane.y))
  132.                 text = font.render("Socre:%d" % score, 1, (0, 0, 0))
  133.                 screen.blit(text, (0, 0))
  134.         else:
  135.                 screen.blit(text, (0, 0))
  136.                 screen.blit(text1,(100,32))
  137.                 Hscore.append(score)
  138.                 text2 = font.render(u"HScore:%d" % sorted(Hscore)[-1], 1, (0, 0, 0))
  139.                 screen.blit(text2, (250, 0))
  140.                 pass
  141.         pygame.display.update()

复制代码

作者: liu-pengfei    时间: 2014-9-20 23:20
哈哈哈哈,终于成功了。

作者: liu-pengfei    时间: 2014-9-21 00:22
成功了,打呀打呀打呀打呀打呀打呀。
作者: crossin先生    时间: 2014-9-21 15:24
liu-pengfei 发表于 2014-9-21 00:22
成功了,打呀打呀打呀打呀打呀打呀。

为你点赞!
作者: liu-pengfei    时间: 2014-9-21 19:08
crossin先生 发表于 2014-9-21 15:24
为你点赞!

先生,不知道”打飞机“里面可不可以加点声音文件呢?我想应该可以吧。这几天我再扩展一下代码。
作者: crossin先生    时间: 2014-9-22 10:27
liu-pengfei 发表于 2014-9-21 19:08
先生,不知道”打飞机“里面可不可以加点声音文件呢?我想应该可以吧。这几天我再扩展一下代码。 ...

可以的,但是我没有用过。你可以自行在网上搜索,然后尝试下
作者: lovingyun    时间: 2014-10-26 20:39
我将碰撞后的重置写在了一起
def restart(plane,e,enemies,b,bullets,score,gameover)
    plane.restart()
    for e in enemies:
        e.restart()
    for b in bullets:
        b.active = False
    score = 0
    gameover = False
但是在后面调用并不能正常运行了,我想是不是作用域的问题,另外我实验了一下,如果
def r(a,b):
    if a>0:
        b=True
    else:
        b=False
b=False
r(3,b)
print b
这样输出b也是false,请问这个和游戏中的差别在什么地方呢,为什么呢。有点混淆了,谢谢
作者: crossin先生    时间: 2014-10-27 16:35
lovingyun 发表于 2014-10-26 20:39
我将碰撞后的重置写在了一起
def restart(plane,e,enemies,b,bullets,score,gameover)
    plane.restart() ...

的确是作用域。如果你想在函数中改变一个变量的值,要么你把它定义为global全局变量,要么作为返回值return
作者: lovingyun    时间: 2014-11-6 21:07
crossin先生 发表于 2014-10-27 16:35
的确是作用域。如果你想在函数中改变一个变量的值,要么你把它定义为global全局变量,要么作为返回值retu ...

感觉得到这个地方还有一个迷惑的地方在于,检测碰撞的函数中,都可以把状态在函数中改掉,那么对象中的变量的作用域又是什么样的呢?对象中变量的值可以被函数修改吗?
作者: crossin先生    时间: 2014-11-7 20:56
lovingyun 发表于 2014-11-6 21:07
感觉得到这个地方还有一个迷惑的地方在于,检测碰撞的函数中,都可以把状态在函数中改掉,那么对象中的变 ...

对象中变量的作用域是看对象的。只要这个对象存在,就可以对它的成员变量进行操作。

作者: dreamlxt17    时间: 2015-10-3 22:17
下面是我改编了一点点的打飞机游戏,本意是:每次游戏只有5次机会(n<5),分数是累加的,最后一条命用完就输出 GAME OVER。可是写完之后发现,只玩5次可以实现,但是不能输出GEME OVER,请师父指点下我呗?多谢啦。


# -*- coding: cp936 -*-
import pygame
import random
from sys import exit

class Bullet():   #建一个子弹类
    def __init__(self):  #初始化位置
        self.x = 0
        self.y = -1
        self.image = pygame.image.load('bullet.png').convert_alpha() #载入子弹图片
        self.active = False  #默认不激活
        
    def move(self):
        if self.active:  #激活状态下向上移动
            self.y -= 1
        if self.y < 0:   #当飞出屏幕就设为不激活
            self.active = False
            
    def reset(self): #重置子弹位置
            mousex, mousey = pygame.mouse .get_pos()   #获取鼠标位置,也就是飞机的位置
            self.x = mousex - self.image.get_width()/2
            self.y = mousey - self.image.get_height()/2
            self.active = True  #重新激活      

class Enemy():   #创建敌机类
    def reset(self):  #初始化敌机位置
        self.x = random.randint(50,400)
        self.y = random.randint(-200,-50)
        self.speed = random.random()/5 + 0.1
        #print self.speed
        
    def __init__(self):  #初始化的时候调用reset()
        self.reset()
        self.image = pygame.image.load('enemy.png').convert_alpha()
        
    def move(self):
        if self.y < 800:
            self.y += self.speed
        else:   #若飞机掉出屏幕则重置
            self.reset()

class Plane():
    def reset(self):
        self.x = 200
        self.y = 600
        
    def __init__(self):
        self.reset()
        self.image = pygame.image.load('plane.png').convert_alpha()#载入飞机图片

    def move(self):
        x, y = pygame.mouse .get_pos()    #子弹和飞机的位置都是由鼠标决定的
        x -= self.image.get_width()/2   
        y -= self.image.get_height()/2
        self.x = x
        self.y = y
        
def checkhit(bullet, enemy):  #命中目标函数
    if (bullet.x > enemy.x and bullet.x < enemy.image.get_width() + enemy.x) and (
        bullet.y > enemy.y and bullet.y < enemy.image.get_height() + enemy.y
    ):
        enemy.reset()
        bullet.active = False
        return True
    return False

def checkcrash(plane,enemy): #飞机与敌机相撞
    if (plane.x + 0.7*plane.image.get_width() > enemy.x ) and (
        plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and (
        plane.y + 0.7*plane.image.get_height() > enemy.y ) and (
        plane.y < 0.3*plane.image.get_height() + enemy.y + enemy.image.get_height()
    ):
        return True
    return False
#以上代码都基本没有变化
pygame.init()
screen = pygame .display.set_mode((450, 800), 0, 32)   #创建了一个窗口,其大小与背景图片相同
pygame.display .set_caption("Hello world")
background = pygame.image.load ('back.png').convert()  #载入背景图片
plane = Plane()
bullets = []        #创建子弹list
for i in range(5):
    bullets.append(Bullet())
count_b = len(bullets)
index_b = 0
interval_b = 0
enemies = []         #创建敌机list
for i in range(4):
    enemies.append(Enemy())
gameover = False
n = 0   #记录游戏次数
flag = True    #判断游戏是否结束的标志
score = 0
font = pygame.font.Font(None, 32)
while True :   
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        #判断在gameover状态下点击了鼠标
        if n < 5:  #最多只有5次复活机会
            if gameover and event.type == pygame.MOUSEBUTTONUP:
                plane.reset()
                for e in enemies:
                    e.reset()
                for b in bullets:
                    b.active = False
                gameover = False
        else:
            flag = False
            text = font.render('GAME OVER !!!', 1, (0,0,0))
            screen.blit(text,(190,400))
            break
    if not flag:  #判断是否结束游戏,输出GAME OVER
        text = font.render('GAME OVER !!!', 1, (0,0,0))
        screen.blit(text,(190,400))
        continue
                  
    screen.blit(background, (0,0))    #画出背景图
    if not gameover and n < 5:
        interval_b -= 1
        if interval_b < 0:
            bullets[index_b].reset()
            interval_b = 200
            index_b = (index_b + 1) % count_b
        for b in bullets:
            if b.active:
                for e in enemies:
                    if checkhit(b,e):
                        score += 100
                b.move()
                screen.blit(b.image, (b.x, b.y)) #画出子弹        
        for e in enemies:
            if checkcrash(plane,e):
                n += 1
                gameover = True
            e.move()
            screen.blit(e.image, (e.x,e.y))
        plane.move()
        screen.blit(plane.image,(plane.x,plane.y))    #画出飞机 先画子弹再画飞机,使得看起来子弹像是从飞机里出来的
        text = font.render('Score:%d' % score, 1, (0,0,0))
        screen.blit(text,(0,0))
        text1 = font.render('%d chances' % (5-n),1, (0,0,0))
        screen.blit(text1,(300,0))
    else:
        text = font.render('Score:%d' % score, 1, (0,0,0))
        screen.blit(text,(190,400))
    pygame.display.update()
        
  



作者: crossin先生    时间: 2015-10-3 22:38
dreamlxt17 发表于 2015-10-3 22:17
下面是我改编了一点点的打飞机游戏,本意是:每次游戏只有5次机会(n enemy.x and bullet.x < enemy.image. ...

for event in pygame.event.get()

这里面的代码只有在有事件响应的时候才会执行到,为什么要把判断游戏结束状态的代码放在这里面
作者: daiqifan012    时间: 2015-10-21 10:58
先生能不能再出一节说说怎么将.py打包成windows平台下能用的.exe呢 ?  我按网上百度的方法老是不成功
作者: crossin先生    时间: 2015-10-21 20:04
daiqifan012 发表于 2015-10-21 10:58
先生能不能再出一节说说怎么将.py打包成windows平台下能用的.exe呢 ?  我按网上百度的方法老是不成功 ...

http://tieba.baidu.com/p/2409491530?pid=35352333161
贴吧上有发过一篇,你试试看可不可以
作者: cyueclone    时间: 2015-11-11 16:49
本帖最后由 cyueclone 于 2015-11-11 16:52 编辑

我用cx_freeze照你说的方法将下载的你的12.py转exe,dict目录正常生成了。但是点击plane.exe后闪退,于是我将几个图片文件复制到了dict目录中。不闪退了,显示:
Fatal Python errorpygame parachute) segmentation Fault
Traceback (most recent call last):
  File "D:\python33\Lib\site-packages\pygame\pkgdata.py",line67,in getResource
      return open(os.path.normpath(path),'rb')
FileNotFoundError:[Errno 2] No such file or directory:"D:\\pys\dist\\plane.exe\\pygame\\freesansbold.ttf'
我想建一个plane.exe文件夹把ttf文件复制进去,但是已经有个plane.exe文件了,无法建plane.exe文件夹。
问题在哪里呢?
(Python3.3,下载的cx_Freeze等文件都是对应3.3版本的。)
作者: crossin先生    时间: 2015-11-12 13:07
cyueclone 发表于 2015-11-11 16:49
我用cx_freeze照你说的方法将下载的你的12.py转exe,dict目录正常生成了。但是点击plane.exe后闪退,于是我 ...

不太清楚,这个如果是需要字体的话,可能是打包之前加到文件夹里,然后一起打包生成,不是你自己建的
作者: deardamon    时间: 2016-9-3 16:47
请教一个问题,我用pyinstaller将这个打飞机的游戏打包成exe,总是出现以下报错:
c:\Users\Damon\Desktop>G_plane.exe
Traceback (most recent call last):
  File "G_plane.py", line 81, in <module>
pygame.error: Couldn't open back.jpg
Failed to execute script G_plane

c:\Users\Damon\Desktop>G_plane-V2.exe
Traceback (most recent call last):
  File "G_plane.py", line 81, in <module>
pygame.error: Couldn't open c:\hello\current\back.jpg
Failed to execute script G_plane

c:\Users\Damon\Desktop>G_plane.exe
Traceback (most recent call last):
  File "G_plane.py", line 81, in <module>
pygame.error: Couldn't open c:/hello/current/back.jpg
Failed to execute script G_plane

上面尝试了三种路径方式,最后运行exe还是不行,但是这个代码再pycharm里面直接运行是没有问题的,在stack overflow上查到的,基本都说要么是路径之类的问题,测试了也不行。不知道是不是因为Python3.5的问题,Py3.5+win10
作者: crossin先生    时间: 2016-9-3 23:55
deardamon 发表于 2016-9-3 16:47
请教一个问题,我用pyinstaller将这个打飞机的游戏打包成exe,总是出现以下报错:
c:%users\Damon\Desktop> ...

肯定要用相对路径。你的 back.jpg 应该要和 exe 放在一个目录下
作者: deardamon    时间: 2016-9-4 00:48
crossin先生 发表于 2016-9-3 23:55
肯定要用相对路径。你的 back.jpg 应该要和 exe 放在一个目录下

您好,您说的相对路径就是直接load('back.jpg')这样么? 我原本back.jpg就放在和py代码的路径下,比如叫文件夹1,这时候在pycharm里面运行没问题,打包exe的文件夹为文件夹2,那我还需要把back.jpg放到文件夹2才行么?
作者: crossin先生    时间: 2016-9-4 11:41
deardamon 发表于 2016-9-4 00:48
您好,您说的相对路径就是直接load('back.jpg')这样么? 我原本back.jpg就放在和py代码的路径下,比如叫 ...

对,要放进去。因为程序还是在当前路径下寻找
作者: Trailblazer    时间: 2017-1-7 00:13
我好像什么都没问题了,但是运行程序后,发现会闪退。后来我用CMD去运行,发现会显示this application has requested the runtime to terminate it in an unusual way.
please contact the aplication's support team for more information.”
然后我运行原先的Python文件,不从idle里面运行,直接运行.py的文件,也会闪退。。
作者: crossin先生    时间: 2017-1-7 11:46
Trailblazer 发表于 2017-1-7 00:13
我好像什么都没问题了,但是运行程序后,发现会闪退。后来我用CMD去运行,发现会显示“this application ha ...

直接运行python闪退是会有报错的,你看看是什么
作者: Trailblazer    时间: 2017-1-7 15:03
本帖最后由 Trailblazer 于 2017-1-7 18:12 编辑
crossin先生 发表于 2017-1-7 11:46
直接运行python闪退是会有报错的,你看看是什么

嗯,有报错,但是报错的窗口自己会关闭,我尝试截了一张图片,发现很奇怪啊。因为如果我用IDLE运行程序的话,是完全没有问题的。
然后我发现好像是里面所有打开文件的语句都会报错?

图片2.png (40.6 KB, 下载次数: 273)

图片2.png

图片3.png (90.79 KB, 下载次数: 258)

图片3.png


作者: crossin先生    时间: 2017-1-8 17:44
Trailblazer 发表于 2017-1-7 15:03
嗯,有报错,但是报错的窗口自己会关闭,我尝试截了一张图片,发现很奇怪啊。因为如果我用IDLE运行程序的 ...

资源路径不对啊
你看它报错是说 图片找不到、score.txt找不到
你的资源没和运行的代码放一起
作者: Trailblazer    时间: 2017-1-8 19:24
本帖最后由 Trailblazer 于 2017-1-8 19:26 编辑
crossin先生 发表于 2017-1-8 17:44
资源路径不对啊
你看它报错是说 图片找不到、score.txt找不到
你的资源没和运行的代码放一起 ...

我都放在一个文件夹了,它虽然报错,但是我用IDLE就可以运行。。
我感觉好像是我的Python出了点问题。。。因为我用CMD是可以运行的
不过打包成exe就又运行不了了
作者: crossin先生    时间: 2017-1-8 19:31
Trailblazer 发表于 2017-1-8 19:24
我都放在一个文件夹了,它虽然报错,但是我用IDLE就可以运行。。
我感觉好像是我的Python出了点问题。。。 ...

跟exe也是一个目录下吗?
那你再看看你用的打包软件里面对于路径有没有特殊设置。
楼上有跟你一样的问题

作者: Trailblazer    时间: 2017-1-9 12:29
crossin先生 发表于 2017-1-8 19:31
跟exe也是一个目录下吗?
那你再看看你用的打包软件里面对于路径有没有特殊设置。
楼上有跟你一样的问题

和exe也是一个目录的,我以前打包别的程序都没有问题
作者: crossin先生    时间: 2017-1-10 23:33
Trailblazer 发表于 2017-1-9 12:29
和exe也是一个目录的,我以前打包别的程序都没有问题

我看你截图上运行exe的地址是 c:\windows\py.exe ,但代码和资源地址不是这个。
相对路径是根据你运行的位置来的。
作者: Trailblazer    时间: 2017-1-11 07:44
crossin先生 发表于 2017-1-10 23:33
我看你截图上运行exe的地址是 c:\windows\py.exe ,但代码和资源地址不是这个。
相对路径是根据你运行的 ...

呃嗯...我发现用错东西运行了,现在用PYTHON运行没有问题了,但是打包的exe运行还是有问题
作者: crossin先生    时间: 2017-1-11 23:13
Trailblazer 发表于 2017-1-11 07:44
呃嗯...我发现用错东西运行了,现在用PYTHON运行没有问题了,但是打包的exe运行还是有问题 ...

昨天有人说,py2exe 打包时候有不同模式,其中有的就不能使用外部变量,你看看。

还有就是,先试试最简单的代码能不能打包成功。如果可以的话,加上部分代码再试。直到找到会引起出错的代码。
作者: Trailblazer    时间: 2017-1-12 10:55
本帖最后由 Trailblazer 于 2017-1-12 11:10 编辑
crossin先生 发表于 2017-1-11 23:13
昨天有人说,py2exe 打包时候有不同模式,其中有的就不能使用外部变量,你看看。

还有就是,先试试最简 ...

我用的是cxfreeze打包的,然后我检查了一下,发现只要有了font的代码的好像exe都不能运行...
然后我把之前打包后不能运行的exe中的font代码删掉,就可以运行了...
但是,这样子不就没有文字了吗...
作者: crossin先生    时间: 2017-1-12 17:49
Trailblazer 发表于 2017-1-12 10:55
我用的是cxfreeze打包的,然后我检查了一下,发现只要有了font的代码的好像exe都不能运行...
然后我把之前 ...

网上搜搜看,应该有解决方法。

http://stackoverflow.com/questio ... game-with-cx-freeze
这个看看行不行

把font的 None 改成某个字体,比如 Arial

作者: Trailblazer    时间: 2017-1-19 11:43
crossin先生 发表于 2017-1-12 17:49
网上搜搜看,应该有解决方法。

http://stackoverflow.com/questions/15735868/making-an-exe-for-pygame ...

谢谢老师,我把字体改成Arial之后就可以了
作者: Kunz    时间: 2017-4-1 21:35
匠逍之岿 发表于 2013-9-7 11:40
我在程序里加了两段代码想记录和显示一下最高分,为什么有的时候能记录最高分  有时候不是最高分也记录呢? ...

你的第一段代码放在什么位置?我放在主程序运行的那个大循环里运行正常。
作者: ZHAOQB    时间: 2017-5-15 15:59
本帖最后由 ZHAOQB 于 2017-5-15 16:00 编辑

D:\Users\drowsy\Desktop\QQ截图20170515155733.png
老师,这个问题怎么解决?黑色框一闪而过,然后出现这个,最后未响应结束。求指教

QQ截图20170515145203.png (81.43 KB, 下载次数: 260)

QQ截图20170515145203.png


作者: crossin先生    时间: 2017-5-15 22:48
ZHAOQB 发表于 2017-5-15 15:59
老师,这个问题怎么解决?黑色框一闪而过,然后出现这个,最后未响应结束。求指教 ...

看上去是你打包成exe,但是资源的路径不对,或者程序没找到对应的图片
作者: ZHAOQB    时间: 2017-5-22 14:57
本帖最后由 ZHAOQB 于 2017-5-22 14:58 编辑

老师请教个问题: 999.jpg 若在else:text=font.render(...) 的下一行加入将分数存储到txt文件中的功能,发现整个循环还在进行。
就是说打了一次飞机游戏,然后我方飞机撞到敌方飞机后,进入显示分数的页面,看似停止了,但是整个循环导致本次Score一直不停的往txt文本中写,请问有什么方法解决?还是哪儿出错了?
666.png

作者: crossin先生    时间: 2017-5-22 21:24
ZHAOQB 发表于 2017-5-22 14:57
老师请教个问题:若在else:text=font.render(...) 的下一行加入将分数存储到txt文件中的功能,发现整个循 ...

这里是程序的刷新循环。你要加游戏记录,应该加在gameover 状态变化的地方,而不是显示刷新循环里
作者: ZHAOQB    时间: 2017-5-23 14:16
crossin先生 发表于 2017-5-22 21:24
这里是程序的刷新循环。你要加游戏记录,应该加在gameover 状态变化的地方,而不是显示刷新循环里 ...

是滴,我改过了,可以了。谢谢老师
作者: huang6    时间: 2017-8-9 23:05
为什么我的font显示不了呢,只有gameover了之后才能显示?
而且也不是马上显示,要过一会才能显示

2.png (678.63 KB, 下载次数: 248)

2.png


作者: crossin先生    时间: 2017-8-10 11:53
huang6 发表于 2017-8-9 23:05
为什么我的font显示不了呢,只有gameover了之后才能显示?
而且也不是马上显示,要过一会才能显示
...

看不太全你的代码。
似乎是 update 的问题,应该在每次最后再调用 update,不然你后面的 blit 都没有被刷新到屏幕上
作者: huang6    时间: 2017-8-10 23:00
crossin先生 发表于 2017-8-10 11:53
看不太全你的代码。
似乎是 update 的问题,应该在每次最后再调用 update,不然你后面的 blit 都没有被刷 ...

额 我把update忘记掉了
作者: atharsx    时间: 2017-9-20 00:29
你好,Crossin老师,我想问下,这个最后gameover后显示的字体怎么能保证它一直居中对齐啊,就是不论最后分数多少显示的文字就是在正中央的?
作者: crossin先生    时间: 2017-9-20 09:58
atharsx 发表于 2017-9-20 00:29
你好,Crossin老师,我想问下,这个最后gameover后显示的字体怎么能保证它一直居中对齐啊,就是不论最后分 ...

看这个 https://stackoverflow.com/questi ... game-centering-text

你可以用 get_rect 算出文字的宽度,然后计算位置
作者: atharsx    时间: 2017-9-20 21:14
crossin先生 发表于 2017-9-20 09:58
看这个 https://stackoverflow.com/questions/23982907/python-library-pygame-centering-text

你可以用 ...

谢谢,搞定了。
作者: xiejiali    时间: 2018-1-14 06:35
老师,我想打包成exe,可是安装cxfreeze时总是这样:
  1. D:\Python Software\Scripts>cxfreeze -h
  2. 'D:\Python' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
复制代码

作者: crossin先生    时间: 2018-1-14 17:08
xiejiali 发表于 2018-1-14 06:35
老师,我想打包成exe,可是安装cxfreeze时总是这样:

D:\Python Software\Scripts>
这是自带的提示,命令本身只有后半部分 cxfreeze -h
作者: python_dino    时间: 2018-1-31 10:17
请问怎么可以输入玩家名字呢?
作者: crossin先生    时间: 2018-1-31 14:16
python_dino 发表于 2018-1-31 10:17
请问怎么可以输入玩家名字呢?

默认pygame没有输入框,可以看看这个 https://segmentfault.com/q/1010000010495777
作者: python_dino    时间: 2018-1-31 15:06
crossin先生 发表于 2018-1-31 14:16
默认pygame没有输入框,可以看看这个 https://segmentfault.com/q/1010000010495777

请问先生pygame3.6调用不了movie模块,按理说开头import pygame,那movie模块应该可以用了吧
作者: crossin先生    时间: 2018-2-2 18:44
python_dino 发表于 2018-1-31 15:06
请问先生pygame3.6调用不了movie模块,按理说开头import pygame,那movie模块应该可以用了吧 ...

以前版本是,新版本我也没用过
作者: 不是啤酒肚    时间: 2018-2-3 21:13
老师你好 ,我打包成exe的时候遇到了问题。就是将打飞机游戏完整版打包成exe的时候运行总提示停止工作。然而我将打飞机游戏简化成就显示个背景图片在打包可以运行并且显示背景。我找不到原因
作者: crossin先生    时间: 2018-2-3 23:32
不是啤酒肚 发表于 2018-2-3 21:13
老师你好 ,我打包成exe的时候遇到了问题。就是将打飞机游戏完整版打包成exe的时候运行总提示停止工作。然 ...

在命令行运行你的exe看报错,或者你逐步添加代码,看哪里报错。
有可能是字体的问题
作者: 不是啤酒肚    时间: 2018-2-4 11:01
crossin先生 发表于 2018-2-3 23:32
在命令行运行你的exe看报错,或者你逐步添加代码,看哪里报错。
有可能是字体的问题 ...

解决了,是字体问题




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5