python游戏开发的五个案例分享
⼀、序列应⽤——猜单词游戏
1. 游戏介绍
猜单词游戏就是计筧机随机产⽣⼀个单词,打乱字母顺序,供玩家去猜测。此游戏采⽤控制字符界⾯,
2. 程序设计思路
游戏中,可使⽤序列中的元组存储所有待猜测的单词。因为猜单词游戏需要随机产⽣某个待猜测单词以及随机数字,所以引⼊random模块随机数函数。其中,random.choice()可以从序列中随机选取元素。
在游戏中,随机挑出⼀个单词word后,把单词word的字母顺序打乱的⽅法是随机单词字符串中选择⼀个位置position,把position位置的字母加⼊乱序后的单词jumble,同时将原单词word中position位置的那个字母删去(通过连接position位置前字符串和其后字符串实现)。通过多次循环就可以产⽣乱序后的新单词jumble。
3. random模块
random模块可以产⽣⼀个随机数或者从序列中获取⼀个随机元素。
4. 程序设计步骤
(1)在猜单词游戏程序中导⼊相关模块。
(2)创建所有待猜测的单词序列元组WORDS。
(3)显⽰游戏欢迎界⾯。
(4)实现游戏的逻辑。
⾸先,从序列中随机挑出⼀个单词,如“easy”;然后打乱这个单词的字母顺序;接着,通过多次循环就可以产⽣新的乱序后的单词jumble;最后,将乱序后的单词显⽰给玩家。
(5)玩家输⼊猜测单词,程序判断对错。若玩家猜错,则可以继续猜。
游戏截图:
参考代码:
import random
WORDS=("python","jumble","easy","difficult","answer","continue","phone","position","game")
print("欢迎参加猜单词游戏,把字母组合成⼀个正确的单词")
iscontinue="y"
while iscontinue=="y" or iscontinue=="Y":
word=random.choice(WORDS)
correct=word
jumble=""
while word:
position=random.randrange(len(word))
jumble+=word[position]
word=word[:position]+word[(position+1):]
print("乱序后单词:",jumble)
guess=input("\n请你猜:")
while guess !=correct and guess !="":
print("对不起不正确")
guess=input("继续猜:")
if guess==correct:
print("真棒,你猜对了!\n")
iscontinue = input("\n\n是否继续(Y/N):")
⼆、⾯向对象设计应⽤——发牌游戏
1. 游戏介绍
四名牌⼿打牌,电脑随机將52张牌(不合⼤、⼩王)发给四名牌⼿,并在屏幕上显⽰每位牌⼿的牌。
2. ⾯向对象程序设计
3. 程序设计步骤
设计类,发牌程序设计出三个类: Card类、Hand类和Poke类。
Card类:Card类代表⼀张牌,其中,FaceNum字段指的是牌⾯数字1~13,Suit字段指的是花⾊,”梅”为梅花,”⽅”为⽅块,”红”为红
桃,”⿊”为⿊桃。
Hand类:Hand类代表⼿牌(⼀个玩家⼿⾥拿的牌),可以认为是⼀位牌⼿⼿⾥的牌,其中,cards列表变量存储牌⼿⼿中的牌。可以增加
牌、清空⼿⾥的牌、把⼀张牌给别的牌⼿等操作。
Poke类:Poke类代表⼀副牌,我们可以将⼀副牌看作是有52张牌的牌⼿,所以继承Hand类。由于其中cards列表变量要存储52张牌,⽽且要进⾏发牌、洗牌操作,所以增加如下的⽅法。
主程序:主程序⽐较简单,因为有四个牌⼿,所以⽣成players列表存储初始化的四位牌⼿。⽣成⼀副牌的对象实例poke1,调⽤populate()⽅法⽣成有52张牌的⼀副牌,调⽤huffle()⽅法洗牌打乱顺序,调⽤deal(players,13)⽅法分别给每位玩家发13张牌,最后⽰四位牌⼿所有的牌。
游戏截图:
参考代码:
class Card():
""" A playing card. """
RANKS=["A","2","3","4","5","6","7","8","9","10","J","Q","K"] #牌⾯数字1-13
SUITS=["梅","⽅","红","⿊"]
#梅为梅花,⽅为⽅钻,红为红⼼,⿊为⿊桃
def __init__(self,rank,suit,face_up=True):
self.rank=rank #指的是牌⾯数字1-13
self.suit=suit #suit指的是花⾊
self.is_face_up=face_up #是否显⽰牌正⾯,True为正⾯,False为牌背⾯
def __str__(self): #print()
if self.is_face_up:
rep=self.suit+self.rank #+" "+str(self.pic_order())
else:
rep="XX"
return rep
def flip(self): #翻牌⽅法
self.is_face_up=not self.is_face_up
def pic_order(self): #牌的顺序号
if self.rank=="A":
FaceNum=1
elif self.rank=="J":
FaceNum=11
elif self.rank=="Q":
FaceNum=12
elif self.rank=="K":
FaceNum=13
else:
FaceNum=int(self.rank)
if self.suit=="梅":
Suit=1
elif self.suit=="⽅":
Suit=2
elif self.suit=="红":
Suit=3
else:
Suit=4
return (Suit-1)*13+FaceNum
class Hand( ):
""" A hand of playing cards. """
def __init__(self):
self.cards=[]
def __str__(self):
if self.cards:
rep=""
for card in self.cards:
rep+=str(card)+"\t"
else:
rep="⽆牌"
return rep
def clear(self):
self.cards=[]
def add(self,card):
self.cards.append(card)
def give(self,card,other_hand):
ve(card)
other_hand.add(card)
class Poke(Hand):
""" A deck of playing cards. """
def populate(self): #⽣成⼀副牌
for suit in Card.SUITS:
for rank in Card.RANKS:
self.add(Card(rank,suit))
def shuffle(self): #洗牌
import random
random.shuffle(self.cards) #打乱牌的顺序
def deal(self,hands,per_hand=13):
for rounds in range(per_hand):
for hand in hands:
top_card=self.cards[0]
ve(top_card)
hand.add(top_card)
if __name__=="__main__":
print("This is a module with classed for playing cards.")
#四个玩家
players=[Hand(),Hand(),Hand(),Hand()]
poke1=Poke()
poke1.populate() #⽣成⼀副牌
poke1.shuffle() #洗牌
poke1.deal(players,13) #发给玩家每⼈13张
#显⽰四位牌⼿的牌
n=1
for hand in players:
print("牌⼿",n,end=":")
print(hand)
n=n+1
input("\nPress the enter key to exit.")
三、图形界⾯设计——猜数字游戏
1. 游戏介绍
在游戏中,程序随机⽣成1024以内的数字,再让玩家去猜,如果猜的数字过⼤过⼩都会进⾏提⽰,程序还会统计玩家猜的次数。使⽤Tkinter 开发猜数字游戏
2. python图形界⾯设计
Python提供了多个图形开发界⾯的库
3. 程序设计步骤
在猜数字游戏程序中导⼊相关模块:
random.randint(0,1024)随机产⽣玩家要猜的数字。
猜按钮事件函数从单⾏⽂本框entry_a获取猜的数字并转换成数字val a,然后判断是否正确,并根据要猜的数字number判断数字是过⼤还是过⼩。
HumGuess()函数修改提⽰标签⽂字来显⽰猜的次数。
关闭按钮事件函数实现窗体关闭。
游戏截图:
参考代码:
import tkinter as tk
import sys
import random
import re
number=random.randint(0,1024)
running=True
rows函数的使用方法及实例num=0
nmaxn=1024
nmin=0
def eBtnClose(event):
root.destroy()
def eBtnGuess(event):
global nmaxn
global nmin
global num
global running
if running:
val_a=int(())
if val_a==number:
labelqval("恭喜答对了!")
num+=1
running=False
numGuess()
elif val_a<number:
if val_a>nmin:
nmin=val_a
num+=1
label_fig(label_tip_min,text=nmin)
labelqval("⼩了哦")
else:
if val_a <nmaxn:
nmaxn = val_a
num += 1
label_fig(label_tip_max, text=nmaxn)
labelqval("⼤了哦")
else:
labelqval("你已经答对了")
def numGuess():
if num==1:
labelqval("你已经答对了!")
elif num<10:
labelqval("==⼗次以内就答对了。。。尝试次数:"+str(num))
elif num<50:
labelqval("还⾏哦尝试次数:"+str(num))
else:
labelqval("好吧。。。你都超过50次了。。。尝试次数:"+str(num)) def labelqval(vText):
label_fig(label_val_q,text=vText)
root=tk.Tk(className="猜数字游戏")
line_a_tip=tk.Frame(root)
label_tip_max=tk.Label(line_a_tip,text=nmaxn)
label_tip_min=tk.Label(line_a_tip,text=nmin)
label_tip_max.pack(side="top",fill="x")
label_tip_min.pack(side="bottom",fill="y")
line_a_tip.pack(side="left",fill="y")
line_question=tk.Frame(root)
label_val_q=tk.Label(line_question,width="80")
label_val_q.pack(side="left")
line_question.pack(side="top",fill="x")
line_input=tk.Frame(root)
entry_a=tk.Entry(line_input,width="40")
btnguess=tk.Button(line_input,text="猜")
entry_a.pack(side="left")
entry_a.bind('<Return>',eBtnGuess)
btnguess.bind('<Button-1>',eBtnGuess)
btnguess.pack(side="left")
line_input.pack(side="top",fill="x")
line_btn=tk.Frame(root)
btnClose=tk.Button(line_btn,text="关闭")
btnClose.bind('<Button-1>',eBtnClose)
btnClose.pack(side="left")
line_btn.pack(side="top")
labelqval("请输⼊0-1024之间任意整数:")
entry_a.focus_set()
print(number)
root.mainloop()
四、Tkinter图形绘制——图形版发牌程序
1. 游戏介绍
机随机将52张牌(不含⼤王和⼩王)发给四位牌⼿,在屏幕上显⽰每位牌⼿的牌,程序的运⾏效果如图5-1所⽰。接下来,我们以使⽤Canvas绘制Tkinter模块图形为例,介绍建⽴简单GUI(图形⽤户界⾯)游戏界⾯的⽅法。
2. 程序设计思路
将要发的52张牌,按梅花0~12,⽅块13- 25,红桃26- 38,⿊桃39- 51的顺序编号并存储在pocker列表c未洗牌之前l,列表元素存储的是某张牌c实际上是牌的编号)。同时,按此编号将扑克牌图⽚顺序存储在imgs列表中。也就是说,imgs[0]存储梅花A的图⽚,imgs[1]存储梅花2的图⽚,imgs[14]存储⽅块2的图⽚,依次类推。
发牌后,根据每位牌⼿(pl,p2,p3,p4)各⾃牌的编号列表,从imgs获取对应牌的图⽚,并使⽤create- image《x坐标,y坐标),image=图像⽂件)将牌显⽰在指定位置。
游戏截图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论