游戏背景

本篇博客创意来源:CSDN 新星计划 Python 赛道群
本游戏开发难度:入门级
游戏试用场景:年会抽奖少儿编程
游戏需求描述:随机生成一定数量的格子,然后埋入总裁头像,抽中总裁奖励奥迪一辆

准备素材

没错,CSDN 总裁和副总裁,请把专业团队打在评论区。

稍后游戏中,我们将使用二者头像,制作一款充满金钱味道的游戏。

游戏使用的 Python 框架是 pygame,该库小巧轻便,非常好使。

制作游戏背景

为了让游戏充满 金钱 味道,我特意制作了一个游戏背景图片。接下来就使用 pygame 实现一下吧。

通过 pygame.image.load 加载背景图,如果背景图尺寸不合适,可以通过 pygame.transform.scale 对素材进行缩放。

import pygame
import sys
from pygame.locals import *class Game:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((900, 600))pygame.display.set_caption("总裁翻牌")def set_bg(self):bg = pygame.image.load("images/bg.png")# width, height = bg.get_size()# 素材缩小# pygame.transform.scale(bg,(width,height))self.screen.blit(bg, (0, 0))def run(self):while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()self.set_bg()pygame.display.update()if __name__ == '__main__':g = Game()g.run()

缩放这部分可以学习如下内容:

# 快速缩放,size 相同,缩小后会增大像素密度
pygame.transform.scale()# 平滑缩放,size 会变化,像素密度比较平均
pygame.transform.smoothscale()

运行 Python 代码,一张充满金钱味道的图片展现在了眼前。

既然游戏设置了 900x600 大小,下面需要进行简单的计算,在此游戏窗口内可以放置多少总裁牌子。

为了让大家看的更加清晰,制作一张说明图,如下所示,除了各个方格之间的距离,注意下图各个方格的左上角坐标。


直接使用硬编码的办法,实现对方格渲染的计算,下述代码用到了 pygame 中的精灵类,Card 类继承自该类。

import pygame
import sys
from pygame.locals import *class Card(pygame.sprite.Sprite):def __init__(self, x, y):self.image = pygame.image.load("images/card.png")width, height = self.image.get_size()self.rect = (x, y, width, height)class Game:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((900, 600))pygame.display.set_caption("总裁翻牌")self.clock = pygame.time.Clock()self.start_point = (40, 45)def set_bg(self):bg = pygame.image.load("images/bg.png")# width, height = bg.get_size()# 素材缩小# pygame.transform.scale(bg,(width,height))self.screen.blit(bg, (0, 0))# 绘制牌子def set_card(self):for num in range(7 * 4):if num // 7 == 0:x = num * 120 + 40y = 45elif num // 7 == 1:x = (num - 7) * 120 + 40y = 175elif num // 7 == 2:x = (num - 7 * 2) * 120 + 40y = 305elif num // 7 == 3:x = (num - 7 * 3) * 120 + 40y = 435card = Card(x, y)self.screen.blit(card.image, card.rect)def run(self):x = 40y = 45while True:self.clock.tick(60)for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()self.set_bg()self.set_card()pygame.display.update()if __name__ == '__main__':g = Game()g.run()

代码运行得到如下,卡片使用铜钱图片即可,素材提前进行了裁剪。

卡片点击事件

下面要实现的一个重要操作,鼠标可点击卡片区域。

基于上文的代码,进行了一点点的封装,具体实现如下:

