1. 还是为慕课准备的资料,打算带打一下类和对象,为了方便,使用了这个例子,原理一样,无须赘述。
  2. 开始的时候琢磨用tkinter库导入图像啥的,碰到了个问题:_tkinter.TclError: couldn't recognize data in image file,查找库函数发现它的PhotoImage的原话是:Widget which can display colored images in GIF, PPM/PGM format.格式都支持不全,无语了,所以只能转向使用PIL库了,里面的ImageTk的同样功能的PhotoImage使用起来毫无压力,小插曲。
  3. 整体思路简单:创建好界面,然后界面上放置扑克即可。
  4. 首先整理下界面绘制的步骤,直接写代码了,所以不废话了,直接看代码,至于为何这样弄,你学习下库函数就知道了:
import tkinter as tk
win = tk.Tk() #第一步,建立窗口
win.title('发牌程序') #第二步,给窗口起名字
win.geometry('800x600') #第三步,设定窗口的大小(长x宽)
cv = tk.Canvas(win, bg='green', width=800, height=600) # 第四步,在界面上组织图形,该画布上放置各种元素
cv.pack() #第五步,放置图形,常用的是pack和place两种方法
win.mainloop() #第六步,主窗口循环显示

测试下先,结果如下:

我去,把我桌面也截屏进来了,影响美观,算了就这样看看哇。
5. 接下来要琢磨下第四步后面,我们可以把牌放在画布上,这个问题就麻烦多了,要创建好牌,洗牌,发牌等等,好在上个控制台版本已经琢磨过了,这里稍微封装下,这里直接使用即可。
6. 先来个简单的试试吧,要不整一堆进来不能用就浪费时间了,在上面第四步后面加入如下代码:

from PIL import Image, ImageTk
img = Image.open(r'C:\\Users\\***\\Desktop\\python_course\\mooc\\mooc\\puke\\1-1.jpg') #读取扑克牌
imgs = ImageTk.PhotoImage(img)
cv.create_image((200, 80), image=imgs)

切记,路径要完整点,格式要正确,该死的tkinter只能读那几个格式,关键我电脑上还没有,懒得找了,直接就使用PIL库了,一样样的哈,读完之后直接在画布上绘制即可,效果如下:

有点意思了吧?其实我最喜欢的教程就是这种从0到1,一步一步来,慢慢讲解的,希望后续出个教程这样教编程,上面美中不足的是讲解少了点,原因么:罗里吧嗦的讲一堆,冲淡主题了,所以希望你自己去琢磨了,就是课后扩展;本课主讲类和对象,这个GUI编程不是我们的主题,不能展开,所以就不废话了。讲到GUI编程的时候再补充这些知识点吧。
7. 接下来,我们就要琢磨下前面遗漏的问题,发牌,洗牌之类的问题了,关键是要创建类和对象,这个才是重点,好了,类是什么?对象是什么?
8. 你肯定看了无数垃圾文章,然后依然搞不懂类和对象,但是起码知道这么俩个玩意儿。举个例子吧,日常生活里修建房子的时候,施工图纸就是类,建好的房子就是对象。
9. 假设你手上有施工图纸,里面肯定会有房子的各种信息,盖几层,厨房在哪?卧室在哪?等各种规格。你是不是开始憧憬在这个新家生活,没贵的家具,在厨房做好吃的,等等,但是这些事情必须等房子建好才可行,如果烂尾了,那就没法释放你无处安放的青春了。
10. 所以说:一个建好的房子,很重要,在python中“一切皆为对象”,有了对象,才能做任何事。
11. 好了,到这里,你基本就知道类和对象分别是啥,关系是啥了,那就不废话了,各种语言都讲这东东,好好写几段代码体会体会。
12. 开始我们的工作了,为了体现类和对象的概念,并测试其知识点,对于纸牌我们设计了三个类:一张牌、一手牌、一副牌三个类;一手牌是啥意思?就是一个玩家手里拿的牌,一副牌可以看作拿着52张牌的一个玩家,所以可以继承一手牌这个类,基本知识点就覆盖到了,麻烦。
13. 浪费了点时间,把后面的步骤写完了,没顾得上写讲解了,等会还有超多事情要处理,直接上代码和效果了:

