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 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接 ...
随机推荐
- c++输入输出,保留几位小数
#include <iomanip> //头文件 //第一种写法 cout<<setiosflags(ios::); //第二种写法 cout.setf(ios::fixed) ...
- springboot整合WebService简单版
一.什么是webservice 关于webservice的介绍摘自百度百科,上面的介绍很详细.(链接:https://baike.baidu.com/item/Web%20Service/121503 ...
- Django2.2 静态文件的上传显示,遇到的坑点-------已解决
前情提要:这里虽说是Django2.2 ,但经过测试发现Django 的其他版本也可以用此方法解决 一.项目根目录下的static文件的路由显示问题 在项目根目录下创建静态文件时发现,即使我配置了se ...
- python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程
自己今天第一次做一个python生日贺卡: 效果图 参考之前有位大佬的作品,自己稍微的改造了一下下 首先:上程序 Birthday.py """ ----------- ...
- 纪中23日c组T3 2161. 【2017.7.11普及】围攻 斐波那契数列
2161. 围攻 (File IO): input:siege.in output:siege.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto Prob ...
- 【剑指Offer】63、二叉搜索树的第k个结点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 题解一:DFS 借助栈实现 // 中序非递归 public ...
- Android_Service的一些零散知识点_1
service与线程不甚相同,service是Android提供的可供一个允许常驻后台的组件. 可通过StartService()启动Service和BindService()启动Service St ...
- 学习linux/unix编程方法的建议,学习Linux的四个步骤(转)
解答:学习Linux的四个步骤假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过我想大概可以分为4个阶段,水平从低到高从安装使用=>linux ...
- C++中复制构造函数被调用的三种情况
C++中的构造函数 c++中的构造函数分为构造函数,和复制构造函数,相比于构造函数,复制构造函数使用更加方便,快捷.构造函数可以有多个,二复制构造函数只能有一个,因为复制构造函数的参数只能是当前类的一 ...
- PHP0006:PHP基础--函数2
如果php后面没有任何html代码就可以 删掉后面的 ?> 符号 file_put_content 是覆盖写入文件信息