python外星人入侵不顯示子彈_【Python】python外星人入侵,武裝飛船,代碼寫好后,不顯示子彈...

按照書上寫的武裝飛船,寫到能夠左右移動了,但到了射擊(裝子彈)時候,按照書上的代碼照搬了,運行時沒顯示代碼有問題,但就是按了空格鍵,不見有子彈,其他都正常。

代碼:

alien_invasion.py

import sys

import pygame

from pygame.sprite import Group

from settings import Settings

from ship import Ship

import game_functions as gf

def run_game():

#初始化pygame、設置和屏幕對象

pygame.init()

ai_settings = Settings()

screen = pygame.display.set_mode(

(ai_settings.screen_width,ai_settings.screen_height))

pygame.display.set_caption("Alien Invasion")

#創建一艘飛船

ship = Ship(ai_settings,screen)

#創建一個用于存儲子彈的編組

bullets = Group()

#開始游戲主循環

while True:

gf.check_events(ai_settings,screen,ship,bullets)

ship.update()

bullets.update()

gf.update_screen(ai_settings,screen,ship,bullets)

run_game()

**game_functions.py**

import sys

import pygame

from bullet import Bullet

def check_keydown_events(event,ai_settings,screen,ship,bullets):

"""響應按鍵"""

if event.key == pygame.K_RIGHT:

ship.moving_right = True

elif event.key == pygame.K_LEFT:

ship.moving_left = True

elif event.key == pygame.K_SPACE:

#創建一顆子彈,并將其加入到編組bullets中

new_bullet = Bullet(ai_settings,screen,ship)

bullets.add(new_bullet)

def check_keyup_events(event,ship):

"""響應松開"""

if event.key == pygame.K_RIGHT:

ship.moving_right = False

elif event.key == pygame.K_LEFT:

ship.moving_left = False

def check_events(ai_settings,screen,ship,bullets):

"""響應按鍵和鼠標事件"""

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

elif event.type == pygame.KEYDOWN:

check_keydown_events(event,ai_settings,screen,ship,bullets)

elif event.type == pygame.KEYUP:

check_keyup_events(event,ship)

def update_screen(ai_settings,screen,ship,bullets):

"""更新屏幕上的圖像,并切換到新屏幕"""

#每次循環時都重繪屏幕

screen.fill(ai_settings.bg_color)

ship.blitme()

#讓最近繪制的屏幕可見

pygame.display.flip()

#在飛船和外星人后面重繪所有子彈

for bullet in bullets.sprites():

bullet.draw_bullet()

**bullet.py**

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):

"""一個對飛船發射的子彈進行管理的類"""

def __init__(self,ai_settings,screen,ship):

"""在飛船所處的位置創建一個子彈對象"""

super(Bullet,self). __init__()

self.screen = screen

#在(0,0)處創建一個表示子彈的舉行,再設置正確的位置

self.rect = pygame.Rect(0,0,ai_settings.bullet_width,

ai_settings.bullet_height)

self.rect.centerx = ship.rect.centerx

self.rect.top = ship.rect.top

#存儲用小數表示的子彈位置

self.y = float(self.rect.y)

self.color = ai_settings.bullet_color

self.speed_factor = ai_settings.bullet_speed_factor

def update(self):

"""向上移動子彈"""

#更新表示子彈位置的小數值

self.y -= self.speed_factor

#更新表示子彈的rect的位置

self.rect.y = self.y

def draw_bullet(self):

"""在屏幕上繪制子彈"""

pygame.draw.rect(self.screen,self.color,self.rect)

settings.py

class Settings():

"""存儲《外星人入侵》的所有設置的類"""

def __init__(self):

"""初始化游戲的設置"""

#屏幕設置

self.screen_width = 1200

self.screen_height = 800

self.bg_color = (230,230,230)

#飛船的設置

self.ship_speed_factor = 1.5

#子彈設置

self.bullet_speed_factor = 1

self.bullet_width = 3

self.bullet_height = 15

self.bullet_color = 60,60,60

ship.py

import pygame

class Ship():

def __init__(self,ai_settings,screen):

"""初始化飛船并設置其初始位置"""

self.screen = screen

self.ai_settings = ai_settings

#加載飛船圖像并獲取其外接矩形

self.image = pygame.image.load('images/ship.bmp')

self.rect = self.image.get_rect()

self.screen_rect = screen.get_rect()

#將每艘新飛船放在屏幕底部中央

self.rect.centerx = self.screen_rect.centerx

self.rect.bottom = self.screen_rect.bottom

#在飛船的屬性center中存儲小數值

self.center = float(self.rect.centerx)

#移動標志

self.moving_right = False

self.moving_left = False

def update(self):

"""根據移動標志調整飛船的位置"""

#更新飛船的center值,而不是rect

