炸掉你的城堡!(pygame獾兔大战)
来源:互联网 发布:油管youtube下载软件 编辑:程序博客网 时间:2024/05/09 07:10
代码修改bug,添加注释等,獾的速度加快之后很难……
git地址:
https://github.com/Jailman/blowupyrcastle.git
游戏资源使用了文章中附带的下载,原版文章请看这里:
http://blog.jobbole.com/46308/
附一些基本的数学知识
如图比如以角A为例
sinA=对边:斜边=BC:AC
cosA=临边:斜边=AB:AC
tanA=对边:临边=BC:AB
cotA=临边:对边=AB:BC
#!/usr/bin/python#coding=utf8# 1 - Import libraryimport cStringIOimport pygameimport randomimport mathfrom pygame.locals import *from os import remove# 2 - Initialize the gamepygame.init()pygame.display.set_caption('捍卫荣誉')width, height = 640, 480screen=pygame.display.set_mode((width, height))keys = [False, False, False, False]playerpos=[130,240]acc=[0,0] #[0]是击中数,[1]是发射数arrows=[] #发射箭头列表,点击鼠标时向其中填充bullet列表badtimer=100badtimer1=0badguys=[[640, random.randint(40,400)]]healthvalue=194 #总血量pygame.mixer.init()# 3 - Load imagesstart = pygame.image.load("resources/images/start.png")grass = pygame.image.load("resources/images/bg2.png")castle = pygame.image.load("resources/images/hq1.png")player = pygame.image.load("resources/images/p1.1.png")player1 = pygame.image.load("resources/images/p1.1.png")player2 = pygame.image.load("resources/images/p1.2.png")arrow = pygame.image.load("resources/images/bullet6.png")badguyimg1 = pygame.image.load("resources/images/badguy1.1.png")badguyimg2 = pygame.image.load("resources/images/badguy1.2.png")badguyimg3 = pygame.image.load("resources/images/badguy1.3.png")badguyimg4 = pygame.image.load("resources/images/badguy1.4.png")badguyimgs = [badguyimg1, badguyimg2, badguyimg3, badguyimg4]# badguyimg = badguyimg1healthbar = pygame.image.load("resources/images/healthbar.png")health = pygame.image.load("resources/images/health.png")gameover = pygame.image.load("resources/images/gameover2.png")youwin = pygame.image.load("resources/images/youwin.png")# 3.1 - Load audiobegin = pygame.mixer.Sound("resources/audio/start.wav")hit = pygame.mixer.Sound("resources/audio/explode.wav")enemy = pygame.mixer.Sound("resources/audio/enemy.wav")shoot = pygame.mixer.Sound("resources/audio/shoot.wav")win = pygame.mixer.Sound("resources/audio/win.wav")lost = pygame.mixer.Sound("resources/audio/lost.wav")bgm = 'resources/audio/cowBGM.wav'hit_castle = pygame.mixer.Sound("resources/audio/explode2.wav")begin.set_volume(0.50)hit.set_volume(0.07)enemy.set_volume(0.20)shoot.set_volume(0.07)win.set_volume(0.25)hit_castle.set_volume(0.18)pygame.mixer.music.load(bgm)pygame.mixer.music.play(-1, 0.0)pygame.mixer.music.set_volume(0.25)#开局画面running = 1while running: screen.fill(0) screen.blit(start, (0,0)) #提示按键开始 font = pygame.font.Font(None, 30) text1 = font.render("Press [SPACE] to start", True, (255,0,0)) screen.blit(text1, (230,450)) #调整显示文字位置 for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key==K_SPACE: begin.play() running = 0 if event.type == pygame.QUIT: pygame.quit() exit(0) pygame.display.flip()# 按下确定键后的透明渐变效果from PIL import Image def addTransparency(img, factor): img = img.convert('RGBA') img_blender = Image.new('RGBA', img.size, (0,0,0,0)) img = Image.blend(img_blender, img, factor) return img img = Image.open("resources/images/start.png")tran = 1while tran > 0.8: img = addTransparency(img, factor = tran) imgBuf = cStringIO.StringIO(img.tobytes()) imgx = pygame.image.frombuffer(imgBuf.getvalue(), (640,480), "RGBA") screen.blit(imgx, (0,0)) tran -= 0.001 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit(0) pygame.display.flip()# 4 - keep looping throughrunning = 1exitcode = 0n = 0while running: badtimer-=1 # 5 - clear the screen before drawing it again screen.fill(0) # 6 - draw the screen elements for x in range(width/grass.get_width()+1): for y in range(height/grass.get_height()+1): screen.blit(grass,(x*100,y*100)) # screen.blit(grass, (0,0)) screen.blit(castle,(0,30)) screen.blit(castle,(0,135)) screen.blit(castle,(0,240)) screen.blit(castle,(0,345 )) # 6.1 - Set player position and rotation position = pygame.mouse.get_pos() angle = math.atan2(position[1]-(playerpos[1]+player.get_height()/2),position[0]-(playerpos[0]+player.get_width()/2)) # print angle # playerrot = pygame.transform.rotate(player, 360-angle*57.29) playerrot = pygame.transform.rotate(player, 360-180*angle/math.pi) #180*angle/math.pi为偏转角度 playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2) screen.blit(playerrot, playerpos1) # 6.2 - Draw arrows for bullet in arrows: #arrow中的bullet列表是在按鼠标发射时追加的,bullet[0]是atan(y,x) # print bullet index=0 velx=math.cos(bullet[0])*10 #乘数调整子弹横向速度 # print math.cos(bullet[0]) vely=math.sin(bullet[0])*10 #乘数调整子弹竖向速度 # print math.sin(bullet[0]) bullet[1]+=velx bullet[2]+=vely if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480: arrows.pop(index) index+=1 for projectile in arrows: arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29) screen.blit(arrow1, (projectile[1], projectile[2])) # 6.3 - Draw badgers if badtimer==0: badguys.append([640, random.randint(50,430)]) badtimer=100-(badtimer1*2) if badtimer1>=35: badtimer1=35 else: badtimer1+=5 index=0 for badguy in badguys: if badguy[0]<-64: badguys.pop(index) badguy[0]-=1 #调整獾的移动速度 # 6.3.1 - Attack castle badrect=pygame.Rect(badguyimg1.get_rect()) badrect.top=badguy[1] badrect.left=badguy[0] if badrect.left<64: # hit.play() hit_castle.play() healthvalue -= random.randint(5,20) #敌人碰撞城堡掉血 badguys.pop(index) #hit player playerrect = pygame.Rect(player.get_rect()) playerrect.left = playerpos[0] - 32 #增减一些值使触碰画面看上去更贴合 playerrect.top = playerpos[1] - 10 #增减一些值使触碰画面看上去更贴合 # print playerrect if badrect.colliderect(playerrect): hit.play() healthvalue -= random.randint(3,12) #玩家碰撞敌人掉血 badguys.pop(index) #6.3.2 - Check for collisions index1=0 for bullet in arrows: bullrect=pygame.Rect(arrow.get_rect()) bullrect.left=bullet[1] bullrect.top=bullet[2] if badrect.colliderect(bullrect): enemy.play() acc[0]+=1 badguys.pop(index) arrows.pop(index1) index1+=1 # 6.3.3 - Next bad guy index+=1 for badguy in badguys: # screen.blit(badguyimg, badguy) n = n + 1 if n > (len(badguyimgs)) * 10-1: n = 0 screen.blit(badguyimgs[int(n/10)], badguy) # 6.4 - Draw clock font = pygame.font.Font(None, 24) #此处为漏洞,当点击窗口标题时,时间依然在流逝,但是游戏却暂停了,导致点击标题即可获胜 survivedtext = font.render(str((90000-pygame.time.get_ticks())/60000)+":"+str((90000-pygame.time.get_ticks())/1000%60).zfill(2), True, (0,0,0)) textRect = survivedtext.get_rect() textRect.topright=[635,5] screen.blit(survivedtext, textRect) # 6.5 - Draw health bar screen.blit(healthbar, (5,5)) for health1 in range(healthvalue): screen.blit(health, (health1+8,8)) #在健康值上方显示文字 hfont = pygame.font.Font(None, 20) htext = hfont.render("Health", True, (255,0,0)) screen.blit(htext, (50,8)) #调整显示文字位置,覆盖在健康值上方 # 7 - update the screen pygame.display.flip() # 8 - loop through the events for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key==K_w: keys[0]=True elif event.key==K_a: keys[1]=True elif event.key==K_s: keys[2]=True elif event.key==K_d: keys[3]=True if event.type == pygame.KEYUP: if event.key==pygame.K_w: keys[0]=False elif event.key==pygame.K_a: keys[1]=False elif event.key==pygame.K_s: keys[2]=False elif event.key==pygame.K_d: keys[3]=False # check if the event is the X button if event.type==pygame.QUIT: # if it is quit the game pygame.quit() exit(0) if event.type==pygame.MOUSEBUTTONDOWN: shoot.play() player = player2 position=pygame.mouse.get_pos() acc[1]+=1 arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32]) if event.type==pygame.MOUSEBUTTONUP: player = player1 # 9 - Move player if keys[0]: if not playerpos[1] < 0: playerpos[1]-=3 elif keys[2]: if not playerpos[1] > height: playerpos[1]+=3 if keys[1]: if not playerpos[0] < 100: playerpos[0]-=3 elif keys[3]: if not playerpos[0] > width: playerpos[0]+=3 #10 - Win/Lose check if pygame.time.get_ticks()>=90000: running=0 exitcode=1 if healthvalue<=0: running=0 exitcode=0 if acc[1]!=0: accuracy=acc[0]*1.0/acc[1]*100 else: accuracy=0# 11 - Win/lose display if exitcode==0: pygame.font.init() font = pygame.font.Font(None, 24) text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0)) textRect = text.get_rect() textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery+24 pygame.mixer.music.set_volume(0) lost.play() screen.blit(gameover, (0,0)) screen.blit(text, textRect)else: pygame.font.init() font = pygame.font.Font(None, 24) text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0)) textRect = text.get_rect() textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery+24 screen.blit(youwin, (0,0)) pygame.mixer.music.set_volume(0) win.play() screen.blit(text, textRect)ticksstart = pygame.time.get_ticks()# 作为延时开启背景音乐while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit(0) ticksend = pygame.time.get_ticks() ticksdiff = ticksend - ticksstart #计算延时 if ticksdiff == 3500: #开启背景音乐 pygame.mixer.music.set_volume(0.25) pygame.display.flip()
阅读全文
1 0
- 炸掉你的城堡!(pygame獾兔大战)
- 唱歌程序(炸掉你家电脑的蜂鸣器)吓你的。。。
- pygame的应用——python版飞机大战
- 无聊消遣——基于pygame库的飞机大战
- 利用python的pygame的模块来实现简单的飞机大战游戏
- pygame 的使用(1)
- 城堡幻想曲圣魔大战3(Castle Fantisia)新艾伦希亚战记(即重做版) 新增剧情简介
- 城堡幻想曲圣魔大战3(Castle Fantisia)艾伦希亚战记和重做版下载安装汉化
- pygame编写飞机大战(2)-pygame快速入门
- pygame植物大战僵尸射击版
- python pygame实战《飞船大战外星人》
- Python:用Pygame实现飞机大战小游戏
- pygame编写飞机大战(1)-准备
- pygame编写飞机大战(4)-滚动地图
- pygame编写飞机大战(5)-子弹类
- pygame编写飞机大战(8)-碰撞检测
- 地下城堡作死向操作 颠覆你的世界观
- Python pygame 简单的pygame
- 2017年-2018年头层牛皮凉席十大品牌榜
- mysql 中高阶 ☞ 索引
- SVN客户端(小乌龟)断开连接
- 数据库锁表之解锁原理
- view 加边框/阴影
- 炸掉你的城堡!(pygame獾兔大战)
- HDU 5543
- 使用PHP邮件库swiftmailer发送邮件时,QQ,163邮箱的配置
- java static final 初始化
- 628. Maximum Product of Three Numbers
- 很多同学扶墙后看了一些经典又用的Youtube视频想和在墙内同学分享,可是Youtube又不存在下载的方式,那么怎么办呢,回味依旧在这里提供三种方法供大家参考。 姿势一――我很懒,不想装任何软件 通过
- Python异常UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
- javascript中的原型与继承2--构造函数窃取Constructor Stealing
- 分答项目_知识点:客户端资源