diff --git a/.idea/PythonShootGame2.iml b/.idea/PythonShootGame2.iml
new file mode 100644
index 0000000..6b8184f
--- /dev/null
+++ b/.idea/PythonShootGame2.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..e206d70
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..1162f43
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..14bc1cf
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml
new file mode 100644
index 0000000..922003b
--- /dev/null
+++ b/.idea/scopes/scope_settings.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..c80f219
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/gameRole.py b/gameRole.py
index 2d04a68..cb0aa93 100644
--- a/gameRole.py
+++ b/gameRole.py
@@ -1,83 +1,104 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Wed Sep 11 16:36:03 2013
-
-@author: Leo
-"""
-
-import pygame
-
-SCREEN_WIDTH = 480
-SCREEN_HEIGHT = 800
-
-TYPE_SMALL = 1
-TYPE_MIDDLE = 2
-TYPE_BIG = 3
-
-# 子弹类
-class Bullet(pygame.sprite.Sprite):
- def __init__(self, bullet_img, init_pos):
- pygame.sprite.Sprite.__init__(self)
- self.image = bullet_img
- self.rect = self.image.get_rect()
- self.rect.midbottom = init_pos
- self.speed = 10
-
- def move(self):
- self.rect.top -= self.speed
-
-# 玩家类
-class Player(pygame.sprite.Sprite):
- def __init__(self, plane_img, player_rect, init_pos):
- pygame.sprite.Sprite.__init__(self)
- self.image = [] # 用来存储玩家对象精灵图片的列表
- for i in range(len(player_rect)):
- self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())
- self.rect = player_rect[0] # 初始化图片所在的矩形
- self.rect.topleft = init_pos # 初始化矩形的左上角坐标
- self.speed = 8 # 初始化玩家速度,这里是一个确定的值
- self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合
- self.img_index = 0 # 玩家精灵图片索引
- self.is_hit = False # 玩家是否被击中
-
- def shoot(self, bullet_img):
- bullet = Bullet(bullet_img, self.rect.midtop)
- self.bullets.add(bullet)
-
- def moveUp(self):
- if self.rect.top <= 0:
- self.rect.top = 0
- else:
- self.rect.top -= self.speed
-
- def moveDown(self):
- if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
- self.rect.top = SCREEN_HEIGHT - self.rect.height
- else:
- self.rect.top += self.speed
-
- def moveLeft(self):
- if self.rect.left <= 0:
- self.rect.left = 0
- else:
- self.rect.left -= self.speed
-
- def moveRight(self):
- if self.rect.left >= SCREEN_WIDTH - self.rect.width:
- self.rect.left = SCREEN_WIDTH - self.rect.width
- else:
- self.rect.left += self.speed
-
-# 敌人类
-class Enemy(pygame.sprite.Sprite):
- def __init__(self, enemy_img, enemy_down_imgs, init_pos):
- pygame.sprite.Sprite.__init__(self)
- self.image = enemy_img
- self.rect = self.image.get_rect()
- self.rect.topleft = init_pos
- self.down_imgs = enemy_down_imgs
- self.speed = 2
- self.down_index = 0
-
- def move(self):
- self.rect.top += self.speed
\ No newline at end of file
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Sep 11 16:36:03 2013
+
+@author: Leo
+"""
+
+import pygame
+import random
+
+SCREEN_WIDTH = 480
+SCREEN_HEIGHT = 800
+
+TYPE_SMALL = 1
+TYPE_MIDDLE = 2
+TYPE_BIG = 3
+
+# 子弹类
+class Bullet(pygame.sprite.Sprite):
+ def __init__(self, bullet_img, init_pos):
+ pygame.sprite.Sprite.__init__(self)
+ self.image = bullet_img
+ self.rect = self.image.get_rect()
+ self.rect.midbottom = init_pos
+ self.speed = 10
+
+ def move(self):
+ self.rect.top -= self.speed
+
+# 玩家类
+class Player(pygame.sprite.Sprite):
+ def __init__(self, plane_img, player_rect, init_pos):
+ pygame.sprite.Sprite.__init__(self)
+ self.image = [] # 用来存储玩家对象精灵图片的列表
+ for i in range(len(player_rect)):
+ self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())
+ self.rect = player_rect[0] # 初始化图片所在的矩形
+ self.rect.topleft = init_pos # 初始化矩形的左上角坐标
+ self.speed = 8 # 初始化玩家速度,这里是一个确定的值
+ self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合
+ self.img_index = 0 # 玩家精灵图片索引
+ self.is_hit = False # 玩家是否被击中
+
+ def shoot(self, bullet_img):
+ bullet = Bullet(bullet_img, self.rect.midtop)
+ self.bullets.add(bullet)
+
+ def moveUp(self):
+ if self.rect.top <= 0:
+ self.rect.top = 0
+ else:
+ self.rect.top -= self.speed
+
+ def moveDown(self):
+ if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
+ self.rect.top = SCREEN_HEIGHT - self.rect.height
+ else:
+ self.rect.top += self.speed
+
+ def moveLeft(self):
+ if self.rect.left <= 0:
+ self.rect.left = 0
+ else:
+ self.rect.left -= self.speed
+
+ def moveRight(self):
+ if self.rect.left >= SCREEN_WIDTH - self.rect.width:
+ self.rect.left = SCREEN_WIDTH - self.rect.width
+ else:
+ self.rect.left += self.speed
+
+# 敌人类
+class Enemy(pygame.sprite.Sprite):
+ def __init__(self, enemy_img, enemy_down_imgs, init_pos):
+ pygame.sprite.Sprite.__init__(self)
+ self.image = enemy_img
+ self.rect = self.image.get_rect()
+ self.rect.topleft = init_pos
+ self.down_imgs = enemy_down_imgs
+ self.speed = 2
+ self.down_index = 0
+
+ def swerve(self):
+ LorR = random.randint(0,1)
+ ratio = .01
+ if self.rect.left >= SCREEN_WIDTH - self.rect.width:
+ if LorR == 0:
+ self.rect.left += self.speed*ratio
+ else:
+ self.rect.left = SCREEN_WIDTH - self.rect.width
+ if self.rect.left <= 0:
+ if LorR == 0:
+ self.rect.left = 0
+ else:
+ self.rect.left -= self.speed*ratio
+ else:
+ if LorR == 0:
+ self.rect.left += self.speed*ratio
+ else:
+ self.rect.left -= self.speed*ratio
+
+ def move(self):
+ self.rect.top += self.speed
+ self.swerve()
\ No newline at end of file
diff --git a/mainGame.py b/mainGame.py
index 17427df..49ed927 100644
--- a/mainGame.py
+++ b/mainGame.py
@@ -1,197 +1,193 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Wed Sep 11 11:05:00 2013
-
-@author: Leo
-"""
-
-import pygame
-from sys import exit
-from pygame.locals import *
-from gameRole import *
-import random
-
-
-# 初始化游戏
-pygame.init()
-screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
-pygame.display.set_caption('飞机大战')
-
-# 载入游戏音乐
-bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav')
-enemy1_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav')
-game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav')
-bullet_sound.set_volume(0.3)
-enemy1_down_sound.set_volume(0.3)
-game_over_sound.set_volume(0.3)
-pygame.mixer.music.load('resources/sound/game_music.wav')
-pygame.mixer.music.play(-1, 0.0)
-pygame.mixer.music.set_volume(0.25)
-
-# 载入背景图
-background = pygame.image.load('resources/image/background.png').convert()
-game_over = pygame.image.load('resources/image/gameover.png')
-
-filename = 'resources/image/shoot.png'
-plane_img = pygame.image.load(filename)
-
-# 设置玩家相关参数
-player_rect = []
-player_rect.append(pygame.Rect(0, 99, 102, 126)) # 玩家精灵图片区域
-player_rect.append(pygame.Rect(165, 360, 102, 126))
-player_rect.append(pygame.Rect(165, 234, 102, 126)) # 玩家爆炸精灵图片区域
-player_rect.append(pygame.Rect(330, 624, 102, 126))
-player_rect.append(pygame.Rect(330, 498, 102, 126))
-player_rect.append(pygame.Rect(432, 624, 102, 126))
-player_pos = [200, 600]
-player = Player(plane_img, player_rect, player_pos)
-
-# 定义子弹对象使用的surface相关参数
-bullet_rect = pygame.Rect(1004, 987, 9, 21)
-bullet_img = plane_img.subsurface(bullet_rect)
-
-# 定义敌机对象使用的surface相关参数
-enemy1_rect = pygame.Rect(534, 612, 57, 43)
-enemy1_img = plane_img.subsurface(enemy1_rect)
-enemy1_down_imgs = []
-enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 347, 57, 43)))
-enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(873, 697, 57, 43)))
-enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 296, 57, 43)))
-enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(930, 697, 57, 43)))
-
-enemies1 = pygame.sprite.Group()
-
-# 存储被击毁的飞机,用来渲染击毁精灵动画
-enemies_down = pygame.sprite.Group()
-
-shoot_frequency = 0
-enemy_frequency = 0
-
-player_down_index = 16
-
-score = 0
-
-clock = pygame.time.Clock()
-
-running = True
-
-while running:
- # 控制游戏最大帧率为60
- clock.tick(60)
-
- # 控制发射子弹频率,并发射子弹
- if not player.is_hit:
- if shoot_frequency % 15 == 0:
- bullet_sound.play()
- player.shoot(bullet_img)
- shoot_frequency += 1
- if shoot_frequency >= 15:
- shoot_frequency = 0
-
- # 生成敌机
- if enemy_frequency % 50 == 0:
- enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0]
- enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos)
- enemies1.add(enemy1)
- enemy_frequency += 1
- if enemy_frequency >= 100:
- enemy_frequency = 0
-
- # 移动子弹,若超出窗口范围则删除
- for bullet in player.bullets:
- bullet.move()
- if bullet.rect.bottom < 0:
- player.bullets.remove(bullet)
-
- # 移动敌机,若超出窗口范围则删除
- for enemy in enemies1:
- enemy.move()
- # 判断玩家是否被击中
- if pygame.sprite.collide_circle(enemy, player):
- enemies_down.add(enemy)
- enemies1.remove(enemy)
- player.is_hit = True
- game_over_sound.play()
- break
- if enemy.rect.top < 0:
- enemies1.remove(enemy)
-
- # 将被击中的敌机对象添加到击毁敌机Group中,用来渲染击毁动画
- enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1)
- for enemy_down in enemies1_down:
- enemies_down.add(enemy_down)
-
- # 绘制背景
- screen.fill(0)
- screen.blit(background, (0, 0))
-
- # 绘制玩家飞机
- if not player.is_hit:
- screen.blit(player.image[player.img_index], player.rect)
- # 更换图片索引使飞机有动画效果
- player.img_index = shoot_frequency / 8
- else:
- player.img_index = player_down_index / 8
- screen.blit(player.image[player.img_index], player.rect)
- player_down_index += 1
- if player_down_index > 47:
- running = False
-
- # 绘制击毁动画
- for enemy_down in enemies_down:
- if enemy_down.down_index == 0:
- enemy1_down_sound.play()
- if enemy_down.down_index > 7:
- enemies_down.remove(enemy_down)
- score += 1000
- continue
- screen.blit(enemy_down.down_imgs[enemy_down.down_index / 2], enemy_down.rect)
- enemy_down.down_index += 1
-
- # 绘制子弹和敌机
- player.bullets.draw(screen)
- enemies1.draw(screen)
-
- # 绘制得分
- score_font = pygame.font.Font(None, 36)
- score_text = score_font.render(str(score), True, (128, 128, 128))
- text_rect = score_text.get_rect()
- text_rect.topleft = [10, 10]
- screen.blit(score_text, text_rect)
-
- # 更新屏幕
- pygame.display.update()
-
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- exit()
-
- # 监听键盘事件
- key_pressed = pygame.key.get_pressed()
- # 若玩家被击中,则无效
- if not player.is_hit:
- if key_pressed[K_w] or key_pressed[K_UP]:
- player.moveUp()
- if key_pressed[K_s] or key_pressed[K_DOWN]:
- player.moveDown()
- if key_pressed[K_a] or key_pressed[K_LEFT]:
- player.moveLeft()
- if key_pressed[K_d] or key_pressed[K_RIGHT]:
- player.moveRight()
-
-
-font = pygame.font.Font(None, 48)
-text = font.render('Score: '+ str(score), True, (255, 0, 0))
-text_rect = text.get_rect()
-text_rect.centerx = screen.get_rect().centerx
-text_rect.centery = screen.get_rect().centery + 24
-screen.blit(game_over, (0, 0))
-screen.blit(text, text_rect)
-
-while 1:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- exit()
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Sep 11 11:05:00 2013
+
+@author: Leo
+"""
+
+import pygame
+from sys import exit
+from pygame.locals import *
+from gameRole import *
+import time
+import random
+
+
+# 初始化游戏
+pygame.init()
+screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
+pygame.display.set_caption('飞机大战')
+
+# 载入游戏音乐
+bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav')
+enemy1_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav')
+game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav')
+bullet_sound.set_volume(0.3)
+enemy1_down_sound.set_volume(0.3)
+game_over_sound.set_volume(0.3)
+pygame.mixer.music.load('resources/sound/game_music.wav')
+pygame.mixer.music.play(-1, 0.0)
+pygame.mixer.music.set_volume(0.25)
+
+# 载入背景图
+background = pygame.image.load('resources/image/background.png').convert()
+game_over = pygame.image.load('resources/image/gameover.png')
+
+filename = 'resources/image/shoot.png'
+plane_img = pygame.image.load(filename)
+
+# 设置玩家相关参数
+player_rect = []
+player_rect.append(pygame.Rect(0, 99, 102, 126)) # 玩家精灵图片区域
+player_rect.append(pygame.Rect(165, 360, 102, 126))
+player_rect.append(pygame.Rect(165, 234, 102, 126)) # 玩家爆炸精灵图片区域
+player_rect.append(pygame.Rect(330, 624, 102, 126))
+player_rect.append(pygame.Rect(330, 498, 102, 126))
+player_rect.append(pygame.Rect(432, 624, 102, 126))
+player_pos = [200, 600]
+player = Player(plane_img, player_rect, player_pos)
+
+# 定义子弹对象使用的surface相关参数
+bullet_rect = pygame.Rect(1004, 987, 9, 21)
+bullet_img = plane_img.subsurface(bullet_rect)
+
+# 定义敌机对象使用的surface相关参数
+enemy1_rect = pygame.Rect(534, 612, 57, 43)
+enemy1_img = plane_img.subsurface(enemy1_rect)
+enemy1_down_imgs = []
+enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 347, 57, 43)))
+enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(873, 697, 57, 43)))
+enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 296, 57, 43)))
+enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(930, 697, 57, 43)))
+
+enemies1 = pygame.sprite.Group()
+
+# 存储被击毁的飞机,用来渲染击毁精灵动画
+enemies_down = pygame.sprite.Group()
+
+shoot_frequency = 0
+enemy_frequency = 0
+
+player_down_index = 16
+
+score = 0
+
+clock = pygame.time.Clock()
+
+running = True
+bullet_cooldown = 0
+while running:
+ # 控制游戏最大帧率为60
+
+ clock.tick(60)
+ # 生成敌机
+ if enemy_frequency % 50 == 0:
+ enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0]
+ enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos)
+ enemies1.add(enemy1)
+ enemy_frequency += 1
+ if enemy_frequency >= 100:
+ enemy_frequency = 0
+
+ # 移动子弹,若超出窗口范围则删除
+ for bullet in player.bullets:
+ bullet.move()
+ if bullet.rect.bottom < 0:
+ player.bullets.remove(bullet)
+
+ # 移动敌机,若超出窗口范围则删除
+ for enemy in enemies1:
+ enemy.move()
+ # 判断玩家是否被击中
+ if pygame.sprite.collide_circle(enemy, player):
+ enemies_down.add(enemy)
+ enemies1.remove(enemy)
+ player.is_hit = True
+ game_over_sound.play()
+ break
+ if enemy.rect.top < 0:
+ enemies1.remove(enemy)
+
+ # 将被击中的敌机对象添加到击毁敌机Group中,用来渲染击毁动画
+ enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1)
+ for enemy_down in enemies1_down:
+ enemies_down.add(enemy_down)
+
+ # 绘制背景
+ screen.fill(0)
+ screen.blit(background, (0, 0))
+
+ # 绘制玩家飞机
+ if not player.is_hit:
+ screen.blit(player.image[player.img_index], player.rect)
+ # 更换图片索引使飞机有动画效果
+ player.img_index = shoot_frequency / 8
+ else:
+ player.img_index = player_down_index / 8
+ screen.blit(player.image[player.img_index], player.rect)
+ player_down_index += 1
+ if player_down_index > 47:
+ running = False
+
+ # 绘制击毁动画
+ for enemy_down in enemies_down:
+ if enemy_down.down_index == 0:
+ enemy1_down_sound.play()
+ if enemy_down.down_index > 7:
+ enemies_down.remove(enemy_down)
+ score += 1000
+ continue
+ screen.blit(enemy_down.down_imgs[enemy_down.down_index / 2], enemy_down.rect)
+ enemy_down.down_index += 1
+
+ # 绘制子弹和敌机
+ player.bullets.draw(screen)
+ enemies1.draw(screen)
+
+ # 绘制得分
+ score_font = pygame.font.Font(None, 36)
+ score_text = score_font.render(str(score), True, (128, 128, 128))
+ text_rect = score_text.get_rect()
+ text_rect.topleft = [10, 10]
+ screen.blit(score_text, text_rect)
+
+ # 更新屏幕
+ pygame.display.update()
+
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ # 监听键盘事件
+ key_pressed = pygame.key.get_pressed()
+ # 若玩家被击中,则无效
+ if not player.is_hit:
+ if key_pressed[K_w] or key_pressed[K_UP]:
+ player.moveUp()
+ if key_pressed[K_s] or key_pressed[K_DOWN]:
+ player.moveDown()
+ if key_pressed[K_a] or key_pressed[K_LEFT]:
+ player.moveLeft()
+ if key_pressed[K_d] or key_pressed[K_RIGHT]:
+ player.moveRight()
+ if key_pressed[K_e] or key_pressed[K_SPACE] and bullet_cooldown <= 0:
+ player.shoot(bullet_img)
+ bullet_cooldown = 30
+
+ bullet_cooldown -= 1
+
+font = pygame.font.Font(None, 48)
+text = font.render('Score: '+ str(score), True, (255, 0, 0))
+text_rect = text.get_rect()
+text_rect.centerx = screen.get_rect().centerx
+text_rect.centery = screen.get_rect().centery + 24
+screen.blit(game_over, (0, 0))
+screen.blit(text, text_rect)
+
+while 1:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
pygame.display.update()
\ No newline at end of file