从另一个文件(mygame)打开main中的pygame文件

时间:2017-08-05 05:29:13

标签: python function module pygame

所以我试图通过导入mygame来打开我的游戏文件,但是它似乎不起作用'这里是代码(我将在代码后解释更多)

import mygame
'''THI IS THE MAIN FILE'''
print("hello")
while True:

    ui = input(">>")
    if 'hello' in ui:
        print("hi!")
    if 'how are you' in ui:
        print("im fine")
    if 'game' in ui:
        mygame() 
        '''open the game'''

这是mygame文件(只是随机复制了一个小的pygame代码,因为我只想了解这是否真的可以实现)

import pygame as p,random
q=p.display
T=16
b=q.set_mode([256]*2).fill
l=[]
d=a=x=1
c=p.event.get
def mygame():
    while not(x&528or x in l):
     l=l[a!=x:]+[x]
     while a&528or a in l:a=random.randrange(512)
     b(0);[b(99,(o%T*T,o/32*T,T,T))for o in l+[a]];q.flip();p.time.wait(99);D=d
     for e in c(2):
      v=e.key-272;n=((v&2)-1)*[1,32][v<3]
      if-n-D and 0<v<5:d=n
     c();x+=d

结论:如果一个触发器(&#39;游戏&#39;)在主输入中,我只想开始游戏,但在这种情况下,当我运行主游戏时,游戏首先打开而没有触发器。 这是pygame的另一种类型,包括pygame.init()(比上一个更容易理解)

import sys, random, time, pygame
from pygame.locals import *

def gameg():
     pygame.init()
     font1 = pygame.font.Font(None, 24)
     screen = pygame.display.set_mode((600, 500))
     pygame.display.set_caption("Bomb Catching Game")
     pygame.mouse.set_visible(False)
     game_over = True
     lives = 3
     score = 0
     game_over = True
     mouse_x = mouse_y = 0
     lead_x = 0
     pos_x = 300
     pos_y = 460
     bomb_x = random.randint(0, 500)
     bomb_y = -50
     vel_y = 0.3
     white = 255, 255, 255
     red = 220, 50, 50
     yellow = 230, 230, 50
     black = 0, 0, 0
     def print_text(font, x, y, text, color=(255, 255, 255)):
          screen = pygame.display.set_mode((600, 500))
          imgText = font.render(text, True, color)
          screen.blit(imgText, (x, y))
     while True:
          for event in pygame.event.get():
               if event.type == QUIT:
                    sys.exit()
               elif event.type == MOUSEMOTION:
                    mouse_x, mouse_y = event.pos
                    move_x, move_y = event.rel
               elif event.type == MOUSEBUTTONUP:
                    if game_over:
                         game_over = False
                         lives = 3
                         score = 0


          keys = pygame.key.get_pressed()
          if keys[K_ESCAPE]:
               sys.exit()
          if keys[pygame.K_LEFT]:
               lead_x -= 1
          if keys[pygame.K_RIGHT]:
               lead_x += 1


          screen.fill((0, 0, 100))

          if game_over:
               print_text(font1, 100, 200, "<CLICK TO PLAY>")
          else:
               #move the bomb
               bomb_y += vel_y

               #has the player missed the bomb?
               if bomb_y > 500:
                    bomb_x = random.randint(0, 500)
                    bomb_y = -50
                    lives -= 1
                    if lives == 0:
                         game_over = True
               #see if player has caught the bomb
               elif bomb_y > pos_y:
                    if bomb_x > pos_x and bomb_x < pos_x + 120:
                         score += 10
                         bomb_x = random.randint(0, 500)
                         bomb_y = -50

               #draw the bomb
               pygame.draw.circle(screen, black, (bomb_x-4, int(bomb_y)-4), 30, 0)
               pygame.draw.circle(screen, yellow, (bomb_x, int(bomb_y)), 30, 0)

               #set basket position
               pos_x = lead_x
               if pos_x < 0:
                    pos_x = 0
               elif pos_x > 500:
                    pos_x = 500
               #draw the basket
               pygame.draw.rect(screen, black, (pos_x-4, pos_y-4, 120, 40), 0)
               pygame.draw.rect(screen, red, (pos_x, pos_y, 120, 40), 0)

          #print # of lives
          print_text(font1, 0, 0, "LIVES: " + str(lives))

          #print scores
          print_text(font1, 500, 0, "SCORE: " + str(score))

          pygame.display.update()

1 个答案:

答案 0 :(得分:0)

你似乎对这两个python代码都有一些问题。

mygame.py,您正在呼叫q.set_mode([256]*2).fill,这会打开一个新窗口。这是在模块级别,因此它在您调用模块或运行python文件时直接运行。

在您的其他文件中(您想从中运行游戏),以下代码 -

if 'game' in ui:
    mygame() 
    '''open the game'''

实际上是尝试直接调用模块mygame,而不是函数'mygame()inside the module mygame , for that you need to do - mygame.mygame()`。

对代码进行一些简单的更改,以使其正常工作 -

mygame.py

import pygame as p,random
def mygame():
    q=p.display
    T=16
    b=q.set_mode([256]*2).fill
    l=[]
    d=a=x=1
    c=p.event.get
    while not(x&528 or x in l):
        l=l[a!=x:]+[x]
        while a&528 or a in l:
            a=random.randrange(512)
        b(0)
        [b(99,(o%T*T,o/32*T,T,T)) for o in l+[a]]
        q.flip()
        p.time.wait(99)
        D=d
        for e in c(2):
            v=e.key-272
            n=((v&2)-1)*[1,32][v<3]
            if-n-D and 0<v<5:
                d=n
        c()
        x+=d
    q.quit() #Quit the display at the end of the game.

我对代码做了一些更改 -

  1. 将函数外部的所有行添加到mygame()函数内。
  2. 添加了关闭显示的代码 - q.quit() - 游戏结束后。
  3. 将代码重构为使其看起来更好。
  4. 主要的python代码 -

    import mygame
    '''THI IS THE MAIN FILE'''
    print("hello")
    while True:
    
        ui = input(">>")
        if 'hello' in ui:
            print("hi!")
        elif 'how are you' in ui:
            print("im fine")
        elif 'game' in ui:
            '''open the game'''
            mygame.mygame()
        elif 'exit' in ui:
            break
    

    这里几乎没有变化 -

    1. 将该功能称为 - mygame.mygame() - 而不是mygame()
    2. 添加了elif块,以优雅地退出游戏。否则退出块的唯一方法是Ctrl+C
    3. 修改

      在OP添加的最新代码示例中,问题出在print_text()方法中,由于行screen = pygame.display.set_mode((600, 500)),屏幕不断重置。

      我们不需要删除该行就可以解决问题。