Python开发坦克大战
Python不仅能开发网站,爬虫数据分析等,他其实也可以写游戏,接下来就给大家分享下坦克大战的代码:
PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步
import pygame
import time
import random
from pygame.sprite import Sprite
SCREEN_WIDTH=700
SCREEN_HEIGHT=500
BG_COLOR=pygame.Color(0, 0, 0)
TEXT_COLOR=pygame.Color(255, 0, 0)
class BaseItem(Sprite):
def __init__(self, color, width, height):
# Call the parent class (Sprite) constructor
pygame.sprite.Sprite.__init__(self)
class MainGame():
window = None
my_tank = None
#存储坦克列表
enemyTankList = []
enemyTankCount = 5
myBulletList = []
enemyBulietList = []
explodeList=[]
def __init__(self):
pass
def startGame(self):
print("start game")
pygame.display.init()
MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
pygame.display.set_caption("坦克大战")
MainGame.my_tank = Tank(350, 250)
#初始化敌方坦克
self.CreateEnemyTank()
while True:
time.sleep(0.003)
#获取事件
MainGame.window.fill(BG_COLOR)
self.getEvent()
MainGame.window.blit(self.getTextSuface("敌方坦克数量%d"%len(MainGame.enemyTankList)),(10,10))
MainGame.my_tank.displayTank()
self.blitMyBullet()
self.blitEnemyTank()
self.blitEnemyBuliet()
self.blitExplode()
if not MainGame.my_tank.stop :
MainGame.my_tank.move()
pygame.display.update()
pygame.display.flip()
def CreateEnemyTank(self):
top = 100
for i in range(MainGame.enemyTankCount):
left = random.randint(0,600)
speed = 1
enemy= EnemyTank(left, top , speed)
MainGame.enemyTankList.append(enemy)
def blitEnemyTank(self):
for et in MainGame.enemyTankList:
if et.alive:
et.displayTank()
et.randMove()
eb = et.shot()
if eb :
MainGame.enemyBulietList.append(eb)
else:
MainGame.enemyTankList.remove(et)
def blitMyBullet(self):
for myBullet in MainGame.myBulletList:
if myBullet.alive:
myBullet.displayBullet()
myBullet.move()
myBullet.myBullet_hit_enemyTank()
else:
MainGame.myBulletList.remove(myBullet)
def blitEnemyBuliet(self):
for eb in MainGame.enemyBulietList:
if eb.alive:
eb.displayBullet()
eb.move()
else:
MainGame.enemyBulietList.remove(eb)
def blitExplode(self):
for explode in MainGame.explodeList:
if explode.live :
explode.displayExplode()
else:
MainGame.explodeList.remove(explode)
def endGame(self):
print("exit")
exit()
#左上角文字
def getTextSuface(self,text):
pygame.font.init()
#print(pygame.font.get_fonts())
font = pygame.font.SysFont('kaiti',18)
txt = font.render(text, True, TEXT_COLOR)
return txt
def getEvent(self):
#获取所有的事件
eventList= pygame.event.get()
for event in eventList:
if event.type == pygame.QUIT:
self.endGame()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print("Key LEFT")
MainGame.my_tank.direction='L'
MainGame.my_tank.stop = False
#MainGame.my_tank.move()
elif event.key == pygame.K_RIGHT:
print("Key RIGHT")
MainGame.my_tank.direction = 'R'
MainGame.my_tank.stop = False
#MainGame.my_tank.move()
elif event.key == pygame.K_UP:
print("Key UP")
MainGame.my_tank.direction = 'U'
MainGame.my_tank.stop = False
#MainGame.my_tank.move()
elif event.key == pygame.K_DOWN:
print("Key DOWN")
MainGame.my_tank.direction = 'D'
MainGame.my_tank.stop = False
#MainGame.my_tank.move()
elif event.key == pygame.K_SPACE:
print("Fire")
myBullet = Bullet(MainGame.my_tank)
MainGame.myBulletList.append(myBullet)
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
MainGame.my_tank.stop = True
class Tank(BaseItem):
def __init__(self, left, top):
self.images = {
'U': pygame.image.load("imgs/p1tankU.gif"),
'D': pygame.image.load('imgs/p1tankD.gif'),
'L': pygame.image.load('imgs/p1tankL.gif'),
'R': pygame.image.load('imgs/p1tankR.gif')
}
self.direction = 'D'
self.image = self.images[self.direction]
self.rect = self.image.get_rect()
self.rect.left = left
self.rect.top = top
self.stop = True
self.speed = 1
def move(self):
if self.direction == 'L':
if self.rect.left >0 :
self.rect.left -= self.speed
elif self.direction == 'U':
if self.rect.top > 0:
self.rect.top -= self.speed
elif self.direction == 'D':
if self.rect.top +self.rect.height <SCREEN_HEIGHT :
self.rect.top += self.speed
elif self.direction == 'R':
if self.rect.left + self.rect.width < SCREEN_WIDTH:
self.rect.left += self.speed
def shot(self):
num = random.randint(1,1000)
if num < 7 :
return Bullet(self)
def displayTank(self):
self.image = self.images[self.direction]
MainGame.window.blit(self.image,self.rect)
class MyTank(Tank):
def __init__(self):
pass
class EnemyTank(Tank):
def __init__(self,left,top,speed):
self.images={
'U': pygame.image.load("imgs/enemy1U.gif"),
'D': pygame.image.load('imgs/enemy1D.gif'),
'L': pygame.image.load('imgs/enemy1L.gif'),
'R': pygame.image.load('imgs/enemy1R.gif')
}
self.direction = self.randDirection()
self.image=self.images[self.direction]
self.rect = self.image.get_rect()
self.rect.left = left
self.rect.top = top
self.speed = speed
self.flag = True
self.setp = 10
self.alive = True
def randDirection(self):
num = random.randint(1,4)
if num == 1:
return 'U'
elif num == 2:
return 'D'
elif num == 3:
return 'L'
elif num == 4:
return 'R'
def randMove(self):
if self.setp <= 0:
self.direction = self.randDirection()
self.setp = random.randint(60,140)
else:
self.move()
self.setp -= 1
class Bullet(BaseItem):
def __init__(self,tank):
self.image = pygame.image.load("imgs/enemymissile.gif")
self.direction = tank.direction
self.rect = self.image.get_rect()
if self.direction == 'U':
self.rect.left = tank.rect.left + (tank.rect.width-self.rect.width)/2
self.rect.top = tank.rect.top - self.rect.height
elif self.direction == 'D':
self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
self.rect.top = tank.rect.top + tank.rect.height
elif self.direction == 'L':
self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2
self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
elif self.direction == 'R':
self.rect.left = tank.rect.left + tank.rect.width
self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
self.speed = 2
self.alive = True
def move(self):
if self.direction == 'U':
if self.rect.top > 0:
self.rect.top -= self.speed
else:
self.alive=False
elif self.direction == 'R':
if self.rect.left + self.rect.width < SCREEN_WIDTH:
self.rect.left += self.speed
else:
self.alive=False
elif self.direction == 'D':
if self.rect.top + self.rect.height < SCREEN_HEIGHT:
self.rect.top += self.speed
else:
self.alive=False
elif self.direction == 'L':
if self.rect.left > 0:
self.rect.left -= self.speed
else:
self.alive=False
def displayBullet(self):
MainGame.window.blit(self.image,self.rect)
print(self.rect.left)
print(self.rect.top)
def myBullet_hit_enemyTank(self):
for enemyTank in MainGame.enemyTankList:
if pygame.sprite.collide_rect(enemyTank,self):
enemyTank.alive = False
self.alive = False
explode = Explode(enemyTank)
#displayExplode()
MainGame.explodeList.append(explode)
class Wall():
def __init__(self):
pass
def display(self):
pass
class Explode():
def __init__(self, tank):
self.rect= tank.rect
self.images=[
pygame.image.load("imgs/blast0.gif"),
pygame.image.load("imgs/blast1.gif"),
pygame.image.load("imgs/blast2.gif"),
pygame.image.load("imgs/blast3.gif"),
pygame.image.load("imgs/blast4.gif"),
]
self.step = 0
self.image = self.images[self.step]
self.live = True
def displayExplode(self):
if self.step < len(self.images):
self.image = self.images[self.step]
self.step += 1
MainGame.window.blit(self.image,self.rect)
else:
self.live = False
self.step = 0
class Music():
def __init__(self):
pass
def play(self):
pass
if __name__ == '__main__':
MainGame().startGame()
以上就是本次分享。另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
Python开发坦克大战的更多相关文章
- 手把手教你用Python实现“坦克大战”,附详细代码!
小时候玩的“坦克大战”,你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygame1.9.6 ...
- 【SIKIA计划】_07_Unity3D游戏开发-坦克大战笔记
[新增分类][AudioClips]音频剪辑[AudioMixers]音频混合器[Editor][Fonts]字体[Materials]材质[Models]模型[Standard Assets] [渲 ...
- 简易坦克大战python版
#! /usr/bin/env python # -*- coding:utf8 -*- ''' *author:wasua *purpose:学习python语言,其中的类以及pygame应用 ...
- Python之游戏开发-飞机大战
Python之游戏开发-飞机大战 想要代码文件,可以加我微信:nickchen121 #!/usr/bin/env python # coding: utf-8 import pygame impor ...
- 用 Python 写个坦克大战
坦克大战是一款策略类的平面射击游戏,于 1985 年由 Namco 游戏公司发布,尽管时至今日已经有了很多衍生类的游戏,但这款游戏仍然受到了相当一部分人的欢迎,本文我们看一下如何使用 Python 来 ...
- Python+Pygame开发太空大战/飞机大战完整游戏项目(附源代码)
项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧! 游戏画面动态且丰富哦! 需求分析 利用Pyt ...
- [置顶] 小强的HTML5移动开发之路(9)——坦克大战游戏3
上一篇我们创建了敌人的坦克和自己的坦克,接下来就应该让坦克发子弹了,我们下面来看一下如何让我们的坦克发出子弹. 前面我们用面向对象的思想对Tank进行了封装,又利用对象冒充实现了我们的坦克和敌人的坦克 ...
- cocos2d-x游戏开发系列教程-坦克大战游戏启动界面的编写
用前面介绍的方法,创建一个cocos2d-x项目,可以看到新项目内容如下图:
- 小强的HTML5移动开发之路(8)——坦克大战游戏2
来自:http://blog.csdn.net/cai_xingyun/article/details/48629015 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接 ...
随机推荐
- SpringBoot整合NoSql--(三)Redis集群
(1)集群原理 在Redis集群中,所有的Redis节点彼此互联,节点内部使用二进制协议优化传输速度和带宽. 当一个节点挂掉后,集群中超过半数的节点检测失效时才认为该节点已失效.不同于Tomcat集群 ...
- ES6中Set和WeakSet
Set(放数组,不能重复) 会自动去重,有4个元素,但是打印出来只有三个 let setArr=new Set(['zhang','huan','eternity','zhang']); consol ...
- 硬盘500M,为什么没有500M。10M宽带,为什么网速没有10M?
在天朝, 硬件厂商用1000代替1024, 通信公司,用 byte来代替bit. 比如 500G的硬盘,应该有 500 * 1024 *1024 *8 = 4.194304*10^9 位 但是按照厂商 ...
- Elasticsearch客户端源码剖析
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 注:本文源链接:https://www.cnblogs.com/chloneda/p/es-cli ...
- 如何将BroadcastReceiver中的信息传到Activity中
方法:在BroadcastReceiver中定义一个接口,在Activity中定义一个BroadcastReceiver的对象,采用动态注册,在Activity中定义接口中的方法并通过Broadcas ...
- netty 4.x用户使用指南
引言 问题 现在我们使用通用的应用程序或库来相互通信.例如,我们经常使用HTTP客户机从web服务器检索信息,并通过web服务调用远程过程调用.然而,通用协议或其实现有时不能很好地进行扩展.这就像我们 ...
- cf1276B
题意简述:给出无向图,会有重边,然后给你两个点a,b,让你计算有多少点对(x,y)满足从x到y的所有路径都经过a和b 题解:先从a,b两点出发进行dfs,dfs的过程中不能经过a,b两点(除了开始) ...
- 深入理解 C/C++ sizeof() 运算符
过去有一段时间一直以为带个括号的 \(sizeof()\) 是 \(C/C++\) 的原生函数QAQ. 其实不然,\(sizeof\) 同位运算符(^|&~!)一样是一种单目运算符,作用于变量 ...
- ajax发送请求下载字节流形式的excel文件
背景 开发项目中导出功能,因为数据量有点大,所以导出可能需要时间有点长,所以想用ajax异步请求. 存在问题 利用传统的js和jquery提供的ajax相关获取响应的方式是无法实现excel文件下载的 ...
- 论文阅读笔记(十六)【AAAI2018】:Region-Based Quality Estimation Network for Large-Scale Person Re-Identification
Introduction (1)Motivation: 当前的行人重识别方法都只能在标准的数据集上取得好的效果,但当行人被遮挡或者肢体移动时,往往效果不佳. (2)Contribution: ① 提出 ...