pygame.time.set_timer(change_hole_event, 800)
地鼠
mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
錘子
hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
時(shí)鐘
clock = pygame.time.Clock()
分?jǐn)?shù)
your_score = 0
flag = False
初始時(shí)間
init_time = pygame.time.get_ticks()
游戲主循環(huán)
while True:
–游戲時(shí)間為60s
time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
–游戲時(shí)間減少, 地鼠變位置速度變快
if time_remain == 40 and not flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 650)
flag = True
elif time_remain == 20 and flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 500)
flag = False
–倒計(jì)時(shí)音效
if time_remain == 10:
audios[‘count_down’].play()
–游戲結(jié)束
if time_remain < 0: break
count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)
–按鍵檢測(cè)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
hammer.setPosition(pygame.mouse.get_pos())
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
hammer.setHammering()
elif event.type == change_hole_event:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
–碰撞檢測(cè)
if hammer.is_hammering and not mole.is_hammer:
is_hammer = pygame.sprite.collide_mask(hammer, mole)
if is_hammer:
audios[‘hammering’].play()
mole.setBeHammered()
your_score += 10
–分?jǐn)?shù)
your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)
–綁定必要的游戲元素到屏幕(注意順序)
screen.blit(bg_img, (0, 0))
screen.blit(count_down_text, (875, 8))
screen.blit(your_score_text, (800, 430))
mole.draw(screen)
hammer.draw(screen)
–更新
pygame.display.flip()
clock.tick(60)
讀取最佳分?jǐn)?shù)(try塊避免第一次游戲無(wú).rec文件)
try:
best_score = int(open(cfg.RECORD_PATH).read())
except:
best_score = 0
若當(dāng)前分?jǐn)?shù)大于最佳分?jǐn)?shù)則更新最佳分?jǐn)?shù)
if your_score > best_score:
f = open(cfg.RECORD_PATH, ‘w’)
f.write(str(your_score))
f.close()
結(jié)束界面
score_info = {‘your_score’: your_score, ‘best_score’: best_score}
is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
return is_restart
if name == ‘main’:
while True:
is_restart = main()
if not is_restart:
break
3、效果展示
三、滑雪游戲
================================================================
1、代碼部分
導(dǎo)入模塊
import sys
import cfg
import pygame
import random
滑雪者類
class SkierClass(pygame.sprite.Sprite):
def init(self):
pygame.sprite.Sprite.init(self)
滑雪者的朝向(-2到2)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
‘’‘改變滑雪者的朝向. 負(fù)數(shù)為向左,正數(shù)為向右,0為向前’‘’
def turn(self, num):
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
‘’‘移動(dòng)滑雪者’‘’
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
‘’‘設(shè)置為摔倒?fàn)顟B(tài)’‘’
def setFall(self):
self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
‘’‘設(shè)置為站立狀態(tài)’‘’
def setForward(self):
self.direction = 0
self.image = pygame.image.load(self.imagepaths[self.direction])
障礙物類
class ObstacleClass(pygame.sprite.Sprite):
def init(self, img_path, location, attribute):
pygame.sprite.Sprite.init(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
‘’‘移動(dòng)’‘’
def move(self, num):
self.rect.centery = self.location[1] - num
創(chuàng)建障礙物
def createObstacles(s, e, num=10):
obstacles = pygame.sprite.Group()
locations = []
for i in range(num):
row = random.randint(s, e)
col = random.randint(0, 9)
location = [col64+20, row64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
img_path = cfg.OBSTACLE_PATHS[attribute]
obstacle = ObstacleClass(img_path, location, attribute)
obstacles.add(obstacle)
return obstacles
合并障礙物
def AddObstacles(obstacles0, obstacles1):
obstacles = pygame.sprite.Group()
for obstacle in obstacles0:
obstacles.add(obstacle)
for obstacle in obstacles1:
obstacles.add(obstacle)
return obstacles
顯示游戲開(kāi)始界面
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u’滑雪游戲’, True, (255, 0, 0))
content = cfont.render(u’按任意鍵開(kāi)始游戲’, True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
return
pygame.display.update()
顯示分?jǐn)?shù)
def showScore(screen, score, pos=(10, 10)):
font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render(“Score: %s” % score, True, (0, 0, 0))
screen.blit(score_text, pos)
更新當(dāng)前幀的游戲畫面
def updateFrame(screen, obstacles, skier, score):
screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()
主程序
def main():
游戲初始化
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
設(shè)置屏幕
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘滑雪游戲 —— 九歌’)
游戲開(kāi)始界面
ShowStartInterface(screen, cfg.SCREENSIZE)
實(shí)例化游戲精靈
–滑雪者
skier = SkierClass()
–創(chuàng)建障礙物
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)
游戲clock
clock = pygame.time.Clock()
記錄滑雪的距離
distance = 0
記錄當(dāng)前的分?jǐn)?shù)
score = 0
記錄當(dāng)前的速度
speed = [0, 6]
游戲主循環(huán)
while True:
–事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
–更新當(dāng)前游戲幀的數(shù)據(jù)
skier.move()
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
–碰撞檢測(cè)
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == “tree” and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == “flag” and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
–更新屏幕
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
2、完整代碼
import sys
import cfg
import pygame
import random
class SkierClass(pygame.sprite.Sprite):
def init(self):
pygame.sprite.Sprite.init(self)
滑雪者的朝向(-2到2)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
‘’‘改變滑雪者的朝向. 負(fù)數(shù)為向左,正數(shù)為向右,0為向前’‘’
def turn(self, num):
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
‘’‘移動(dòng)滑雪者’‘’
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
‘’‘設(shè)置為摔倒?fàn)顟B(tài)’‘’
def setFall(self):
self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
‘’‘設(shè)置為站立狀態(tài)’‘’
def setForward(self):
self.direction = 0
self.image = pygame.image.load(self.imagepaths[self.direction])
class ObstacleClass(pygame.sprite.Sprite):
def init(self, img_path, location, attribute):
pygame.sprite.Sprite.init(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
‘’‘移動(dòng)’‘’
def move(self, num):
self.rect.centery = self.location[1] - num
def createObstacles(s, e, num=10):
obstacles = pygame.sprite.Group()
locations = []
for i in range(num):
row = random.randint(s, e)
col = random.randint(0, 9)
location = [col64+20, row64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
img_path = cfg.OBSTACLE_PATHS[attribute]
obstacle = ObstacleClass(img_path, location, attribute)
obstacles.add(obstacle)
return obstacles
def AddObstacles(obstacles0, obstacles1):
obstacles = pygame.sprite.Group()
for obstacle in obstacles0:
obstacles.add(obstacle)
for obstacle in obstacles1:
obstacles.add(obstacle)
return obstacles
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u’滑雪游戲’, True, (255, 0, 0))
content = cfont.render(u’按任意鍵開(kāi)始游戲’, True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
return
pygame.display.update()
def showScore(screen, score, pos=(10, 10)):
font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render(“Score: %s” % score, True, (0, 0, 0))
screen.blit(score_text, pos)
def updateFrame(screen, obstacles, skier, score):
screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()
def main():
游戲初始化
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
設(shè)置屏幕
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘滑雪游戲 —— 九歌’)
游戲開(kāi)始界面
ShowStartInterface(screen, cfg.SCREENSIZE)
實(shí)例化游戲精靈
–滑雪者
skier = SkierClass()
–創(chuàng)建障礙物
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)
游戲clock
clock = pygame.time.Clock()
記錄滑雪的距離
distance = 0
記錄當(dāng)前的分?jǐn)?shù)
score = 0
記錄當(dāng)前的速度
speed = [0, 6]
游戲主循環(huán)
while True:
–事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
–更新當(dāng)前游戲幀的數(shù)據(jù)
skier.move()
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
–碰撞檢測(cè)
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == “tree” and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == “flag” and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
–更新屏幕
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
if name == ‘main’:
main();
3、效果展示
四、打乒乓
===============================================================
1、代碼部分
導(dǎo)入模塊
import sys
import cfg
import pygame
from modules import *
定義按鈕
def Button(screen, position, text, button_size=(200, 50)):
left, top = position
bwidth, bheight = button_size
pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
font = pygame.font.Font(cfg.FONTPATH, 30)
text_render = font.render(text, 1, (255, 235, 205))
return screen.blit(text_render, (left+50, top+10))
開(kāi)始界面
def startInterface(screen):
clock = pygame.time.Clock()
while True:
screen.fill((41, 36, 33))
button_1 = Button(screen, (150, 175), ‘1 Player’)
button_2 = Button(screen, (150, 275), ‘2 Player’)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if button_1.collidepoint(pygame.mouse.get_pos()):
return 1
elif button_2.collidepoint(pygame.mouse.get_pos()):
return 2
clock.tick(10)
pygame.display.update()
結(jié)束界面
def endInterface(screen, score_left, score_right):
clock = pygame.time.Clock()
font1 = pygame.font.Font(cfg.FONTPATH, 30)
font2 = pygame.font.Font(cfg.FONTPATH, 20)
msg = ‘Player on left won!’ if score_left > score_right else ‘Player on right won!’
texts = [font1.render(msg, True, cfg.WHITE),
font2.render(‘Press ESCAPE to quit.’, True, cfg.WHITE),
font2.render(‘Press ENTER to continue or play again.’, True, cfg.WHITE)]
positions = [[120, 200], [155, 270], [80, 300]]
while True:
screen.fill((41, 36, 33))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
return
elif event.key == pygame.K_ESCAPE:
sys.exit()
pygame.quit()
for text, pos in zip(texts, positions):
screen.blit(text, pos)
clock.tick(10)
pygame.display.update()
運(yùn)行游戲Demo
def runDemo(screen):
加載游戲素材
hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONTPATH, 50)
開(kāi)始界面
game_mode = startInterface(screen)
游戲主循環(huán)
–左邊球拍(ws控制, 僅雙人模式時(shí)可控制)
score_left = 0
racket_left = Racket(cfg.RACKETPICPATH, ‘LEFT’, cfg)
–右邊球拍(↑↓控制)
score_right = 0
racket_right = Racket(cfg.RACKETPICPATH, ‘RIGHT’, cfg)
–球
ball = Ball(cfg.BALLPICPATH, cfg)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
screen.fill((41, 36, 33))
玩家操作
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
racket_right.move(‘UP’)
elif pressed_keys[pygame.K_DOWN]:
racket_right.move(‘DOWN’)
if game_mode == 2:
if pressed_keys[pygame.K_w]:
racket_left.move(‘UP’)
elif pressed_keys[pygame.K_s]:
racket_left.move(‘DOWN’)
else:
racket_left.automove(ball)
球運(yùn)動(dòng)
scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
score_left += scores[0]
score_right += scores[1]
顯示
–分隔線
pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
–球
ball.draw(screen)
–拍
racket_left.draw(screen)
racket_right.draw(screen)
–得分
screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
if score_left == 11 or score_right == 11:
return score_left, score_right
clock.tick(100)
pygame.display.update()
主函數(shù)
def main():
初始化
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
pygame.display.set_caption(‘pingpong —— 九歌’)
開(kāi)始游戲
while True:
score_left, score_right = runDemo(screen)
endInterface(screen, score_left, score_right)
2、全部代碼
import sys
import cfg
import pygame
from modules import *
def Button(screen, position, text, button_size=(200, 50)):
left, top = position
bwidth, bheight = button_size
pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
font = pygame.font.Font(cfg.FONTPATH, 30)
text_render = font.render(text, 1, (255, 235, 205))
return screen.blit(text_render, (left+50, top+10))
def startInterface(screen):
clock = pygame.time.Clock()
while True:
screen.fill((41, 36, 33))
button_1 = Button(screen, (150, 175), ‘1 Player’)
button_2 = Button(screen, (150, 275), ‘2 Player’)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if button_1.collidepoint(pygame.mouse.get_pos()):
return 1
elif button_2.collidepoint(pygame.mouse.get_pos()):
return 2
clock.tick(10)
pygame.display.update()
def endInterface(screen, score_left, score_right):
clock = pygame.time.Clock()
font1 = pygame.font.Font(cfg.FONTPATH, 30)
font2 = pygame.font.Font(cfg.FONTPATH, 20)
msg = ‘Player on left won!’ if score_left > score_right else ‘Player on right won!’
texts = [font1.render(msg, True, cfg.WHITE),
font2.render(‘Press ESCAPE to quit.’, True, cfg.WHITE),
font2.render(‘Press ENTER to continue or play again.’, True, cfg.WHITE)]
positions = [[120, 200], [155, 270], [80, 300]]
while True:
screen.fill((41, 36, 33))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
return
elif event.key == pygame.K_ESCAPE:
sys.exit()
pygame.quit()
for text, pos in zip(texts, positions):
screen.blit(text, pos)
clock.tick(10)
pygame.display.update()
def runDemo(screen):
加載游戲素材
hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONTPATH, 50)
開(kāi)始界面
game_mode = startInterface(screen)
游戲主循環(huán)
–左邊球拍(ws控制, 僅雙人模式時(shí)可控制)
score_left = 0
racket_left = Racket(cfg.RACKETPICPATH, ‘LEFT’, cfg)
–右邊球拍(↑↓控制)
score_right = 0
racket_right = Racket(cfg.RACKETPICPATH, ‘RIGHT’, cfg)
–球
ball = Ball(cfg.BALLPICPATH, cfg)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
screen.fill((41, 36, 33))
玩家操作
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
racket_right.move(‘UP’)
elif pressed_keys[pygame.K_DOWN]:
racket_right.move(‘DOWN’)
if game_mode == 2:
if pressed_keys[pygame.K_w]:
racket_left.move(‘UP’)
elif pressed_keys[pygame.K_s]:
racket_left.move(‘DOWN’)
else:
racket_left.automove(ball)
球運(yùn)動(dòng)
scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
score_left += scores[0]
score_right += scores[1]
顯示
–分隔線
pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
–球
ball.draw(screen)
–拍
racket_left.draw(screen)
racket_right.draw(screen)
–得分
screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
if score_left == 11 or score_right == 11:
return score_left, score_right
clock.tick(100)
pygame.display.update()
def main():
初始化
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
pygame.display.set_caption(‘pingpong —— 九歌’)
開(kāi)始游戲
while True:
score_left, score_right = runDemo(screen)
endInterface(screen, score_left, score_right)
if name == ‘main’:
main()
3、效果展示
五、吃金幣
===============================================================
1、代碼部分
導(dǎo)入模塊
import os
import cfg
import sys
import pygame
import random
from modules import *
游戲初始化
def initGame():
初始化pygame, 設(shè)置展示窗口
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘catch coins —— 九歌’)
加載必要的游戲素材
game_images = {}
for key, value in cfg.IMAGE_PATHS.items():
if isinstance(value, list):
images = []
for item in value: images.append(pygame.image.load(item))
game_images[key] = images
else:
game_images[key] = pygame.image.load(value)
game_sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
if key == ‘bgm’: continue
game_sounds[key] = pygame.mixer.Sound(value)
返回初始化數(shù)據(jù)
return screen, game_images, game_sounds
主函數(shù)
def main():
初始化
screen, game_images, game_sounds = initGame()
播放背景音樂(lè)
pygame.mixer.music.load(cfg.AUDIO_PATHS[‘bgm’])
pygame.mixer.music.play(-1, 0.0)
字體加載
font = pygame.font.Font(cfg.FONT_PATH, 40)
定義hero
hero = Hero(game_images[‘hero’], position=(375, 520))
定義食物組
food_sprites_group = pygame.sprite.Group()
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
當(dāng)前分?jǐn)?shù)/歷史最高分
score = 0
highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
游戲主循環(huán)
clock = pygame.time.Clock()
while True:
–填充背景
screen.fill(0)
screen.blit(game_images[‘background’], (0, 0))
–倒計(jì)時(shí)信息
countdown_text = 'Count down: ’ + str((90000 - pygame.time.get_ticks()) // 60000) + “:” + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
countdown_text = font.render(countdown_text, True, (0, 0, 0))
countdown_rect = countdown_text.get_rect()
countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
screen.blit(countdown_text, countdown_rect)
–按鍵檢測(cè)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
hero.move(cfg.SCREENSIZE, ‘left’)
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
hero.move(cfg.SCREENSIZE, ‘right’)
–隨機(jī)生成食物
generate_food_count += 1
if generate_food_count > generate_food_freq:
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
food = Food(game_images, random.choice([‘gold’,] * 10 + [‘a(chǎn)pple’]), cfg.SCREENSIZE)
food_sprites_group.add(food)
–更新食物
for food in food_sprites_group:
if food.update(): food_sprites_group.remove(food)
–碰撞檢測(cè)
for food in food_sprites_group:
if pygame.sprite.collide_mask(food, hero):
game_sounds[‘get’].play()
food_sprites_group.remove(food)
score += food.score
if score > highest_score: highest_score = score
–畫hero
hero.draw(screen)
–畫食物
food_sprites_group.draw(screen)
–顯示得分
score_text = f’Score: {score}, Highest: {highest_score}’
score_text = font.render(score_text, True, (0, 0, 0))
score_rect = score_text.get_rect()
score_rect.topleft = [5, 5]
screen.blit(score_text, score_rect)
–判斷游戲是否結(jié)束
if pygame.time.get_ticks() >= 90000:
break
–更新屏幕
pygame.display.flip()
clock.tick(cfg.FPS)
游戲結(jié)束, 記錄最高分并顯示游戲結(jié)束畫面
fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, ‘w’)
fp.write(str(highest_score))
fp.close()
return showEndGameInterface(screen, cfg, score, highest_score)
2、全部代碼
import os
import cfg
import sys
import pygame
import random
from modules import *
def initGame():
初始化pygame, 設(shè)置展示窗口
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘catch coins —— 九歌’)
加載必要的游戲素材
game_images = {}
for key, value in cfg.IMAGE_PATHS.items():
if isinstance(value, list):
images = []
for item in value: images.append(pygame.image.load(item))
game_images[key] = images
else:
game_images[key] = pygame.image.load(value)
game_sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
if key == ‘bgm’: continue
game_sounds[key] = pygame.mixer.Sound(value)
返回初始化數(shù)據(jù)
return screen, game_images, game_sounds
def main():
初始化
screen, game_images, game_sounds = initGame()
播放背景音樂(lè)
pygame.mixer.music.load(cfg.AUDIO_PATHS[‘bgm’])
pygame.mixer.music.play(-1, 0.0)
字體加載
font = pygame.font.Font(cfg.FONT_PATH, 40)
定義hero
hero = Hero(game_images[‘hero’], position=(375, 520))
定義食物組
food_sprites_group = pygame.sprite.Group()
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
當(dāng)前分?jǐn)?shù)/歷史最高分
score = 0
highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
游戲主循環(huán)
clock = pygame.time.Clock()
while True:
–填充背景
screen.fill(0)
screen.blit(game_images[‘background’], (0, 0))
–倒計(jì)時(shí)信息
countdown_text = 'Count down: ’ + str((90000 - pygame.time.get_ticks()) // 60000) + “:” + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
countdown_text = font.render(countdown_text, True, (0, 0, 0))
countdown_rect = countdown_text.get_rect()
countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
screen.blit(countdown_text, countdown_rect)
–按鍵檢測(cè)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
hero.move(cfg.SCREENSIZE, ‘left’)
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
hero.move(cfg.SCREENSIZE, ‘right’)
–隨機(jī)生成食物
generate_food_count += 1
if generate_food_count > generate_food_freq:
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
food = Food(game_images, random.choice([‘gold’,] * 10 + [‘a(chǎn)pple’]), cfg.SCREENSIZE)
food_sprites_group.add(food)
–更新食物
for food in food_sprites_group:
if food.update(): food_sprites_group.remove(food)
–碰撞檢測(cè)
for food in food_sprites_group:
if pygame.sprite.collide_mask(food, hero):
game_sounds[‘get’].play()
food_sprites_group.remove(food)
score += food.score
if score > highest_score: highest_score = score
–畫hero
hero.draw(screen)
–畫食物
food_sprites_group.draw(screen)
–顯示得分
score_text = f’Score: {score}, Highest: {highest_score}’
score_text = font.render(score_text, True, (0, 0, 0))
score_rect = score_text.get_rect()
score_rect.topleft = [5, 5]
screen.blit(score_text, score_rect)
–判斷游戲是否結(jié)束
if pygame.time.get_ticks() >= 90000:
break
–更新屏幕
pygame.display.flip()
clock.tick(cfg.FPS)
游戲結(jié)束, 記錄最高分并顯示游戲結(jié)束畫面
fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, ‘w’)
fp.write(str(highest_score))
fp.close()
return showEndGameInterface(screen, cfg, score, highest_score)
if name == ‘main’:
while main():
pass
3、效果展示
六、消消樂(lè)
===============================================================
1、代碼部分
模塊導(dǎo)入
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)Python工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年P(guān)ython開(kāi)發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Python開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加V獲?。簐ip1024c (備注Python)
如果你也是看準(zhǔn)了Python,想自學(xué)Python,在這里為大家準(zhǔn)備了豐厚的免費(fèi)學(xué)習(xí)大禮包,帶大家一起學(xué)習(xí),給大家剖析Python兼職、就業(yè)行情前景的這些事兒。
一、Python所有方向的學(xué)習(xí)路線
Python所有方向路線就是把Python常用的技術(shù)點(diǎn)做整理,形成各個(gè)領(lǐng)域的知識(shí)點(diǎn)匯總,它的用處就在于,你可以按照上面的知識(shí)點(diǎn)去找對(duì)應(yīng)的學(xué)習(xí)資源,保證自己學(xué)得較為全面。
二、學(xué)習(xí)軟件
工欲善其必先利其器。學(xué)習(xí)Python常用的開(kāi)發(fā)軟件都在這里了,給大家節(jié)省了很多時(shí)間。
三、全套PDF電子書
書籍的好處就在于權(quán)威和體系健全,剛開(kāi)始學(xué)習(xí)的時(shí)候你可以只看視頻或者聽(tīng)某個(gè)人講課,但等你學(xué)完之后,你覺(jué)得你掌握了,這時(shí)候建議還是得去看一下書籍,看權(quán)威技術(shù)書籍也是每個(gè)程序員必經(jīng)之路。
四、入門學(xué)習(xí)視頻
我們?cè)诳匆曨l學(xué)習(xí)的時(shí)候,不能光動(dòng)眼動(dòng)腦不動(dòng)手,比較科學(xué)的學(xué)習(xí)方法是在理解之后運(yùn)用它們,這時(shí)候練手項(xiàng)目就很適合了。
四、實(shí)戰(zhàn)案例
光學(xué)理論是沒(méi)用的,要學(xué)會(huì)跟著一起敲,要?jiǎng)邮謱?shí)操,才能將自己的所學(xué)運(yùn)用到實(shí)際當(dāng)中去,這時(shí)候可以搞點(diǎn)實(shí)戰(zhàn)案例來(lái)學(xué)習(xí)。
五、面試資料
我們學(xué)習(xí)Python必然是為了找到高薪的工作,下面這些面試題是來(lái)自阿里、騰訊、字節(jié)等一線互聯(lián)網(wǎng)大廠最新的面試資料,并且有阿里大佬給出了權(quán)威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857567.html
成為一個(gè)Python程序員專家或許需要花費(fèi)數(shù)年時(shí)間,但是打下堅(jiān)實(shí)的基礎(chǔ)只要幾周就可以,如果你按照我提供的學(xué)習(xí)路線以及資料有意識(shí)地去實(shí)踐,你就有很大可能成功!
最后祝你好運(yùn)!??!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857567.html
編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。**
深知大多數(shù)Python工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年P(guān)ython開(kāi)發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
[外鏈圖片轉(zhuǎn)存中…(img-HOeFAc6r-1711810628186)]
[外鏈圖片轉(zhuǎn)存中…(img-vYtTNCve-1711810628187)]
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Python開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加V獲取:vip1024c (備注Python)
[外鏈圖片轉(zhuǎn)存中…(img-8jGs2ksI-1711810628187)]
如果你也是看準(zhǔn)了Python,想自學(xué)Python,在這里為大家準(zhǔn)備了豐厚的免費(fèi)學(xué)習(xí)大禮包,帶大家一起學(xué)習(xí),給大家剖析Python兼職、就業(yè)行情前景的這些事兒。
一、Python所有方向的學(xué)習(xí)路線
Python所有方向路線就是把Python常用的技術(shù)點(diǎn)做整理,形成各個(gè)領(lǐng)域的知識(shí)點(diǎn)匯總,它的用處就在于,你可以按照上面的知識(shí)點(diǎn)去找對(duì)應(yīng)的學(xué)習(xí)資源,保證自己學(xué)得較為全面。
二、學(xué)習(xí)軟件
工欲善其必先利其器。學(xué)習(xí)Python常用的開(kāi)發(fā)軟件都在這里了,給大家節(jié)省了很多時(shí)間。
三、全套PDF電子書
書籍的好處就在于權(quán)威和體系健全,剛開(kāi)始學(xué)習(xí)的時(shí)候你可以只看視頻或者聽(tīng)某個(gè)人講課,但等你學(xué)完之后,你覺(jué)得你掌握了,這時(shí)候建議還是得去看一下書籍,看權(quán)威技術(shù)書籍也是每個(gè)程序員必經(jīng)之路。
四、入門學(xué)習(xí)視頻
我們?cè)诳匆曨l學(xué)習(xí)的時(shí)候,不能光動(dòng)眼動(dòng)腦不動(dòng)手,比較科學(xué)的學(xué)習(xí)方法是在理解之后運(yùn)用它們,這時(shí)候練手項(xiàng)目就很適合了。
四、實(shí)戰(zhàn)案例
光學(xué)理論是沒(méi)用的,要學(xué)會(huì)跟著一起敲,要?jiǎng)邮謱?shí)操,才能將自己的所學(xué)運(yùn)用到實(shí)際當(dāng)中去,這時(shí)候可以搞點(diǎn)實(shí)戰(zhàn)案例來(lái)學(xué)習(xí)。
五、面試資料
我們學(xué)習(xí)Python必然是為了找到高薪的工作,下面這些面試題是來(lái)自阿里、騰訊、字節(jié)等一線互聯(lián)網(wǎng)大廠最新的面試資料,并且有阿里大佬給出了權(quán)威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
成為一個(gè)Python程序員專家或許需要花費(fèi)數(shù)年時(shí)間,但是打下堅(jiān)實(shí)的基礎(chǔ)只要幾周就可以,如果你按照我提供的學(xué)習(xí)路線以及資料有意識(shí)地去實(shí)踐,你就有很大可能成功!
最后祝你好運(yùn)?。?!
到了這里,關(guān)于【pygame游戲開(kāi)發(fā)】這幾個(gè)經(jīng)典游戲,小紅書Python面試題目的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!