import pygame
import sys
from pygame.locals import *class Card(pygame.sprite.Sprite):def __init__(self, x, y):self.image = pygame.image.load("images/card.png")width, height = self.image.get_size()self.rect = (x, y, width, height)class Game:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((900, 600))pygame.display.set_caption("总裁翻牌")self.clock = pygame.time.Clock()self.card_nums = 28self.points = self.all_point()# 封装坐标计算函数def all_point(self):points = []for num in range(self.card_nums):if num // 7 == 0:x = num * 120 + 40y = 45elif num // 7 == 1:x = (num - 7) * 120 + 40y = 175elif num // 7 == 2:x = (num - 7 * 2) * 120 + 40y = 305elif num // 7 == 3:x = (num - 7 * 3) * 120 + 40y = 435points.append((x, y))return pointsdef set_bg(self):bg = pygame.image.load("images/bg.png")# width, height = bg.get_size()# 素材缩小# pygame.transform.scale(bg,(width,height))self.screen.blit(bg, (0, 0))# 绘制牌子def set_card(self):for num in self.points:x, y = numcard = Card(x, y)self.screen.blit(card.image, card.rect)# 计算鼠标点击卡片def mouse_card(self, mosx, mosy):for x, y in self.points:if (mosx >= x and mosx <= (x + 100)) and (mosy >= y and mosy <= (y + 100)):print("点了")def run(self):while True:self.clock.tick(60)for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()if event.type == MOUSEBUTTONDOWN:mosx, mosy = event.posself.mouse_card(mosx, mosy)self.set_bg()self.set_card()pygame.display.update()if __name__ == '__main__':g = Game()g.run()

此时当你点击任意卡片的时候,会提示是否被点中,同时将坐标生成函数进行了封装与提炼。

 def all_point(self):points = []for num in range(self.card_nums):if num // 7 == 0:x = num * 120 + 40y = 45elif num // 7 == 1:x = (num - 7) * 120 + 40y = 175elif num // 7 == 2:x = (num - 7 * 2) * 120 + 40y = 305elif num // 7 == 3:x = (num - 7 * 3) * 120 + 40y = 435points.append((x, y))return points

只获取被点中还不可以,还需要进行翻牌,这步操作需要使用 Python 中的 enumerate 函数,循环的同时获取序号。

   # 计算鼠标点击卡片def mouse_card(self, mosx, mosy):for i, (x, y) in enumerate(self.points):if (mosx >= x and mosx <= (x + 100)) and (mosy >= y and mosy <= (y + 100)):print("翻牌,点到卡片序号为", i)

翻总裁的牌

上文实现的是翻牌触发,下面实现牌面的转换。此时用到的依旧是对卡片顺序的验证,修改逻辑代码如下,只展示有变化部分代码。

import pygame
import sys
from pygame.locals import *class Card(pygame.sprite.Sprite):def __init__(self, x, y, card_state):self.image = pygame.image.load("images/card.png")width, height = self.image.get_size()self.rect = (x, y, width, height)# 切换卡片牌面self.card_state = card_statedef update(self):# 当牌面为 2 时显示哭脸if self.card_state == 2:self.image = pygame.image.load("images/cry.png")class Game:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((900, 600))pygame.display.set_caption("总裁翻牌")self.clock = pygame.time.Clock()self.card_nums = 28self.points = self.all_point()# 点击卡片记录数组self.click_list = []def set_bg(self):bg = pygame.image.load("images/bg.png")# width, height = bg.get_size()# 素材缩小# pygame.transform.scale(bg,(width,height))self.screen.blit(bg, (0, 0))# 绘制牌子def set_card(self):for i, num in enumerate(self.points):x, y = numcard_state = 1# 卡片是否被点击if i in self.click_list:card_state = 2card = Card(x, y, card_state)card.update()self.screen.blit(card.image, card.rect)# 计算鼠标点击卡片def mouse_card(self, mosx, mosy):for i, (x, y) in enumerate(self.points):if (mosx >= x and mosx <= (x + 100)) and (mosy >= y and mosy <= (y + 100)):print("翻牌,点到卡片序号为", i)self.click_list.append(i)

运行代码得到如下效果,点一个哭一个。

翻开 CSDN 总裁之牌

游戏已经到了最后一步,下面可以实现抽总裁卡,Card 类增加几个状态,即可实现。

    def update(self):# 当牌面为 2 时显示哭脸if self.card_state == 2:self.image = pygame.image.load("images/cry.png")if self.card_state == 3:self.image = pygame.image.load("images/fuzong.png")self.image = pygame.transform.scale(self.image, (100, 100))if self.card_state == 4:self.image = pygame.image.load("images/zong.jpg")self.image = pygame.transform.scale(self.image, (100, 100))