#coding=utf-8
class Card(): # 一张牌类#points = ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] #牌面点数points = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13'] # 为了便于检索#suits = ['草花', '方块', '红桃', '黑桃'] #牌面花色suits = ['1', '2', '3', '4'] # 为了便于检索,和上面相对应def __init__(self, point, suit):self.point = pointself.suit = suitdef __str__(self):rep = self.suit + '-' + self.pointreturn repclass Hand(): # 一手牌类def __init__(self):self.cards = [] # 存放牌手的牌def add(self, card): # 增加牌self.cards.append(card)def __str__(self):rep = ''for card in self.cards:rep += str(card) + "\t"return repclass Poke(Hand): # 一副牌类def generate_poke(self): # 生成一副牌for point in Card.points:for suit in Card.suits:self.add(Card(point, suit))def random_poke(self): # 洗牌import randomrandom.shuffle(self.cards)def deal(self, hands, limit_hand=13): # 发牌deal cards, 每人默认13张for rounds in range(limit_hand):for hand in hands:if self.cards:top = self.cards[0]self.cards.remove(top)hand.add(top)
def print_poke(players):results = [player.__str__() for player in players]pk = []for result in results:pk1 = result.rstrip()pk2 = pk1.split('\t')pk.append(pk2)# 接下来要将这种字符串和图片挂钩image_name = [] # 存放52张牌对应图片的地址for i in range(len(pk)):for j in pk[i]:str_name = 'C:\\......\\puke\\{}.jpg'.format(j)image_name.append(str_name)wj = [image_name[i:i+13] for i in range(len(image_name)) if i%13==0]  # 把图片分给四个玩家  return wjplayers = [Hand(), Hand(), Hand(), Hand()] # 4个玩家牌手
pockers = Poke()
pockers.generate_poke() # 生成一副牌
pockers.random_poke() # 洗牌
pockers.deal(players, 13) # 发牌
wj = print_poke(players) # 打印牌,首先要从前面的表示方法转换为字符串,然后在转换为对应的图片集import tkinter as tk
win = tk.Tk() #第一步,建立窗口
win.title('发牌程序') #第二步,给窗口起名字
win.geometry('800x600') #第三步,设定窗口的大小(长x宽)
cv = tk.Canvas(win, bg='green', width=800, height=600) # 第四步,在界面上组织图形,该画布上放置各种元素
from PIL import Image, ImageTk
imgs = []
(p1, p2, p3, p4) = ([], [], [], [])
for i in range(4):for j in range(13):img = Image.open(wj[i][j]) #读取扑克牌imgs.insert(i*13+j, ImageTk.PhotoImage(img))
p1 = imgs[0:13]
p2 = imgs[13:26]
p3 = imgs[26:39]
p4 = imgs[39:52]
for x in range(0, 13):cv.create_image((200+20*x, 80), image=p1[x])cv.create_image((100, 150+20*x), image=p2[x])cv.create_image((200+20*x, 500), image=p3[x])cv.create_image((560, 150+20*x), image=p4[x])
cv.pack() #第五步,放置图形,常用的是pack和place两种方法
win.mainloop() #第六步,主窗口循环显示

实验效果图如下:

这下有点意思了吧?
14. 代码写的啰嗦了点,为了讲解类和对象也是够意思了!涉及到了类的创建、构造函数、重载函数、创建对象、类方法调用、还勉强构思了继承等等,基本的知识点覆盖了,主要是为了讲课使用,实例演示,很容易知道上面知识点如何学习、分析了,任务完成。
15. 后续有大把时间的时候,加上出牌动画、出牌规则、输赢规则,然后把其中一个人设置为玩家,就可以在无聊的时候自己打打拖拉机了!好累,继续下个项目了,今天没时间写这个了。交差!后面添加的代码也没顾得上优化,封装,改天了!

