30个Python小游戏,上班摸鱼我能玩一天【内附源码,最新美团点评HarmonyOS鸿蒙团队面试题

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)

设置屏幕

screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘滑雪游戏 —— 九歌’)

游戏开始界面

ShowStartInterface(screen, cfg.SCREENSIZE)

实例化游戏精灵

–滑雪者

skier = SkierClass()

–创建障碍物

obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)

游戏clock

clock = pygame.time.Clock()

记录滑雪的距离

distance = 0

记录当前的分数

score = 0

记录当前的速度

speed = [0, 6]

游戏主循环

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)

–更新当前游戏帧的数据

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)

–碰撞检测

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)

‘’‘run’‘’
if name == ‘main’:
main();

4、并夕夕版飞机大战

源码分享:

import sys
import cfg
import pygame
from modules import *

‘’‘游戏界面’‘’
def GamingInterface(num_player, screen):

初始化

pygame.mixer.music.load(cfg.SOUNDPATHS[‘Cool Space Music’])
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS[‘boom’])
fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS[‘shot’])
font = pygame.font.Font(cfg.FONTPATH, 20)

游戏背景图

bg_imgs = [cfg.IMAGEPATHS[‘bg_big’], cfg.IMAGEPATHS[‘seamless_space’], cfg.IMAGEPATHS[‘space3’]]
bg_move_dis = 0
bg_1 = pygame.image.load(bg_imgs[0]).convert()
bg_2 = pygame.image.load(bg_imgs[1]).convert()
bg_3 = pygame.image.load(bg_imgs[2]).convert()

玩家, 子弹和小行星精灵组

player_group = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
asteroid_group = pygame.sprite.Group()

产生小行星的时间间隔

asteroid_ticks = 90
for i in range(num_player):
player_group.add(Ship(i+1, cfg))
clock = pygame.time.Clock()

分数

score_1, score_2 = 0, 0

游戏主循环

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

–玩家一: ↑↓←→控制, j射击; 玩家二: wsad控制, 空格射击

pressed_keys = pygame.key.get_pressed()
for idx, player in enumerate(player_group):
direction = None
if idx == 0:
if pressed_keys[pygame.K_UP]:
direction = ‘up’
elif pressed_keys[pygame.K_DOWN]:
direction = ‘down’
elif pressed_keys[pygame.K_LEFT]:
direction = ‘left’
elif pressed_keys[pygame.K_RIGHT]:
direction = ‘right’
if direction:
player.move(direction)
if pressed_keys[pygame.K_j]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
elif idx == 1:
if pressed_keys[pygame.K_w]:
direction = ‘up’
elif pressed_keys[pygame.K_s]:
direction = ‘down’
elif pressed_keys[pygame.K_a]:
direction = ‘left’
elif pressed_keys[pygame.K_d]:
direction = ‘right’
if direction:
player.move(direction)
if pressed_keys[pygame.K_SPACE]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
if player.cooling_time > 0:
player.cooling_time -= 1
if (score_1 + score_2) < 500:
background = bg_1
elif (score_1 + score_2) < 1500:
background = bg_2
else:
background = bg_3

–向下移动背景图实现飞船向上移动的效果

screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
screen.blit(background, (0, bg_move_dis))
bg_move_dis = (bg_move_dis + 2) % background.get_rect().height

–生成小行星

if asteroid_ticks == 0:
asteroid_ticks = 90
asteroid_group.add(Asteroid(cfg))
else:
asteroid_ticks -= 1

–画飞船

for player in player_group:
if pygame.sprite.spritecollide(player, asteroid_group, True, None):
player.explode_step = 1
explosion_sound.play()
elif player.explode_step > 0:
if player.explode_step > 3:
player_group.remove(player)
if len(player_group) == 0:
return
else:
player.explode(screen)
else:
player.draw(screen)

–画子弹

for bullet in bullet_group:
bullet.move()
if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
bullet_group.remove(bullet)
if bullet.player_idx == 1:
score_1 += 1
else:
score_2 += 1
else:
bullet.draw(screen)

–画小行星