为了游戏的趣味性,加入随机效果,使用 numpy 搞定。

 # 随机生成数组,中奖为1,不中奖为0self.win_list = list(np.random.randint(0, 3, 28))print(self.win_list)

最终的游戏代码为:

import pygame
import sys
from pygame.locals import *
import numpy as npclass Card(pygame.sprite.Sprite):def __init__(self, x, y, card_state):self.image = pygame.image.load("images/card.png")width, height = self.image.get_size()self.rect = (x, y, width, height)# 切换卡片牌面self.card_state = card_statedef update(self):# 当牌面为 2 时显示哭脸if self.card_state == 2:self.image = pygame.image.load("images/cry.png")if self.card_state == 3:self.image = pygame.image.load("images/fuzong.png")self.image = pygame.transform.scale(self.image, (100, 100))if self.card_state == 4:self.image = pygame.image.load("images/zong.jpg")self.image = pygame.transform.scale(self.image, (100, 100))class Game:def __init__(self):pygame.init()self.screen = pygame.display.set_mode((900, 600))pygame.display.set_caption("总裁翻牌")self.clock = pygame.time.Clock()self.card_nums = 28self.points = self.all_point()# 点击卡片记录数组self.click_list = []# 随机生成数组,中奖为1,不中奖为0self.win_list = list(np.random.randint(0, 3, 28))def all_point(self):passdef set_bg(self):bg = pygame.image.load("images/bg.png")# width, height = bg.get_size()# 素材缩小# pygame.transform.scale(bg,(width,height))self.screen.blit(bg, (0, 0))# 绘制牌子def set_card(self):for i, num in enumerate(self.points):x, y = numcard_state = 1# 卡片是否被点击if i in self.click_list:card_state = 2# 卡片是否被点击if i in self.click_list and self.win_list[i] == 1:card_state = 3# 卡片是否被点击if i in self.click_list and self.win_list[i] == 2:card_state = 4card = Card(x, y, card_state)card.update()self.screen.blit(card.image, card.rect)# 计算鼠标点击卡片def mouse_card(self, mosx, mosy):for i, (x, y) in enumerate(self.points):if (mosx >= x and mosx <= (x + 100)) and (mosy >= y and mosy <= (y + 100)):print("翻牌,点到卡片序号为", i)self.click_list.append(i)def run(self):while True:self.clock.tick(60)for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()if event.type == MOUSEBUTTONDOWN:mosx, mosy = event.posself.mouse_card(mosx, mosy)self.set_bg()self.set_card()pygame.display.update()if __name__ == '__main__':g = Game()g.run()


完整代码下载:下载地址

上一篇博客中奖ID如下:

恭喜 Xiao_Chen001,抓紧联系擦姐吧。

抽奖环节

只要评论数过 50
随机抽取一名幸运读者
奖励 39.9 元爬虫 100 例专栏 1 折购买券一份,只需 3.99 元

今天是持续写作的第 158 / 200 天。
求点赞、求评论、求收藏。