实现拖拉机发牌程序——界面版python相关推荐

  1. 面向对象发牌程序python_大话python面向对象

    前言 师门中每逢成人礼就要下山历练一番,小掌门今年成人礼,下山也有一段时日.可恰逢年底,今年百姓收成都不是很好,各大店铺也很少招人,再加上学艺不精,小掌门无事可做就只能饿肚子了.后来小掌门饿的实在不行 ...

  2. 6.C语言迷宫程序界面版

    写迷宫程序首先需要安装图形库easyX 安装地址链接:https://pan.baidu.com/s/1qZwFn3m 密码:ozge 项目截图: //左上角是七点,右下角是终点,蓝色表示的是走过的路 ...

  3. Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后, ...

  4. python交互界面实例_Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后, ...

  5. python分发扑克牌_python实现扑克牌交互式界面发牌程序

    本文实例为大家分享了python实现扑克牌交互式界面发牌程序的具体代码,供大家参考,具体内容如下 注:图片自行在网上下载.替换即可 #coding=utf-8 class Card(): #扑克牌类 ...

  6. 面向对象发牌程序python_Python面向对象编程扑克牌发牌程序,另含大量Python代码!...

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小 ...

  7. python发牌游戏图形界面_python实现扑克牌交互式界面发牌程序

    本文实例为大家分享了python实现扑克牌交互式界面发牌程序的具体代码,供大家参考,具体内容如下 注:图片自行在网上下载.替换即可 #coding=utf-8 class Card(): #扑克牌类 ...

  8. python 斗地主发牌_Python_斗地主发牌程序

    1)1副牌(52+2=54张) 2)有大小王,用提供的国王和皇后的符号表示大小王 3)54张牌发给3个玩家,每人17张牌,并有3张底牌. 4)输出3个玩家的牌,按照由小到大,黑红梅方的顺序. 5)输出 ...

  9. 30岁自学python找工作-程序员自学Python开发,20到30岁几乎决定了你的未来!

    原标题:程序员自学Python开发,20到30岁几乎决定了你的未来! 之前程序员界流行一句话:人生苦短,请用Python. 随着Python成为网红语言之后,不少程序员想多学这一门语言好傍身. 甚至有 ...

  10. c语言制作贪吃小白入门,小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)...

    小白入门--easyx界面版"贪吃蛇"的C语言实现(详细) 作者:顽石 前言:C语言初学者都是在控制台上开发一些小游戏什么,由于没有界面(比如图片.音乐,不能做出拥有自己风格的程序 ...

最新文章

  1. 阿里云高级工程师认证机会!
  2. 远离这样的管理层:靠加班、靠团建、靠个人
  3. json模块及其API
  4. dnet 并行编程学习总结
  5. 网络规划设计师论文汇总(2012-2018)考前冲刺真题
  6. Java对数组的操作(三)—比较两个数组中的元素是否相同的最简单方法
  7. vue cli3.0 解决跨域问题和axios等问题,配合Django
  8. matlab拟合曲线教程,【Matlab】matlab如何使用拟合工具?matlab如何拟合曲线?matlab拟合工具cftool如何使用?...
  9. JDK下载安装教程及环境变量配置
  10. 家庭WIFI排障思路
  11. 使用opencv应用程序正常初始化失败0xc000000d解决办法
  12. [年终总结]这就是2016的我
  13. 建模你不能不知道这些网站能接单 | 建议收藏
  14. 如果你在犹豫要不要去外包公司,不妨看看这篇文章
  15. html5多媒体播放器,走进HTML5-学习多媒体,带你实现视频播放器、音乐播放器功能(*^▽^*)...
  16. 数据库基础语法--php基础最详细教程
  17. Google是如何通过拆股增强控制权的?
  18. PF_PACKET环形接收缓存
  19. 专利驳回后复审费可以减缓
  20. “云管边端”协同的边缘计算安全防护解决方案

热门文章

  1. 国际贸易13种术语你都了解吗?
  2. CDD数据库文件制作(二)——DTC配置
  3. python统计元音字母个数_python统计并输出字符串中小写元音字母的个数?
  4. 《人月神话(The Mythical Man-Month)》看清问题的本质:如果我们想解决问题,就必须试图先去理解它...
  5. 本科计算机考研考英语,2016考研必需知道的10件事
  6. 江苏大学计算机学院在职研究生,江苏大学电子与通信工程在职研究生招生简章...
  7. vscode 创建Express框架 目录 坏境
  8. 天下足球十大感动台词
  9. 常见视频文件格式详解
  10. java 计算农历_java计算农历日期