import sys
import time
import random
import pygame
from config import *
'''拼图精灵类'''
class gemSprite(pygame.sprite.Sprite):
def __init__(self, img_path, size, position, downlen, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(img_path)
self.image = pygame.transform.smoothscale(self.image, size)
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.downlen = downlen
self.target_x = position[0]
self.target_y = position[1] + downlen
self.type = img_path.split('/')[-1].split('.')[0]
self.fixed = False
self.speed_x = 10
self.speed_y = 10
self.direction = 'down'
'''拼图块移动'''
def move(self):
if self.direction == 'down':
self.rect.top = min(self.target_y, self.rect.top+self.speed_y)
if self.target_y == self.rect.top:
self.fixed = True
elif self.direction == 'up':
self.rect.top = max(self.target_y, self.rect.top-self.speed_y)
if self.target_y == self.rect.top:
self.fixed = True
elif self.direction == 'left':
self.rect.left = max(self.target_x, self.rect.left-self.speed_x)
if self.target_x == self.rect.left:
self.fixed = True
elif self.direction == 'right':
self.rect.left = min(self.target_x, self.rect.left+self.speed_x)
if self.target_x == self.rect.left:
self.fixed = True
'''获取坐标'''
def getPosition(self):
return self.rect.left, self.rect.top
'''设置坐标'''
def setPosition(self, position):
self.rect.left, self.rect.top = position
'''游戏类'''
class gemGame():
def __init__(self, screen, sounds, font, gem_imgs, **kwargs):
self.info = 'Gemgem-微信公众号:Charles的皮卡丘'
self.screen = screen
self.sounds = sounds
self.font = font
self.gem_imgs = gem_imgs
self.reset()
'''开始游戏'''
def start(self):
clock = pygame.time.Clock()
# 遍历整个游戏界面更新位置
overall_moving = True
# 指定某些对象个体更新位置
individual_moving = False
# 定义一些必要的变量
gem_selected_xy = None
gem_selected_xy2 = None
swap_again = False
add_score = 0
add_score_showtimes = 10
time_pre = int(time.time())
# 游戏主循环
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.MOUSEBUTTONUP:
if (not overall_moving) and (not individual_moving) and (not add_score):
position = pygame.mouse.get_pos()
if gem_selected_xy is None:
gem_selected_xy = self.checkSelected(position)
else:
gem_selected_xy2 = self.checkSelected(position)
if gem_selected_xy2:
if self.swapGem(gem_selected_xy, gem_selected_xy2):
individual_moving = True
swap_again = False
else:
gem_selected_xy = None
if overall_moving:
overall_moving = not self.dropGems(0, 0)
# 移动一次可能可以拼出多个3连块
if not overall_moving:
res_match = self.isMatch()
add_score = self.removeMatched(res_match)
if add_score > 0:
overall_moving = True
if individual_moving:
gem1 = self.getGemByPos(*gem_selected_xy)
gem2 = self.getGemByPos(*gem_selected_xy2)
gem1.move()
gem2.move()
if gem1.fixed and gem2.fixed:
res_match = self.isMatch()
if res_match[0] == 0 and not swap_again:
swap_again = True
self.swapGem(gem_selected_xy, gem_selected_xy2)
self.sounds['mismatch'].play()
else:
add_score = self.removeMatched(res_match)
overall_moving = True
individual_moving = False
gem_selected_xy = None
gem_selected_xy2 = None
self.screen.fill((135, 206, 235))
self.drawGrids()
self.gems_group.draw(self.screen)
if gem_selected_xy:
self.drawBlock(self.getGemByPos(*gem_selected_xy).rect)
if add_score:
if add_score_showtimes == 10:
random.choice(self.sounds['match']).play()
self.drawAddScore(add_score)
add_score_showtimes -= 1
if add_score_showtimes < 1:
add_score_showtimes = 10
add_score = 0
self.remaining_time -= (int(time.time()) - time_pre)
time_pre = int(time.time())
self.showRemainingTime()
self.drawScore()
if self.remaining_time <= 0:
return self.score
pygame.display.update()
clock.tick(FPS)
'''初始化'''
def reset(self):
# 随机生成各个块(即初始化游戏地图各个元素)
while True:
self.all_gems = []
self.gems_group = pygame.sprite.Group()
for x in range(NUMGRID):
self.all_gems.append([])
for y in range(NUMGRID):
gem = gemSprite(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE], downlen=NUMGRID*GRIDSIZE)
self.all_gems[x].append(gem)
self.gems_group.add(gem)
if self.isMatch()[0] == 0:
break
# 得分
self.score = 0
# 拼出一个的奖励
self.reward = 10
# 时间
self.remaining_time = 300
'''显示剩余时间'''
def showRemainingTime(self):
remaining_time_render = self.font.render('CountDown: %ss' % str(self.remaining_time), 1, (85, 65, 0))
rect = remaining_time_render.get_rect()
rect.left, rect.top = (WIDTH-201, 6)
self.screen.blit(remaining_time_render, rect)
'''显示得分'''
def drawScore(self):
score_render = self.font.render('SCORE:'+str(self.score), 1, (85, 65, 0))
rect = score_render.get_rect()
rect.left, rect.top = (10, 6)
self.screen.blit(score_render, rect)
'''显示加分'''
def drawAddScore(self, add_score):
score_render = self.font.render('+'+str(add_score), 1, (255, 100, 100))
rect = score_render.get_rect()
rect.left, rect.top = (250, 250)
self.screen.blit(score_render, rect)
'''生成新的拼图块'''
def generateNewGems(self, res_match):
if res_match[0] == 1:
start = res_match[2]
while start > -2:
for each in [res_match[1], res_match[1]+1, res_match[1]+2]:
gem = self.getGemByPos(*[each, start])
if start == res_match[2]:
self.gems_group.remove(gem)
self.all_gems[each][start] = None
elif start >= 0:
gem.target_y += GRIDSIZE
gem.fixed = False
gem.direction = 'down'
self.all_gems[each][start+1] = gem
else:
gem = gemSprite(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+each*GRIDSIZE, YMARGIN-GRIDSIZE], downlen=GRIDSIZE)
self.gems_group.add(gem)
self.all_gems[each][start+1] = gem
start -= 1
elif res_match[0] == 2:
start = res_match[2]
while start > -4:
if start == res_match[2]:
for each in range(0, 3):
gem = self.getGemByPos(*[res_match[1], start+each])
self.gems_group.remove(gem)
self.all_gems[res_match[1]][start+each] = None
elif start >= 0:
gem = self.getGemByPos(*[res_match[1], start])
gem.target_y += GRIDSIZE * 3
gem.fixed = False
gem.direction = 'down'
self.all_gems[res_match[1]][start+3] = gem
else:
gem = gemSprite(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+res_match[1]*GRIDSIZE, YMARGIN+start*GRIDSIZE], downlen=GRIDSIZE*3)
self.gems_group.add(gem)
self.all_gems[res_match[1]][start+3] = gem
start -= 1
'''移除匹配的gem'''
def removeMatched(self, res_match):
if res_match[0] > 0:
self.generateNewGems(res_match)
self.score += self.reward
return self.reward
return 0
'''游戏界面的网格绘制'''
def drawGrids(self):
for x in range(NUMGRID):
for y in range(NUMGRID):
rect = pygame.Rect((XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE, GRIDSIZE, GRIDSIZE))
self.drawBlock(rect, color=(0, 0, 255), size=1)
'''画矩形block框'''
def drawBlock(self, block, color=(2
没有合适的资源?快使用搜索试试~ 我知道了~
PYTHON 游戏:开心消消乐(基于pagame实现的可视化游戏界面,内含音效)
共24个文件
wav:7个
png:7个
pyc:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 173 浏览量
2024-02-03
08:42:30
上传
评论
收藏 4.71MB ZIP 举报
温馨提示
解压后,运行game文件即可开始游戏 操作方式简单,鼠标操作即可,游戏玩法参考开心消消乐
资源推荐
资源详情
资源评论
收起资源包目录
开心消消乐.zip (24个子文件)
开心消消乐
utils.py 10KB
resources
audios
match2.wav 38KB
match5.wav 42KB
match1.wav 49KB
match3.wav 35KB
match4.wav 35KB
match0.wav 31KB
bg.mp3 2.67MB
bgm.mp3 1.97MB
badswap.wav 36KB
font.TTF 60KB
images
gem2.png 6KB
gem7.png 3KB
gem3.png 3KB
gem1.png 4KB
gem6.png 2KB
gem4.png 4KB
gem5.png 5KB
Game.py 2KB
__pycache__
config.cpython-39.pyc 422B
utils.cpython-310.pyc 8KB
utils.cpython-39.pyc 8KB
config.cpython-310.pyc 339B
config.py 252B
共 24 条
- 1
资源评论
听风吹等浪起
- 粉丝: 1w+
- 资源: 1242
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功