28分钟完成一款Python游戏,《客服戏翻总裁牌》相关推荐

  1. 我是如何从0开始,在23天里完成一款Android游戏开发的 – Part4~7

    [原文:http://www.open-open.com/news/view/2e89b3] 第 9 天这是一款第一人称视角射击游戏,但它绝不老套 在与人们谈论起这款游戏的时候,为它定义一个明确的分类 ...

  2. 一款基于微客服的仿微信的聊天软件

    一款基于微客服的仿微信的聊天软件 服务分类: 其它开发,推送 使用服务: 微客服 , 小米推送 功能分类: 社交 支持平台: Android 运行环境: Android 开发语言: Java 开发工具 ...

  3. 【源码分享下载】一款基于微客服的仿微信的聊天软件

    一款基于微客服的仿微信的聊天软件 服务分类: 其它开发,推送 使用服务: 微客服 , 小米推送 功能分类: 社交 支持平台: Android 运行环境: Android 开发语言: Java 开发工具 ...

  4. intitle:客服机器人代码_游戏客服能影响企业发展?千万别大意

    对于长期处在客服岗位上的人来说,扛着负能量,冲到前线去解决玩家的问题,去挽救失陷的口碑,已经成为了工作日常,而这么一帮对游戏发展.用户留存起到重要作用的人,却常常被玩家当成了"机器人&quo ...

  5. python 在线客服_后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统...

    在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详细介绍了websocket协议以及结合Django如何实现各种功能,本次我们 ...

  6. python 在线客服_如何利用Python实现简单全双工在线客服系统!这个有点东西!...

    在之前的一篇文章中: 为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统 ,详细介绍了websocket协议以及结合Django如何实现各种功能,本次 ...

  7. 聚观早报 | 多款热门游戏停服一天;比亚迪下月在日本开售

    今日要闻:多款热门游戏宣布停服一天:比亚迪将于下月在日本开售:三星电子任命首位女总裁:亚马逊撤回零售部门新offer:富士康郑州厂最快12月底复产 多款热门游戏宣布停服一天 12 月 5 日,腾讯.网 ...

  8. 京东万象数据接口,钱没花完,接口404,客服是白痴,无法维权

    由于业务需求,买了一个银行卡信息查询的接口.就是考虑到免费的接口容易挂,聚合等平台感觉小了,爬麻烦,于是找到了京东万象.以为京东好歹是个大平台.于是在万象1000块买了10万次的查询接口. 9月15日 ...

  9. Docker 版 3分钟部署 .net core 开源在线客服系统,他来了

    我在博客发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 园友们又提出了新的要求,希望发布基于 Docker 的版本方便安装使用,今天,他来了. 简介 升讯威在线客服与营销 ...

最新文章

  1. 信号量 互斥量 条件变量
  2. com.google.gson.Gson 使用详解
  3. Spring事务的那些坑,这里都给你总结好了!
  4. P3932 浮游大陆的68号岛
  5. word2vec相似度计算_文档相似度助力搜索引擎
  6. 如何使mysql编码格式_Mysql设置编码方式及基本操作
  7. 【转】原来支付宝、财付通每天都是这样对账、风控的!
  8. 软件开发中Alpha、Beta、RC、GA版本的含义
  9. 【BZOJ4602】齿轮,带权并查集
  10. 看完这篇 你就能完全操作git 远程分支的增、删、改、查了
  11. 主动提交事务_对于分布式事务,我“开门见山”地谈到这些理解,面试官都听懵了...
  12. Linux连接网络的方法
  13. 品质qc工程图_QC工程图 (品管)
  14. 二、echarts地图从全国进省从省进市
  15. 春节假期 最强抢票攻略
  16. 深度学习培训完可以找工作吗?深度学习可以做什么?
  17. 基于React Native和Ethers.js的电子钱包(二):路由和导航
  18. 【中控技术加持荣信化工智能工厂,尽显科技范儿】
  19. oracle 创建自增序列
  20. 13. JS jQuery

热门文章

  1. 关于Gensim的初次见面 和 Doc2vec 的模型训练
  2. Java - 手撸线上故障 OOM + CPU居高不下
  3. 20X23 FCPX插件10组创意图像拼接排版LOGO标志展示片头 Abstract Photo Openers
  4. 如何评估嵌入式 BI 分析方案
  5. 学习jQuery的第一天
  6. IOS真机调试uni.scanCode调用报错,黑屏
  7. php $_get取得空,Laravel - PHP 無法取得 Hppt Request $_GET Params 值的解決方式
  8. JavaScript作业:根据圆的半径求周长和面积
  9. Bootstrap 知识点汇总
  10. MySQL DELETE触发器