for asteroid in asteroid_group:
asteroid.move()
asteroid.rotate()
asteroid.draw(screen)

–显示分数

score_1_text = ‘玩家一得分: %s’ % score_1
score_2_text = ‘玩家二得分: %s’ % score_2
text_1 = font.render(score_1_text, True, (0, 0, 255))
text_2 = font.render(score_2_text, True, (255, 0, 0))
screen.blit(text_1, (2, 5))
screen.blit(text_2, (2, 35))

–屏幕刷新

pygame.display.update()
clock.tick(60)

‘’‘主函数’‘’
def main():
pygame.init()
pygame.font.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘飞机大战 —— 九歌’)
num_player = StartInterface(screen, cfg)
if num_player == 1:
while True:
GamingInterface(num_player=1, screen=screen)
EndInterface(screen, cfg)
else:
while True:
GamingInterface(num_player=2, screen=screen)
EndInterface(screen, cfg)

‘’‘run’‘’
if name == ‘main’:
main()

5、打地鼠

源码分享:

import cfg
import sys
import pygame
import random
from modules import *

‘’‘游戏初始化’‘’
def initGame():
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘打地鼠 —— 九歌’)
return screen

‘’‘主函数’‘’
def main():

初始化

screen = initGame()

加载背景音乐和其他音效

pygame.mixer.music.load(cfg.BGM_PATH)
pygame.mixer.music.play(-1)
audios = {
‘count_down’: pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
‘hammering’: pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
}

加载字体

font = pygame.font.Font(cfg.FONT_PATH, 40)

加载背景图片

bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)

开始界面

startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)

地鼠改变位置的计时

hole_pos = random.choice(cfg.HOLE_POSITIONS)
change_hole_event = pygame.USEREVENT
pygame.time.set_timer(change_hole_event, 800)

地鼠

mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)

锤子

hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))

时钟

clock = pygame.time.Clock()

分数

your_score = 0
flag = False

初始时间

init_time = pygame.time.get_ticks()

游戏主循环

while True:

–游戏时间为60s

time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)

–游戏时间减少, 地鼠变位置速度变快

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

–倒计时音效

if time_remain == 10:
audios[‘count_down’].play()

–游戏结束

if time_remain < 0: break
count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)

–按键检测

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)

–碰撞检测

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

–分数

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)

读取最佳分数(try块避免第一次游戏无.rec文件)

try:
best_score = int(open(cfg.RECORD_PATH).read())
except:
best_score = 0

若当前分数大于最佳分数则更新最佳分数

if your_score > best_score:
f = open(cfg.RECORD_PATH, ‘w’)
f.write(str(your_score))
f.close()

结束界面

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

‘’‘run’‘’
if name == ‘main’:
while True:
is_restart = main()
if not is_restart:
break

简简单单

【简单介绍一下玩法+附源码】

6、小恐龙

玩法:上下控制起跳躲避

源码分享:

import cfg
import sys
import random
import pygame
from modules import *

‘’‘main’‘’
def main(highest_score):

游戏初始化

pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘九歌’)

导入所有声音文件

sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
sounds[key] = pygame.mixer.Sound(value)

游戏开始界面

GameStartInterface(screen, sounds, cfg)

定义一些游戏中必要的元素和变量

score = 0
score_board = Scoreboard(cfg.IMAGE_PATHS[‘numbers’], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)
highest_score = highest_score
highest_score_board = Scoreboard(cfg.IMAGE_PATHS[‘numbers’], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)
dino = Dinosaur(cfg.IMAGE_PATHS[‘dino’])
ground = Ground(cfg.IMAGE_PATHS[‘ground’], position=(0, cfg.SCREENSIZE[1]))
cloud_sprites_group = pygame.sprite.Group()
cactus_sprites_group = pygame.sprite.Group()
ptera_sprites_group = pygame.sprite.Group()
add_obstacle_timer = 0
score_timer = 0

游戏主循环

clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
dino.jump(sounds)
elif event.key == pygame.K_DOWN:
dino.duck()
elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
dino.unduck()
screen.fill(cfg.BACKGROUND_COLOR)

–随机添加云

