以前在学校的时候无聊的学了会pygame。看了大概一周的教学视频,做出来个坦克大战的小游戏

Python3.5  pycharm

import pygame,sys,time
from random import randint
from pygame.locals import *
class TankMain():
#开始游戏
width=600
height=500
my_tank_missile_list = []
my_tank = None
wall=None
# 创建一个我方坦克
#enemy_list = []
enemy_list=pygame.sprite.Group() #敌方坦克的族群
explode_list =[]
#敌方坦克的炮弹
enemy_missile_list=pygame.sprite.Group() def startGame(self):
pygame.init()#pygame
#创建一个屏幕,屏幕的大小,宽和高,0为固定大小(0,RESIZEBLE,FULLSCREEN
screem=pygame.display.set_mode((TankMain.width,TankMain.height),0,32)
pygame.display.set_caption("坦克大战") TankMain.wall=Wall(screem,60,75,30,120)#创建一个墙 TankMain.my_tank = My_Tank(screem)
if len(TankMain.enemy_list)==0:
for i in range(1,6): #敌方坦克随机数
TankMain.enemy_list.add(Enemy_Tank(screem))#把敌方坦克放到组里
while True:
if len(TankMain.enemy_list)<5:
TankMain.enemy_list.add(Enemy_Tank(screem)) # 把敌方坦克放到组里 #color RGB(0,100,200)
#设置屏幕背景色为黑色
screem.fill((0,0,0))
TankMain.wall.display()
TankMain.wall.hit_other()#碰撞检测并且显示墙
# 显示左上角的文字
for i,text in enumerate (self.write_text(),0):
screem.blit(text,(0,5+(13*i)))#纵x横y
self.get_event(TankMain.my_tank,screem)#获取事件,根据获取的事件处理
if TankMain.my_tank:
TankMain.my_tank.hit_enemy_missile()
#判断我方坦克跟炮弹是否碰撞
if TankMain.my_tank and TankMain.my_tank.live:
TankMain.my_tank.display() #我方坦克显示和移动
TankMain.my_tank.move()
else:
TankMain.my_tank=None
#TankMain.my_tank=None 两种删除坦克的方法
#显示重置
for enemy in TankMain.enemy_list:
enemy.display() #敌方坦克显示和随机移动
enemy.random_move()
enemy.random_fire() #显示所有的我方炮弹
for m in TankMain.my_tank_missile_list:
if m.live:
m.display()
m.hit_tank()#炮弹打中敌方坦克
m.move()
else:
TankMain.my_tank_missile_list.remove(m)
for m in TankMain.enemy_missile_list:
if m.live:
m.display()
m.move()
else:
TankMain.enemy_missile_list.remove(m) for explode in TankMain.explode_list:#显示爆炸效果
explode.display() time.sleep(0.05)#可以调坦克的速度,越小,速度越快
pygame.display.update()
#获取所有的事件(敲击键盘,鼠标点击 都属于事件)
def get_event(self,my_tank,screem):
for event in pygame.event.get():
if event.type==QUIT: #程序退出
self.stopGame()
if event.type==KEYDOWN and (not my_tank)and event.key==K_n:
TankMain.my_tank=My_Tank(screem)
if event.type==KEYDOWN and my_tank:
if event.key==K_LEFT:
my_tank.direction="L" #左移
my_tank.stop=False
#my_tank.move()
if event.key==K_RIGHT:
my_tank.direction="R" #右边移动
my_tank.stop = False
#my_tank.move()
if event.key==K_UP:
my_tank.direction="U" #上移
my_tank.stop = False
#my_tank.move()
if event.key==K_DOWN:
my_tank.direction="D" #下移
my_tank.stop = False
#my_tank.move()
if event.key==K_ESCAPE: #esc退出
self.stopGame()
if event.key==K_SPACE: #发射炮弹
m=my_tank.fire()
m.good=True #我方坦克发射的炮弹
TankMain.my_tank_missile_list.append(m)
if event.type==KEYUP and my_tank:
if event.key==K_LEFT or event.key==K_RIGHT or event.key==K_DOWN or event.key==K_UP:
my_tank.stop=True #停止游戏
def stopGame(self):
sys.exit()
# 在屏幕左上角显示文字
def write_text(self):
font=pygame.font.SysFont("simsunnsimsun",15) #定义一个字体
text_sf1=font.render("enemy tank:%d"%len(TankMain.enemy_list),True,(255,0,0)) #根据字体创建一个文件的图像
text_sf2=font.render("my tank missile:%d" % len(TankMain.my_tank_missile_list), True, (255, 0, 0))
return text_sf1,text_sf2 #坦克大战中所有对象的父类
class BaseItem(pygame.sprite.Sprite):
def __init__(self,screem):
pygame.sprite.Sprite.__init__(self)
self.screem=screem #所有类共享的属性 # 吧坦克对应的图片显示在游戏窗口上
def display(self):
if self.live:
self.image = self.images[self.direction]
self.screem.blit(self.image, self.rect) class Tank(BaseItem):
#定义类属性
width=35
height=35
def __init__(self,screem,left,top):
super(Tank, self).__init__(screem)
#self.screem=screem#坦克在移动过程中需要用到屏幕
self.direction="D" #坦克的方向,默认向下
self.speed=5 #坦克移动速度
self.stop=False
self.images={} #坦克的所有图片,key 方向 value 图片(suface)
self.images["L"]=pygame.image.load("images/tankL.gif")
self.images["R"]=pygame.image.load("images/tankR.gif")
self.images["U"]=pygame.image.load("images/tankU.gif")
self.images["D"]=pygame.image.load("images/tankD.gif")
self.image=self.images[self.direction] #坦克的图片由方向决定
self.rect=self.image.get_rect()
self.rect.left=left
self.rect.top=top
self.live=True #决定坦克生死
self.oldleft=self.rect.left
self.oldtop=self.rect.top def stay(self):
self.rect.top=self.oldtop
self.rect.left=self.oldleft def move(self):
if not self.stop: # 如果坦克不是停止状态
self.oldleft=self.rect.left
self.oldtop=self.rect.top
if self.direction == "L": # 如果坦克的方向向左,那么只需要改坦克的left就ok了。left在减小
if self.rect.left > 0: # 判断坦克是否在屏幕左边的边界上
self.rect.left -= self.speed
else:
self.rect.left = 0
elif self.direction == "R": # 如果坦克方向向右,坦克的right增加就ok了。
if self.rect.right < TankMain.width: # 坦克已经在屏幕的最右边的话就不能往右移动了
self.rect.right += self.speed
else:
self.rect.right = TankMain.width
elif self.direction == "D": # 如果坦克方向向下,坦克的bottom增加就ok了。
if self.rect.bottom < TankMain.height:
self.rect.top += self.speed
else:
self.rect.bottom = TankMain.height
elif self.direction == "U": # 如果坦克方向向上,坦克的top减小就ok了。
if self.rect.top > 0:
self.rect.top -= self.speed
else:
self.rect.top = 0
def fire(self):
m = Missile(self.screem,self)
return m class My_Tank(Tank):
def __init__(self,screem):
super(My_Tank, self).__init__(screem,275,400)#创建一个我方坦克,坦克显示在屏幕的中下部位置
self.stop=True
self.live=True def hit_enemy_missile(self):
hit_list=pygame.sprite.spritecollide(self,TankMain.enemy_missile_list,False)
for m in hit_list: #我方坦克中弹
m.live=False
TankMain.enemy_missile_list.remove(m)
self.live=False
explode = Explode(self.screem,self.rect)
TankMain.explode_list.append(explode) class Enemy_Tank(Tank): def __init__(self,screem):
super(Enemy_Tank, self).__init__(screem,randint(1,5)*100,200)
self.speed=4
self.step=8 #坦克在一个方向移动6步
self.get_random_direction() def get_random_direction(self):
r = randint(0, 4) # 得到一个坦克移动方向和停止的随机数
if r == 4:
self.stop = True
elif r == 0:
self.direction = "L"
self.stop=False
elif r == 1:
self.direction = "R"
self.stop=False
elif r == 2:
self.direction = "U"
self.stop=False
elif r == 3:
self.direction = "D"
self.stop=False
#敌方坦克移动6步后,在随机换方向接着移动
def random_move(self):
if self.live:
if self.step==0:
self.get_random_direction()
self.step=6
else:
self.move()
self.step-=1
def random_fire(self):
r=randint(0,50)
if r==10 or r==25 :
m=self.fire()
TankMain.enemy_missile_list.add(m)
else:
return class Missile(BaseItem):
width=12
height=12
def __init__(self,screem,tank):
super(Missile, self).__init__(screem)
self.tank=tank
self.direction = tank.direction # 炮弹的方向由所发射的坦克决定
self.speed = 12 # 炮弹移动速度
self.images = {} # 炮弹的所有图片,key 方向 value 图片(suface)
self.images["L"] = pygame.image.load("images/bulletL.gif")
self.images["R"] = pygame.image.load("images/bulletR.gif")
self.images["U"] = pygame.image.load("images/bulletU.gif")
self.images["D"] = pygame.image.load("images/bulletD.gif")
self.image = self.images[self.direction] # 坦克的图片由方向决定
self.rect = self.image.get_rect()
self.rect.left = tank.rect.left + (tank.width-self.width)/2
self.rect.top = tank.rect.top + (tank.height-self.height)/2
self.live = True # 决定炮弹生死
self.food=False def move(self):
if self.live: # 如果炮弹活着
if self.direction == "L": # 如果坦克的方向向左,那么只需要改坦克的left就ok了。left在减小
if self.rect.left > 0: # 判断坦克是否在屏幕左边的边界上
self.rect.left -= self.speed
else:
self.live = False
elif self.direction == "R": # 如果坦克方向向右,坦克的right增加就ok了。
if self.rect.right < TankMain.width: # 坦克已经在屏幕的最右边的话就不能往右移动了
self.rect.right += self.speed
else:
self.live = False
elif self.direction == "D": # 如果坦克方向向下,坦克的bottom增加就ok了。
if self.rect.bottom < TankMain.height:
self.rect.top += self.speed
else:
self.live = False
elif self.direction == "U": # 如果坦克方向向上,坦克的top减小就ok了。
if self.rect.top > 0:
self.rect.top -= self.speed
else:
self.live = False
#炮弹击中坦克,1我方坦克击中敌方坦克,敌方坦克击中我方坦克
def hit_tank(self):
if self.good:#我方炮弹
hit_list =pygame.sprite.spritecollide(self,TankMain.enemy_list,False)
for e in hit_list:
e.live=False
TankMain.enemy_list.remove(e)#删除坦克
self.live=False
explode=Explode(self.screem,e.rect) #产生了一个爆炸对象
TankMain.explode_list.append(explode) #爆炸类
class Explode(BaseItem): def __init__(self,screem,rect):
super(Explode, self).__init__(screem)
self.live=True
self.images=[pygame.image.load("images/0.gif"),\
pygame.image.load("images/1.gif"),\
pygame.image.load("images/2.gif"),\
pygame.image.load("images/3.gif"),\
pygame.image.load("images/4.gif"),\
pygame.image.load("images/5.gif"),\
pygame.image.load("images/6.gif"),\
pygame.image.load("images/7.gif"),\
pygame.image.load("images/8.gif"),\
pygame.image.load("images/9.gif"),\
pygame.image.load("images/10.gif"),] #爆炸效果的图片
self.step=0
self.rect=rect #爆炸的位置和炮弹碰到的坦克位置一样 def display(self):
if self.live:
if self.step==len(self.images): #最后一张爆炸图片已经显示
self.live=False
else:
self.image=self.images[self.step]
self.screem.blit(self.image,self.rect)
self.step+=1
else:
pass #游戏中的障碍物
class Wall(BaseItem):
def __init__(self,screem,left,top,width,height):
super(Wall, self).__init__(screem)
self.rect=Rect(left,top,width,height)#墙的高度
self.color=(255,142,0) #墙的颜色
def display(self):
self.screem.fill(self.color,self.rect) def hit_other(self):#检测墙与其他的碰撞
if TankMain.my_tank:
is_hit =pygame.sprite.collide_rect(self,TankMain.my_tank)
if is_hit:
TankMain.my_tank.stop=True
TankMain.my_tank.stay()
if len(TankMain.enemy_list)!=0:
hit_list =pygame.sprite.spritecollide(self,TankMain.enemy_list,False)
for e in hit_list:
e.stop=True
e.stay() game =TankMain()
game.startGame()

