Beginning Game Programming for Teens with Python

#1 import library
import pygame
import math
import random
from pygame.locals import *

def chkbadbuy(badbuys,message):
	for badguy in badbuys:
		if len(badguy)==1:
			print(message)
			print badguy


#2 initialize game
pygame.init()
width,height=640,480
screen=pygame.display.set_mode((width,height))

pygame.mixer.init()

keys=[False,False,False,False]
playerpos=[100,100]
acc=[0,0]
arrows=[]

badtimer=100
badtimer1=0
badguys=[[640,100]]
debug=[[640,100]]
healthvalue=194

#3 load image
player=pygame.image.load('resources/images/dude.png')
grass=pygame.image.load('resources/images/grass.png')
castle=pygame.image.load('resources/images/castle.png')
arrow=pygame.image.load('resources/images/bullet.png')
badguyimg1=pygame.image.load('resources/images/badguy.png')
badguyimg=badguyimg1
healthbar=pygame.image.load('resources/images/healthbar.png')
health=pygame.image.load('resources/images/health.png')
gameover=pygame.image.load('resources/images/gameover.png')
youwin=pygame.image.load('resources/images/youwin.png')

#3.1 load audio
hit=pygame.mixer.Sound('resources/audio/exitcode.wav')
enemy=pygame.mixer.Sound('resources/audio/enemy.wav')
shoot=pygame.mixer.Sound('resources/audio/shoot.wav')
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1,0.0)
pygame.mixer.music.set_volume(0.25)

#4 looping
running=1
exitcode=-1
while running:
	badtimer-=1
	#5 clear the screen element
	screen.fill(0)	

	#6.1 player position and rotation
	position=pygame.mouse.get_pos()
	angle=math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
	playerrot=pygame.transform.rotate(player,360-angle*57.29)
	playerpos1=(playerpos[0]-playerrot.get_rect().width/2,playerpos[1]-playerrot.get_rect().height/2)
	

	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(castle,(0,30))
	screen.blit(castle,(0,135))
	screen.blit(castle,(0,240))
	screen.blit(castle,(0,345))
	#screen.blit(player, playerpos)

	screen.blit(playerrot,playerpos1)

	#6.2 draw arrow	
	for bullet in arrows:
		index=0
		velx=math.cos(bullet[0])*10
		vely=math.sin(bullet[0])*10
		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)])
		debug.append([640,random.randint(50,430)])
		#debug
		chkbadbuy(badguys,'error in badguys:')

		badtimer=100-(badtimer1*2)
		if badtimer1>=35:
			badtimer1=35
		else:
			badtimer1+=5
	for index,badguy in enumerate(badguys):
		if badguy[0]<-64:
			badguys.pop(index)		
		badguy[0]-=7

		#chkbadbuy(badguys,'error2:')	
	#6.3.1 attack castle
	for index,badguy in enumerate(badguys):

		if len(badguy)>1:
			screen.blit(badguyimg,badguy)
			badrect=pygame.Rect(badguyimg.get_rect())
			badrect.top=badguy[1]
			badrect.left=badguy[0]
			if badrect.left<64:
				hit.play()
				healthvalue -= random.randint(5,20)
				badguy.pop(index)
		
	#6.3.2 check collisions
		for index1,bullet in enumerate(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)

	#6.4 draw clock
	font=pygame.font.Font(None,24)
	surviedtext=font.render(str((90000-pygame.time.get_ticks())/60000)+':'+str((90000-\
		pygame.time.get_ticks())/1000*60).zfill(2),True,(0,0,0))	
	textRect=surviedtext.get_rect()	
	textRect.topright=[635,5]
	screen.blit(surviedtext,textRect)

	#6.5 draw health bar
	screen.blit(healthbar,(5,5))
	for health1 in range(healthvalue):
		screen.blit(health,(health1+8,8))
	helthtext=font.render(str(healthvalue),True,(0,255,0))
	textRect=helthtext.get_rect()
	textRect.topright=[500,8]
	screen.blit(helthtext,textRect)
	#8 loop events
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			pygame.quit()
			exit(0)
		if event.type==pygame.KEYDOWN:
			if event.key==pygame.K_w:
				keys[0]=True
			elif event.key==pygame.K_a:
				keys[1]=True
			elif event.key==pygame.K_s:
				keys[2]=True
			elif event.key==pygame.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

		#fire
		if event.type==pygame.MOUSEBUTTONDOWN:
			shoot.play()
			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])
	#9 move the player
	if keys[0]:
		playerpos[1]-=5 #w
	elif keys[1]:
		playerpos[0]-=5 #a
	elif keys[2]:
		playerpos[1]+=5 #s
	elif keys[3]:
		playerpos[0]+=5 #d

	#10 win/lost check
	if pygame.time.get_ticks() >= 90000:
		#running=0
		exitcode=1
	if healthvalue <= 0:
		#running=0
		exitcode=0
	if acc[1]!=0:
		accuarcy=acc[0]*1.0/acc[1]*100
	else:
		accuarcy=0

		

	#11 win/lose display
	if exitcode==0:
		pygame.font.init()
		font=pygame.font.Font(None,24)
		text=font.render('Accuracy:'+str(accuarcy)+'%',True,(255,0,0))
		textRect=text.get_rect()
		textRect.centerx=screen.get_rect().centerx
		textRect.centery=screen.get_rect().centery+24
		screen.blit(gameover,(0,0))
		screen.blit(text,textRect)
	elif exitcode==1:
		pygame.font.init()
		font=pygame.font.Font(None,24)
		text=font.render('Accuracy:'+str(accuarcy)+'%',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))
		screen.blit(text,textRect)
		
	#12
	pygame.display.flip()		

你可能感兴趣的:(电脑网络)