if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:
cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS[‘cloud’], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))

–随机添加仙人掌/飞龙

add_obstacle_timer += 1
if add_obstacle_timer > random.randrange(50, 150):
add_obstacle_timer = 0
random_value = random.randrange(0, 10)
if random_value >= 5 and random_value <= 7:
cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS[‘cacti’]))
else:
position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]
ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS[‘ptera’], position=(600, random.choice(position_ys))))

–更新游戏元素

dino.update()
ground.update()
cloud_sprites_group.update()
cactus_sprites_group.update()
ptera_sprites_group.update()
score_timer += 1
if score_timer > (cfg.FPS//12):
score_timer = 0
score += 1
score = min(score, 99999)
if score > highest_score:
highest_score = score
if score % 100 == 0:
sounds[‘point’].play()
if score % 1000 == 0:
ground.speed -= 1
for item in cloud_sprites_group:
item.speed -= 1
for item in cactus_sprites_group:
item.speed -= 1
for item in ptera_sprites_group:
item.speed -= 1

–碰撞检测

for item in cactus_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
for item in ptera_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)

–将游戏元素画到屏幕上

dino.draw(screen)
ground.draw(screen)
cloud_sprites_group.draw(screen)
cactus_sprites_group.draw(screen)
ptera_sprites_group.draw(screen)
score_board.set(score)
highest_score_board.set(highest_score)
score_board.draw(screen)
highest_score_board.draw(screen)

–更新屏幕

pygame.display.update()
clock.tick(cfg.FPS)

–游戏是否结束

if dino.is_dead:
break

游戏结束界面

return GameEndInterface(screen, cfg), highest_score

‘’‘run’‘’
if name == ‘main’:
highest_score = 0
while True:
flag, highest_score = main(highest_score)
if not flag: break

7、消消乐

玩法:三个相连就能消除

源码分享:

import os
import sys
import cfg
import pygame
from modules import *

‘’‘游戏主程序’‘’
def main():
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘Gemgem —— 九歌’)

加载背景音乐

pygame.mixer.init()
pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, “resources/audios/bg.mp3”))
pygame.mixer.music.set_volume(0.6)
pygame.mixer.music.play(-1)

加载音效

sounds = {}
sounds[‘mismatch’] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, ‘resources/audios/badswap.wav’))
sounds[‘match’] = []
for i in range(6):
sounds[‘match’].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, ‘resources/audios/match%s.wav’ % i)))

加载字体

font = pygame.font.Font(os.path.join(cfg.ROOTDIR, ‘resources/font/font.TTF’), 25)

图片加载

gem_imgs = []
for i in range(1, 8):
gem_imgs.append(os.path.join(cfg.ROOTDIR, ‘resources/images/gem%s.png’ % i))

主循环

game = gemGame(screen, sounds, font, gem_imgs, cfg)
while True:
score = game.start()
flag = False

一轮游戏结束后玩家选择重玩或者退出

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
pygame.quit()
sys.exit()
elif event.type == pygame.KEYUP and event.key == pygame.K_r:
flag = True
if flag:
break
screen.fill((135, 206, 235))
text0 = ‘Final score: %s’ % score
text1 = ‘Press to restart the game.’
text2 = ‘Press to quit the game.’
y = 150
for idx, text in enumerate([text0, text1, text2]):
text_render = font.render(text, 1, (85, 65, 0))
rect = text_render.get_rect()
if idx == 0:
rect.left, rect.top = (212, y)
elif idx == 1:
rect.left, rect.top = (122.5, y)
else:
rect.left, rect.top = (126.5, y)
y += 100
screen.blit(text_render, rect)
pygame.display.update()
game.reset()

‘’‘run’‘’
if name == ‘main’:
main()

8、俄罗斯方块

玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。

源码分享:

import os
import sys
import random
from modules import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

‘’‘定义俄罗斯方块游戏类’‘’
class TetrisGame(QMainWindow):
def init(self, parent=None):
super(TetrisGame, self).init(parent)

是否暂停ing

self.is_paused = False

是否开始ing

self.is_started = False
self.initUI()
‘’‘界面初始化’‘’
def initUI(self):