运行结果,,

有想学习pygame的小伙伴可以参考参考!!

pygame小游戏之坦克大战的更多相关文章

  1. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  2. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

  3. 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)

    微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  4. 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)

    微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  5. 最简容器动手小实践——FC坦克大战游戏容器化

    FC 经典力作相信大家一点也不陌生.童年时期最频繁的操作莫过于跳关,在 果断跳到最后一关之后,一般都是以惨败告终,所以还是一关一关的过原始积累才能笑到最后.这款游戏的经典就在于双人配合,守家吃装备.也 ...

  6. Python3+pygame实现的90坦克大战 代码完整 有演示效果

    我是一个典型的80后,年轻时玩过了特别多的游戏,所以这几天用Python3+pygame实现了一个另外小游戏"坦克大战"(其他的游戏,请翻阅我的博客) 本实例代码量有些多,完整的版 ...

  7. Python小游戏之 - 飞机大战美女 !

    用Python写的"飞机大战美女"小游戏 源代码如下: # coding=utf-8 import os import random import pygame # 用一个常量来存 ...

  8. Unity3D_(游戏)2D坦克大战 像素版

    2D坦克大战    像素版 游戏规则: 玩家通过上.下.左.右移动坦克,空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束,心脏上方三个单位障碍物设为刚体) 当玩家被击杀次数>=3 ...

  9. Python小游戏之 - 飞机大战 !

    用Python写的"飞机大战"小游戏 源代码如下: # coding=utf-8 import random import os import pygame # 用一个常量来存储屏 ...

