以前在学校的时候无聊的学了会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. asyncio标准库3 HTTP client example

    import aiohttp import asyncio import async_timeout async def fetch(session, url): async with async_t ...

  2. 基于alpine定制常用命令镜像

    FROM alpine RUN apk update RUN apk add curl coreutils 像busybox.alpine镜像date命令都不是完整版的,不能执行加减的操作(date ...

  3. NO.010-2018.02.15《上邪》两汉:佚名

    上邪_古诗文网 上邪 两汉:佚名 上邪,我欲与君相知,长命无绝衰.上天呀!我渴望与你相知相惜,长存此心永不褪减.上邪(yé)!:天啊!.上,指天.邪,语气助词,表示感叹. 相知:相爱.命:古与“令”字 ...

  4. 动态规划(DP),Human Gene Functions

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1027 http://poj.org/problem?id=108 ...

  5. 如何使用react-redux

    之前学习了react,也学习了redux,那么react-redux是什么呢?实际上他是一个第三方的模块,他可以帮助我们在react之中更加方便的使用redux.首先如果想用react-redux,先 ...

  6. nbu集群Alwayson相关问题

    Alwayson 1. Alwayson 是否依赖于域环境? 答: 是, alwayson依赖于故障转移群集(只有在故障转移群集中的SQL Server 才能启动高可行性组功能),而故障转移群集愈依赖 ...

  7. Github 上一些关于PHP的开源项目

    Github  上一些关于PHP的开源项目,总有你喜欢的那一款 Awesome PHP Package Management Package Management Related Frameworks ...

  8. 2017.9.11 初入HTML学习

          第二章 静态网页开发技术 静态网页是指可以由浏览器解释执行而生成的网页,HTML是一组标签,负责网页的基本表现形式: JavaScript是在客户端浏览器运行的语言,负责在客户端与用户的互 ...

  9. 剑指offer23 从上往下打印二叉树

    没有把队列的头部弹出,出现内存错误:

  10. java线程池系列(1)-ThreadPoolExecutor实现原理

    前言 做java开发的,一般都避免不了要面对java线程池技术,像tomcat之类的容器天然就支持多线程. 即使是做偏后端技术,如处理一些消息,执行一些计算任务,也经常需要用到线程池技术. 鉴于线程池 ...