icon

self.setWindowIcon(QIcon(os.path.join(os.getcwd(), ‘resources/icon.jpg’)))

块大小

self.grid_size = 22

游戏帧率

self.fps = 200
self.timer = QBasicTimer()

焦点

self.setFocusPolicy(Qt.StrongFocus)

水平布局

layout_horizontal = QHBoxLayout()
self.inner_board = InnerBoard()
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.external_board)
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.side_panel)
self.status_bar = self.statusBar()
self.external_board.score_signal[str].connect(self.status_bar.showMessage)
self.start()
self.center()
self.setWindowTitle(‘Tetris —— 九歌’)
self.show()
self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
‘’‘游戏界面移动到屏幕中间’‘’
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
‘’‘更新界面’‘’
def updateWindow(self):
self.external_board.updateData()
self.side_panel.updateData()
self.update()
‘’‘开始’‘’
def start(self):
if self.is_started:
return
self.is_started = True
self.inner_board.createNewTetris()
self.timer.start(self.fps, self)
‘’‘暂停/不暂停’‘’
def pause(self):
if not self.is_started:
return
self.is_paused = not self.is_paused
if self.is_paused:
self.timer.stop()
self.external_board.score_signal.emit(‘Paused’)
else:
self.timer.start(self.fps, self)
self.updateWindow()
‘’‘计时器事件’‘’
def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
removed_lines = self.inner_board.moveDown()
self.external_board.score += removed_lines
self.updateWindow()
else:
super(TetrisGame, self).timerEvent(event)
‘’‘按键事件’‘’
def keyPressEvent(self, event):
if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
super(TetrisGame, self).keyPressEvent(event)
return
key = event.key()

P键暂停

if key == Qt.Key_P:
self.pause()
return
if self.is_paused:
return

向左

elif key == Qt.Key_Left:
self.inner_board.moveLeft()

向右

elif key == Qt.Key_Right:
self.inner_board.moveRight()

旋转

elif key == Qt.Key_Up:
self.inner_board.rotateAnticlockwise()

快速坠落

elif key == Qt.Key_Space:
self.external_board.score += self.inner_board.dropDown()
else:
super(TetrisGame, self).keyPressEvent(event)
self.updateWindow()

‘’‘run’‘’
if name == ‘main’:
app = QApplication([])
tetris = TetrisGame()
sys.exit(app.exec_())

9、贪吃蛇

玩法:童年经典,普通魔术也没啥意思,小时候玩的也是加速的。

源码分享:

import cfg
import sys
import pygame
from modules import *

‘’‘主函数’‘’
def main(cfg):

游戏初始化

pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(‘Greedy Snake —— 九歌’)
clock = pygame.time.Clock()

播放背景音乐

pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1)

游戏主循环

snake = Snake(cfg)
apple = Apple(cfg, snake.coords)
score = 0
while True:
screen.fill(cfg.BLACK)

–按键检测

for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
snake.setDirection({pygame.K_UP: ‘up’, pygame.K_DOWN: ‘down’, pygame.K_LEFT: ‘left’, pygame.K_RIGHT: ‘right’}[event.key])

–更新贪吃蛇和食物

if snake.update(apple):
apple = Apple(cfg, snake.coords)
score += 1

–判断游戏是否结束

if snake.isgameover: break

–显示游戏里必要的元素

drawGameGrid(cfg, screen)
snake.draw(screen)
apple.draw(screen)
showScore(cfg, score, screen)

–屏幕更新

pygame.display.update()
clock.tick(cfg.FPS)
return endInterface(screen, cfg)

‘’‘run’‘’
if name == ‘main’:
while True:
if not main(cfg):
break

普普通通

【玩法详细介绍+源码】

CFG配置文件就在文末

10、24点小游戏

玩法:通过加减乘除操作,小学生都没问题的。

源码分享:

import os
import sys
import pygame
from cfg import *
from modules import *
from fractions import Fraction

‘’‘检查控件是否被点击’‘’
def checkClicked(group, mouse_pos, group_type=‘NUMBER’):
selected = []

数字卡片/运算符卡片