随机推荐

  1. Consul 配置ACLs

    比如consul.exe 在D:\consul来个json配置文件在 D:\consul\config.jsonjson 格式{ "acl_datacenter": "d ...

  2. 作为软件技术人员建立自己的git账户并保存资料的重要性

    日常生活中,当修改并保存了一个文件,所得到的就是此文件的最新版本,假若今后因某一问题需要用到原来文件,可是很多情况下,这种修改是不可逆的.你修改完之后,无法回到你修改前的样子.为了避免这种情况,有的人 ...

  3. 一个程序猿试用有道云笔记VIP功能体验

    熟悉我的朋友应该知道,我有一个微信公众号,叫做"汪子熙", 我会定期在上面推送技术文章. 而我绝大多数技术文章都是在每天上下班的地铁上用手机写的,然后到家后同步到电脑上,进行发表. ...

  4. 为什么有的系统的事务码BSP_WD_CMPWB看不见Enhance Component这个按钮

    我的同事问我,为什么有的系统看不到下图7的按钮? 对比两张图里工具栏的差异. 答案 这是因为在图2(看不见Enhance Component按钮)的系统里,该系统的类型被设置为"SAP&qu ...

  5. OC @protocol(声明协议 )

    @protocol Study; int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [[[Stud ...

  6. linux命令之添加删除磁盘分区

    之前已经写过df和fdisk的区别了,df可以显示当前已经挂载的磁盘分区,df -T可以额外显示文件系统类型 fdisk -l可以显示出所有挂载未挂载的分区,但不显示文件类型 在我的虚拟机上有一块分配 ...

  7. where are you going ? 反序为:going you are where

    一个反序小算法,就是首尾替换,生成新的反序后的数组

  8. 一组div跟随鼠标移动,反应鼠标轨迹

    <!DOCTYPE html> <html> <head> <title>div随鼠标移动</title> <style type=& ...

  9. centos7 编译安装nginx1.16.0( 完整版 )

    一.安装依赖包 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 依赖包说明: 1.编译 ...

  10. 如何学好Spring

    要学好Spring,首先要明确Spring是个什么东西,能帮我们做些什么事情,知道了这些然后做个简单的例子,这样就基本知道怎么使用Spring了.Spring核心是IoC容器,所以一定要透彻理解什么是 ...