python可以写游戏,但不适合。下面我们来分析一下具体原因。
用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的。但一般来说,还是用工业机器人更合适对吗?
比较大型的,使用Python的游戏有两个,一个是《EVE》,还有一个是《文明》。但这仅仅是个例,没有广泛意义。
一般来说,用来做游戏的语言,有两种。一是C++。。一是C#。。
Python理论上,不仅不适合做游戏,而是只要大型的程序,都不适合。只适合写比较小型的东西,比如一个计算器,一个爬虫等。
主要有2个方面,一是速度慢,二是语法缺陷。
也许你一定觉得,Python的语法又干净,又优雅,怎么还有缺陷?但仔细想想,为什么别的语言没有这么干净?没有这么优雅?明明可以直接a=123 干嘛非要写成 int a=123;呢?难道是其他语言的设计者,都有强迫症吗?道理很简单,有得必有失。
如果数据类型,只有字符串和数字,省略掉声明变量的过程,当然不是问题。但只要逻辑一复杂,情况就完全不同了。。。游戏中,你用C#或C++写起来,大概会是这样。
技能 a=xxxx; 武器 b=xxxx; 角色 c=xxxx; 药水 d=xxxx; 音乐 e=xxxx;
而Python呢?大概是这个样子
a=xxxx b=xxxx c=xxxx d=xxxx
如果你的代码很少,显然是Python比较方便。但如果你创建几百个对象,代码超过1万行。。。写到几千行的时候,遇到一个叫x的对象,你还知道它到底是个啥吗?是一把武器?还是一瓶药水?还是一张图片?一段音频?一盏灯光?一座房子?
不要以为1万行代码很多。。。。1万行连个《斗地主》都写不完。。
用Python写大程序的感觉就是,当你第一天,只写了50行代码,创建了3个类,5个对象。你会觉得太爽了,这绝对是世界上最好的语言。。。第二天,你又创建了2个类,5个对象的时候,就觉得有点晕晕的了。第三天,又创建了2个类之后,你会发现自己必须非常仔细的看一遍注释,否则就不会写了。第四天,你一整天都在看注释。。。。
这就是动态语言的劣根性。一开始代码量少,看不出任何缺点,各种省事,各种爽。代码量越多,脑子越乱。一般500行以上,效率就会被JAVA,C#之类的语言反超。。1000行,就必须要各种加注释才能看懂了。。2000行,注释就比代码多了。。5000行,注释已经完全不管用了,自己根本看不懂自己的代码,需要准备弃坑了。
总结一下,python不是不能开发游戏,只是并不合适。每种语言都有各自的优缺点,开发游戏这一块或许就是python的缺点吧。
python游戏实例补充:
发牌游戏
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): self.cards.remove(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] self.cards.remove(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.")