if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
max_selected = 2 if group_type == GROUPTYPES[0] else 1
num_selected = 0
for each in group:
num_selected += int(each.is_selected)
for each in group:
if each.rect.collidepoint(mouse_pos):
if each.is_selected:
each.is_selected = not each.is_selected
num_selected -= 1
each.select_order = None
else:
if num_selected < max_selected:
each.is_selected = not each.is_selected
num_selected += 1
each.select_order = str(num_selected)
if each.is_selected:
selected.append(each.attribute)

按钮卡片

elif group_type == GROUPTYPES[2]:
for each in group:
if each.rect.collidepoint(mouse_pos):
each.is_selected = True
selected.append(each.attribute)

抛出异常

else:
raise ValueError(‘checkClicked.group_type unsupport %s, expect %s, %s or %s…’ % (group_type, *GROUPTYPES))
return selected

‘’‘获取数字精灵组’‘’
def getNumberSpritesGroup(numbers):
number_sprites_group = pygame.sprite.Group()
for idx, number in enumerate(numbers):
args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
number_sprites_group.add(Card(*args))
return number_sprites_group

‘’‘获取运算符精灵组’‘’
def getOperatorSpritesGroup(operators):
operator_sprites_group = pygame.sprite.Group()
for idx, operator in enumerate(operators):
args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
operator_sprites_group.add(Card(*args))
return operator_sprites_group

‘’‘获取按钮精灵组’‘’
def getButtonSpritesGroup(buttons):
button_sprites_group = pygame.sprite.Group()
for idx, button in enumerate(buttons):
args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
button_sprites_group.add(Button(*args))
return button_sprites_group

‘’‘计算’‘’
def calculate(number1, number2, operator):
operator_map = {‘+’: ‘+’, ‘-’: ‘-’, ‘×’: ‘*’, ‘÷’: ‘/’}
try:
result = str(eval(number1+operator_map[operator]+number2))
return result if ‘.’ not in result else str(Fraction(number1+operator_map[operator]+number2))
except:
return None

‘’‘在屏幕上显示信息’‘’
def showInfo(text, screen):
rect = pygame.Rect(200, 180, 400, 200)
pygame.draw.rect(screen, PAPAYAWHIP, rect)
font = pygame.font.Font(FONTPATH, 40)
text_render = font.render(text, True, BLACK)
font_size = font.size(text)
screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))

‘’‘主函数’‘’
def main():

初始化, 导入必要的游戏素材

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption(‘24 point —— 九歌’)
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
pygame.mixer.music.load(BGMPATH)
pygame.mixer.music.play(-1, 0.0)

24点游戏生成器

game24_gen = game24Generator()
game24_gen.generate()

精灵组

–数字

number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)

–运算符

operator_sprites_group = getOperatorSpritesGroup(OPREATORS)

–按钮

button_sprites_group = getButtonSpritesGroup(BUTTONS)

游戏主循环

clock = pygame.time.Clock()
selected_numbers = []
selected_operators = []
selected_buttons = []
is_win = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
elif event.type == pygame.MOUSEBUTTONUP:
mouse_pos = pygame.mouse.get_pos()
selected_numbers = checkClicked(number_sprites_group, mouse_pos, ‘NUMBER’)
selected_operators = checkClicked(operator_sprites_group, mouse_pos, ‘OPREATOR’)
selected_buttons = checkClicked(button_sprites_group, mouse_pos, ‘BUTTON’)
screen.fill(AZURE)

更新数字

if len(selected_numbers) == 2 and len(selected_operators) == 1:
noselected_numbers = []
for each in number_sprites_group:
if each.is_selected:
if each.select_order == ‘1’:
selected_number1 = each.attribute
elif each.select_order == ‘2’:
selected_number2 = each.attribute
else:
raise ValueError(‘Unknow select_order %s, expect 1 or 2…’ % each.select_order)
else:
noselected_numbers.append(each.attribute)
each.is_selected = False
for each in operator_sprites_group:
each.is_selected = False
result = calculate(selected_number1, selected_number2, *selected_operators)
if result is not None:
game24_gen.numbers_now = noselected_numbers + [result]
is_win = game24_gen.check()
if is_win:
win_sound.play()
if not is_win and len(game24_gen.numbers_now) == 1:
lose_sound.play()
else:
warn_sound.play()
selected_numbers = []
selected_operators = []
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)