if self.moving_right and self.rect.right < self.screen_rect.right:

self.center += self.ai_settings.ship_speed_factor

if self.moving_left and self.rect.left > 0:

self.center -= self.ai_settings.ship_speed_factor

#根據self.center更新rect對象

self.rect.centerx = self.center

def blitme(self):

"""在指定位置繪制飛船"""

self.screen.blit(self.image,self.rect)

回答

game_function.py 中的子彈繪制要在顯示在屏幕之前

如下:

#在飛船和外星人后面重繪所有子彈

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitme()

#讓最近繪制的屏幕可見

pygame.display.flip()

這樣改一下

game_function.py

—-snip—-

def update_screen(ai_settings,screen,ship,bullets):

"""更新屏幕上的圖像,并切換到新屏幕"""

#每次循環時都重繪屏幕

screen.fill(ai_settings.bg_color)

ship.blitme()

#在飛船和外星人后面重繪所有子彈

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitime()

#讓最近繪制的屏幕可見

pygame.display.flip()

我的也是 代碼完全正確,甚至打開了編輯者寫的代碼,還是沒有子彈

不請自來!

你的game_function.py呢?

功能模塊也要添加進相關的設置,主程序才能調用出來,

主程序的

bullets.update()這里應該是會報錯的

還有,函數里面的形參要和書本上的一致

耐心點抄下去,不要著急,

已找到問題原因,你應該是虛擬機中運行的,虛擬機中要按住ctrl+space,就可以有子彈了

請問題主解決問題了嗎,我也遇到了同樣的問題

我也是這個問題,子彈會出來,但是子彈不會動

謝謝大佬,我也是這個問題,照著書敲的,看了好久,看到了你的帖子問題才解決的 。謝謝

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529864.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python常見的異常類有哪些_Python常見異常類型

標簽&#xff1a;常見 nic 警告 werror pytho 無效 本地變量 計算 pointBaseException     所有異常的基類SystemExit             解釋器請求退出KeyboardInterrupt          用戶中斷執行(通常是輸入^C)Exc…

mysql dos 下切換連接_如何在dos下連接進入mysql對數據庫進行操作

一、&#xff1a;windowsR 進入命令命令提示符輸入 net start mysql若出現系統錯誤&#xff0c;要將命令提示符以管理員身份運行若出現不是內部指令&#xff0c;進入下面環境變量設置界面&#xff0c;配置path路徑1.進入系統查看界面&#xff0c;點擊高級系統設置2&#xff0c…

mysql二級緩存redis_SpringBoot+Mybatis+redis(二級緩存)搭建

剛剛開始接觸Spring Boot&#xff0c;因為極簡單的配置開發&#xff0c;搭建一個通用的Spring BootMybaitisredis的開發框架。一、用maven構建項目&#xff0c;pom.xml文件如下&#xff1a;org.springframework.bootspring-boot-starter-parent1.5.1.RELEASEorg.springframewor…

mysql自定義兩個條件排序_使用MySQL中的兩個不同列進行自定義排序?

為此&#xff0c;將ORDER BY子句與CASE語句一起使用。讓我們首先創建一個表-mysql> create table DemoTable1610-> (-> Marks int,-> Name varchar(20)-> ) ;使用插入命令在表中插入一些記錄-mysql> insert into DemoTable1610 values(85,John);mysql> in…

java獲取文件大小_Java中獲取文件大小的詳解及實例代碼

Java 獲取文件大小今天寫代碼時需要實現獲取文件大小的功能&#xff0c;目前有兩種實現方法&#xff0c;一種是使用File的length()方法&#xff1b;另外一種是使用FileInputStream的available()方法&#xff0c;當InputStream未進行read操作時&#xff0c;available()的大小應該…

java訪問權限friendly_Java的訪問權限

一&#xff0e;Java訪問權限飾詞(access specifiers)Java有public、protect、friendly、private四種訪問權限&#xff0c;并且這四訪問權限的訪問范圍越來越小。1&#xff0e; friendly1) 果一個class內的數據成員或方法沒有任何權限飾詞&#xff0c;那么它的缺省訪問權限就是f…

java 0 255_java – 什么(float)(par4 16255)/ 255.0F;意思?

帶alpha通道的RGB(通常稱為RGBA或aRGB)是四個字節打包成一個整數.AAAAAAAARRRRRRRRBBBBBBBBGGGGGGGG // the original par4, each char represents one bit.// where ARBG stands for alpha, red, blue and green bit.shift和運算符用于檢索每個字節.例如,par4>> 16&…

java ie下載文件名亂碼問題_php中強制下載文件的代碼(解決了IE下中文文件名亂碼問題)...

