当前位置:首页>python>Python教程(35)卡牌对战——列表的进阶操作

Python教程(35)卡牌对战——列表的进阶操作

  • 2026-09-06 08:49:14
Python教程(35)卡牌对战——列表的进阶操作

你好,我是雨霖八珞,同名B站UP主。关注合集不迷路。以下内容为个人教学,真诚分享,欢迎交流。

上篇我们学了列表的基本操作:创建、添加、删除、遍历。今天我们通过一个卡牌对战游戏,学习列表的进阶操作。


创建一副牌

一副扑克牌有 4 种花色(♠️♥️♣️♦️),每种花色有 13 个点数(2-10、J、Q、K、A)。为了简便起见,暂时不考虑大小王。

代码如下:

运行结果如下:

知识点讲解:

  • 变量名见名知意:rank(点数) suit(花色)  deck(牌堆)

  • 双重循环遍历所有点数和花色的组合,每张牌用 append() 加入列表。

洗牌和发牌

用 random.shuffle() 打乱牌堆顺序,然后用发给两个玩家(你和电脑)各三张牌。

程序代码如下:

运行结果如下:

知识点讲解:

  • random.shuffle():直接打乱原列表的顺序(列表本身发生变化)

  • deck[m:n]:列表切片操作,从deck[m]开始切,切到deck[n-1]

    • deck[0:3]:取deck列表的前 3 张(deck[0]、deck[1]、deck[2])

    • deck[3:6]:取deck[3]、deck[4]、deck[5]这三张牌

    •  deck[6:]:从deck[6]开始切,一直到最后一张牌

  • deck = deck[6:]:从deck[6]到最后一张牌重新赋值给deck,也就意味着deck[0]~deck[5]全部删除

比大小的规则

先说说判断规则:

每个玩家先从自己的三张牌中找出点数最大的一张牌(如果有多张点数相同的最大牌,取花色最大的那张),然后用这张牌代表自己,和对方进行一轮比较。

  • 先比点数:点数大的牌赢,2 最小,A 最大。

  • 点数相同:比花色,♠ > ♥ > ♣ > ♦

  • 点数和花色都相同:平局

注意:只比一轮。三张牌中挑出最大的一张后,就只比这一张,不比第二、第三张。

比如,玩家手牌: ['♠5', '♥5', '♠2'],电脑手牌: ['♥8', '♦A', '♣4']

玩家手牌中的点数最大的是5,而花色♠最大,所以玩家最大的牌是'♠5'

电脑手牌中的点数最大的是A,所以电脑最大的牌是 '♦A'

最后,玩家和电脑做比较:

先比点数,电脑是A,玩家是5,所以电脑直接胜出(不用再比花色)

规则搞清楚了,就可以分两步走:

  • 分别挑出玩家和电脑的最大牌

  • 比较玩家和电脑最大牌

分别挑出玩家和电脑的最大牌

可以看到找出玩家点数最大的牌和找出电脑点数最大的牌几乎一样,我们重点讲解找出玩家点数最大的牌。

比如玩家手牌 player= ['♠5', '♥5', '♠2']

比较的思路是:

先默认玩家手牌中的第一张牌是最大的。

即player_max = player[0]

然后开始遍历玩家手牌,

如果第二张牌的点数比player_max更大,

player_max直接替换成第二张牌的点数。

如果第二张牌的点数和player_max一样大,

再来比较第二张牌和player_max的花色,最终决定player_max的值

以此类推,再把第三张牌和player_max做比较

全部遍历完后,player_max的值就是玩家手牌中最大的了。

知识点讲解:

1、for card in player:

          ……

player 是列表,存放着玩家的三张手牌,

for循环遍历player,表示card分别取到三张手牌

2、card[1:] 取点数,card[0]取花色

card拿到牌之后,要分离出点数和花色

比如card = "♠5",card是字符串,和列表操作一样,也可以用索引号来访问数据,索引号从0开始。

card[0]可以取花色,比如card[0] = "♠"

注意:不要认为card[1]就是点数,因为如果card="♠10"呢?

所以去点数要从第1个元素取到最后,即card[1:]取点数

3、用index来比较点数和花色

在程序最开始已经交代了所有点数和花色。

这里有个特殊问题:

  • 字符串 "K"、"10"、"A",不能直接用 > 比较大小。

  • 花色也不能直接用 > 比较大小

解决方案:可以利用列表位置来比较大小。

列表.index 是 Python 列表的一个方法,作用是查找某个元素在列表中第一次出现的位置(索引)。

可以看到:在ranks列表中,点数越大,位置越靠后,index的值越大

同理,在suits列表中,花色越大,位置越靠前,index的值越小

最终结果比较

拿到了玩家的最大牌player_max和电脑的最大牌computer_max
开始比较两者的大小(和前面的过程类似)
相关程序代码如下:
完整代码见留言区
程序运行如下:

总结拓展

这个游戏对于初学者来说综合性比较强,比较复杂,
还有很多可以改进的空间,比如:
  • 玩法:可以持续对战,胜者可以在剩余的牌堆中取一张牌,继续比较
  • 界面:可以用GUI可视化界面,更加直观和形象
  • 程序:有很多代码是雷同的,可以利用函数简化
主要是通过该案例,掌握列表相关的知识:
  • 用 random.shuffle() 洗牌

  • 用切片取牌和删牌

  • 用index()获取位置,比较大小

今后,我们还会通过更多的案例让大家对列表的使用更加清晰。

本公众号内容均为原创。如需转载或引用,请先联系我。谢谢你的尊重。

觉得不错的话,伙伴们记得关注、在看、转发和点赞哈!

最新文章

随机文章