精灵都画到screen上

for each in number_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in operator_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in button_sprites_group:
if selected_buttons and selected_buttons[0] in [‘RESET’, ‘NEXT’]:
is_win = False
if selected_buttons and each.attribute == selected_buttons[0]:
each.is_selected = False
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
selected_buttons = []
each.draw(screen, pygame.mouse.get_pos())

游戏胜利

if is_win:
showInfo(‘Congratulations’, screen)

游戏失败

if not is_win and len(game24_gen.numbers_now) == 1:
showInfo(‘Game Over’, screen)
pygame.display.flip()
clock.tick(30)

‘’‘run’‘’
if name == ‘main’:
main()

11、平衡木

玩法:也是小时候的经典游戏,控制左右就行,到后面才有一点点难度。

源码分享:

import cfg
from modules import breakoutClone

‘’‘主函数’‘’
def main():
game = breakoutClone(cfg)
game.run()

‘’‘run’‘’
if name == ‘main’:
main()

还有配置文件

12、外星人入侵

玩法:这让我想起了魂斗罗那第几关的boss,有点类似,不过魂斗罗那个难度肯定高点。

源码分享:

import os
import sys
import cfg
import random
import pygame
from modules import *

‘’‘开始游戏’‘’
def startGame(screen):
clock = pygame.time.Clock()

加载字体

font = pygame.font.SysFont(‘arial’, 18)
if not os.path.isfile(‘score’):
f = open(‘score’, ‘w’)
f.write(‘0’)
f.close()
with open(‘score’, ‘r’) as f:
highest_score = int(f.read().strip())

敌方

enemies_group = pygame.sprite.Group()
for i in range(55):
if i < 11:
enemy = enemySprite(‘small’, i, cfg.WHITE, cfg.WHITE)
elif i < 33:
enemy = enemySprite(‘medium’, i, cfg.WHITE, cfg.WHITE)
else:
enemy = enemySprite(‘large’, i, cfg.WHITE, cfg.WHITE)
enemy.rect.x = 85 + (i % 11) * 50
enemy.rect.y = 120 + (i // 11) * 45
enemies_group.add(enemy)
boomed_enemies_group = pygame.sprite.Group()
en_bullets_group = pygame.sprite.Group()
ufo = ufoSprite(color=cfg.RED)

我方

myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
my_bullets_group = pygame.sprite.Group()

用于控制敌方位置更新

–移动一行

enemy_move_count = 24
enemy_move_interval = 24
enemy_move_flag = False

–改变移动方向(改变方向的同时集体下降一次)

enemy_change_direction_count = 0
enemy_change_direction_interval = 60
enemy_need_down = False
enemy_move_right = True
enemy_need_move_row = 6
enemy_max_row = 5

用于控制敌方发射子弹

enemy_shot_interval = 100
enemy_shot_count = 0
enemy_shot_flag = False

游戏进行中

running = True
is_win = False

主循环

while running:
screen.fill(cfg.BLACK)
for event in pygame.event.get():

–点右上角的X或者按Esc键退出游戏

if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()

–射击

if event.type == pygame.MOUSEBUTTONDOWN:
my_bullet = myaircraft.shot()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

emy_shot_interval = 100
enemy_shot_count = 0
enemy_shot_flag = False

游戏进行中

running = True
is_win = False

主循环

while running:
screen.fill(cfg.BLACK)
for event in pygame.event.get():

–点右上角的X或者按Esc键退出游戏

if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()

–射击

if event.type == pygame.MOUSEBUTTONDOWN:
my_bullet = myaircraft.shot()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-oFdwqUsV-1712638150090)]
[外链图片转存中…(img-GIJOGzty-1712638150091)]
[外链图片转存中…(img-eVX3JNSi-1712638150091)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
[外链图片转存中…(img-KujOzQN1-1712638150091)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值