中間遇到一個問題是提交的中文文件名直接放到header里在IE下會變成亂碼&#xff0c;解決方法是將文件名先urlencode一下再放入header&#xff0c;如下。$file_name urlencode($_REQUEST[filename]);header("Pragma: public"); header("Expires: 0");heade…

java如何獲得當前路徑_在java中如何得到當前路徑

歸納一些網上取java路徑的方法&#xff1a;注明&#xff1a;如果從ANT啟動程序&#xff0c;this.getClass().getResource("")取出來的比較怪&#xff0c;直接用JAVA命令行調試就可成功。得到classpath和當前類的絕對路徑的一些方法獲得CLASSPATH之外路徑的方法&#…

java繼承總結_JAVA筆記:Java中的繼承總結

繼承&#xff1a;在Java中使用extends關鍵字來實現類的繼承 &#xff0c;extends意思就是派生&#xff0c;所以子類也叫派生類&#xff0c;繼承的主要目的是擴展類的內容操作格式&#xff1a; class A{}; class B extends A{};子類B可以繼承父類A中的公用方法&#xff0c;也可…

java正則表達式 類_java正則表達式相關類的使用

import java.util.regex.Matcher;import java.util.regex.Pattern;public class TestZhengZe {public static void main(String[] args) {//匹配數字Pattern mac Pattern.compile("-?(0|([1-9][0-9]*))(\\.[0-9])?");System.out.println(mac.matcher("101.00…

Java轉置_Java實現單鏈表的逆轉置

單鏈表逆轉置的遞歸與非遞歸方式package link.reverse;// 定義一個單鏈表class Node {//變量private int record;//指向下一個對象private Node nextNode;public Node(int record) {this.record record;}public int getRecord() {return record;}public void setRecord(int re…

單利 java_Java設計模式-單利模式

單例模式作為對象的創建模式&#xff0c;單例模式確保其某一個類只有一個實例&#xff0c;而且自行實例化并向整個系統提供這個實例&#xff0c;這個類稱為單例類。單例模式有以下特點&#xff1a;1、單例類只能有一個實例2、單例類必須自己創建自己的唯一實例3、單例類必須給其…

esp8266接7735_基于8266的ESPEASY固件接入HASS的教程(可無腦接入各類傳感...

首先國際慣例&#xff0c;先放上成果:QQ圖片20170629160143.png (172.48 KB, 下載次數: 3)2017-6-29 16:03 上傳如上圖所示&#xff0c;樓主把顆粒物傳感器和二氧化碳傳感器加入到了HASS里&#xff0c;當然&#xff0c;論壇之前也有諸位大神提供過類似固件和方法來實現這一目標…

java定義private_java9開始——接口中可以定義private私有方法

在傳統的Java編程中&#xff0c;被廣為人知的一個知識點是&#xff1a;java Interface接口中不能定義private私有方法。只允許我們定義public訪問權限的方法、抽象方法或靜態方法。但是從Java 9 開始&#xff0c;Interface 接口中允許定義私有方法和私有靜態方法。下面我們就來…

java poi生成excel文件_java poi 導出Excel文件

1&#xff0c;導包 poi-3.9-XXX.JAR2, 創建一個實體對象public class Student implements Serializable {/****/private static final long serialVersionUID 1L;private int id;private String name;private int age;private Date borth;public Student(int id, String name…

java中捕獲異常的作用_在Java中捕獲通用異常?

您可以傳遞Class對象并以編程方式檢查。public static void checkForException(String message,Class exceptionType, ExpectedExceptionBlock block) {try {block.exceptionThrowingCode();} catch (Exception ex) {if ( exceptionType.isInstance(ex) ) {return;} else {thro…

java如何循環調用方法_Java:調用方法的“中斷”循環?

我的小程序有點問題。我有一個JOptionPane要求一個數字&#xff0c;如果該數字小于10&#xff0c;則一個循環會一直持續下去&#xff0c;并永遠做下去&#xff0c;繼續詢問數字。 在該循環內&#xff0c;我調用一個方法&#xff0c;將int作為參數。 在該方法中&#xff0c;我需…

隨機投點法計算定積分java_11 隨機模擬積分 | 統計計算

11.4 高維定積分上面的兩種計算一元函數定積分的方法可以很容易地推廣到多元函數定積分&#xff0c;或稱高維定積分。設\(d\)元函數\(h(x_1, x_2, \dots, x_d)\)定義于超矩形\[\begin{aligned}C \{(x_1, x_2, \ldots, x_d): a_i \leq x_i \leq b_i, i1,2,\ldots,d \}\end{alig…

java el ognl_EL和OGNL表達式的區分

OGNL是通常要結合Struts 2的標志一起使用&#xff0c;如 struts頁面中不能單獨使用&#xff0c;el可以單獨使用 ${sessionScope.username}頁面取值區別&#xff1a;名稱servletognl elparametersre…