设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 15057|回复: 4
打印 上一主题 下一主题

打飞机游戏

[复制链接]

1

主题

0

好友

21

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2018-3-20 23:29:53 |只看该作者 |倒序浏览
我的代码和第十一课的代码差不多,参数也一样,为什么我的子弹射速很慢,而且鼠标不动的话整个画面就好像定格了,而且我的代码运行起来好像很卡顿的样子,但运行课程提供的则不会
回复

使用道具 举报

1

主题

0

好友

21

积分

新手上路

Rank: 1

沙发
发表于 2018-3-20 23:30:55 |只看该作者
# -*- coding: utf-8 -*-
import pygame   
import random
from sys import exit

class Plane:
    def restart(self):
        self.x = 200
        self.y = 600

    def __init__(self):
        self.restart()
        self.image = pygame.image.load("plane.jpg").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

class Bullet:
    def __init__(self):
        self.x = 0
        self.y = -1
        self.image = pygame.image.load("bullet.jpg").convert_alpha()
        self.active = False

    def move(self):
        if self.active:
            self.y -= 0.8
        if self.y < 0:
            self.active = False

    def restart(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 restart(self):
        self.x = random.randint(50,400)
        self.y = random.randint(-200,-50)
        self.speed = random.random() + 0.1
        
    def __init__(self):
        self.restart()
        self.image = pygame.image.load("enemy.jpg").convert_alpha()

    def move(self):
        if self.y < 800:
            self.y += self.speed
        else:
            self.restart()

def checkCrash(enemy, plane):
    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_width() < enemy.y + enemy.image.get_height()
    ):
        return True
    return False

def checkHit(enemy, bullet):
    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()
    ):
        enemy.restart()
        bullet.active = False

pygame.init()  
screen = pygame.display.set_mode((450,800),0,32)
pygame.display.set_caption("Fired Of Plane")
background = pygame.image.load('back.jpg').convert()
plane = Plane()


bullets = []
for i in range(5):
    bullets.append(Bullet())
count_b = len(bullets)
index_b = 0
interval_b = 0

enemies = []
for i in range(5):
    enemies.append(Enemy())

gameover = False
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        screen.blit(background,(0,0))
        if not gameover:   
            interval_b -= 1
            if interval_b < 0:
                bullets[index_b].restart()
                interval_b = 200
                index_b = (index_b + 1) % count_b
            for b in bullets:
                if b.active:
                    for e in enemies:
                        checkHit(e, b)
                    b.move()
                    screen.blit(b.image, (b.x, b.y))
            for e in enemies:
                if checkCrash(e,plane):
                    gameover = True
                e.move()
                screen.blit(e.image, (e.x, e.y))
            plane.move()
            screen.blit(plane.image,(plane.x,plane.y))
        else:
            pass
        pygame.display.update()


        
        
        
            
回复

使用道具 举报

1

主题

0

好友

21

积分

新手上路

Rank: 1

板凳
发表于 2018-3-20 23:39:42 |只看该作者
上面是我的代码
回复

使用道具 举报

1

主题

0

好友

21

积分

新手上路

Rank: 1

地板
发表于 2018-3-20 23:40:00 |只看该作者
# -*- coding: utf-8 -*-
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 -= 0.8
        if self.y < 0:
            self.active = False

    def restart(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 restart(self):
        self.x = random.randint(50, 400)
        self.y = random.randint(-200, -50)
        self.speed = random.random() + 0.1
        
    def __init__(self):
        self.restart()
        self.image = pygame.image.load('enemy.png').convert_alpha()

    def move(self):
        if self.y < 800:
            self.y += self.speed
        else:
            self.restart()

class Plane:
    def restart(self):
        self.x = 200
        self.y = 600
        
    def __init__(self):
        self.restart()
        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(enemy, bullet):
    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()
    ):
        enemy.restart()
        bullet.active = False

#检测敌机与本地是否相撞
def checkCrash(enemy, plane):
    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_width() < 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.jpg').convert()
#创建Plane对象
plane = Plane()
bullets = []
for i in range(5):
    bullets.append(Bullet())
count_b = len(bullets)
index_b = 0
interval_b = 0
enemies = []
for i in range(5):
    enemies.append(Enemy())
#增加记录游戏是否结束的变量
gameover = False
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    screen.blit(background, (0,0))
    #当gameover为False的时候,游戏逻辑才正常运行
    if not gameover:
        interval_b -= 1
        if interval_b < 0:
            bullets[index_b].restart()
            interval_b = 200
            index_b = (index_b + 1) % count_b
        for b in bullets:
            if b.active:
                for e in enemies:
                    checkHit(e, b)
                b.move()
                screen.blit(b.image, (b.x, b.y))
        for e in enemies:
            #如果撞上敌机,设gameover为True
            if checkCrash(e, plane):
                gameover = True
            e.move()
            screen.blit(e.image, (e.x, e.y))
        #检测本体的运动
        plane.move()
        screen.blit(plane.image, (plane.x, plane.y))
    else:
        #待处理
        pass
    pygame.display.update()

回复

使用道具 举报

1

主题

0

好友

21

积分

新手上路

Rank: 1

5#
发表于 2018-3-21 00:09:54 |只看该作者
已解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 09:25 , Processed in 0.022194 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部