成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

兩百行代碼搞定!使用Python面向?qū)ο笞鰝€小游戲

開發(fā) 后端
我們今天同樣實現(xiàn)一個小游戲,這個小游戲非常有名,我想大家都應該玩過。它就是tic tac toe,我們打開chrome搜索一下就可以直接找到游戲了。

 [[380175]]

大家好,歡迎來到Python實戰(zhàn)專題。

我們今天同樣實現(xiàn)一個小游戲,這個小游戲非常有名,我想大家都應該玩過。它就是tic tac toe,我們打開chrome搜索一下就可以直接找到游戲了。

由于我們使用Python來實現(xiàn),并且不會制作UI界面,所以不會這么好看。雖然不夠好看,但是邏輯卻是一樣的。并且和之前我們做的那些小游戲相比,今天做的這個游戲有一個非常大的特點就是非常適合設計AI。我們只需要用很簡單的算法就可以做出一個還不錯的ai來。當然我們循序漸進,先從最簡單的游戲功能本身開始。

課題

今天的課題就是使用Python編寫一個不帶UI界面的tic tac toe的小游戲。

這一次,游戲當中會涉及兩方,所以我們需要有判斷游戲勝負手的相關邏輯。除此之外,由于涉及兩個玩家,所以我們需要設計一個AI,讓我們可以和電腦進行游戲。最后實現(xiàn)的效果差不多應該是這樣的:

也就是在游戲一開始的時候,支持玩家選擇參與游戲的兩方。這里我們先把AI算法的設計放一放,可以先做出隨機選擇的弱智AI。

游戲開始之后,雙方交替行動,每次執(zhí)行都會在屏幕上輸出相應的具體信息,以及棋盤當前的情況。

知識點

面向?qū)ο?/strong>

tic tac的游戲雖然簡單,但是它涉及的內(nèi)容還是挺多的。需要棋盤,還需要玩家,還需要添加玩家以及執(zhí)行步驟等等操作。這些邏輯如果不加以封裝,全部都寫成面向過程的話,會使得代碼非常的混亂。很明顯的,我們需要使用面向?qū)ο螅瑢@些邏輯進行抽象和封裝,來達到簡化編碼以及思考的目的。

我們目前的設計比較簡單,也不需要用到繼承以及抽象類等等高端的用法,就使用最基本的面向?qū)ο蠖x類就可以了。在Python當中定義一個類非常簡單,通過關鍵字class完成。

比如:

  1. class Game: 
  2.     pass 

構造函數(shù)

一般來說當我們定義一個類的時候都需要為它設計構造函數(shù),構造函數(shù)就是當我們創(chuàng)建這個類的實例的時候調(diào)用的方法。它會替我們完成一些初始化的工作。Python當中類的構造函數(shù)是__init__,我們直接在類當中實現(xiàn)它即可。

  1. class Game: 
  2.     def __init__(self): 
  3.         self.board = Board() 
  4.         self.players = [] 
  5.         self.markers = ['O''X'
  6.         self.numbers = [1, -1] 

比如在上面這個例子當中,我們就為Game這個類做了一些初始化的設定。比如給它賦予一個board以及players等等變量。

類方法

既然是類,自然會有屬于類的類方法。類方法的定義和普通函數(shù)的定義是一樣的,唯一不同的是它寫在類的內(nèi)部,并且第一個參數(shù)默認是self。self這個關鍵字相當于Java當中的this,指代的就是運行的時候調(diào)用方法的實例。

比如我們給Game這個類實現(xiàn)一個添加玩家的方法:

  1. class Game: 
  2.     def __init__(self): 
  3.         self.board = Board() 
  4.         self.players = [] 
  5.         self.markers = ['O''X'
  6.         self.numbers = [1, -1] 
  7.  
  8.  
  9.     def add_player(self, player): 
  10.         if player == 'h' or player == 'human'
  11.             self.players.append(HumanPlayer()) 
  12.         elif player == 'r' or player == 'random'
  13.             self.players.append(RandomPlayer()) 

我們看下add_player這個方法內(nèi)部的邏輯,我們在這個方法當中通過self關鍵字調(diào)用了類實例當中的變量。這就是為什么我們需要設定一個self參數(shù)的原因,當我們調(diào)用的時候,并不需要理會self這個參數(shù),它是Python自動為我們填充的。

當然我們定義類方法的時候也可以定義沒有self參數(shù)的方法,只不過這樣的方法不再屬于類的實例,而屬于類本身。我們想要調(diào)用的話,只能通過類名來訪問。

比如:

  1. class Test: 
  2.     def say(): 
  3.         print("hello world"

在Test這個類當中我們實現(xiàn)了一個沒有self關鍵字的say方法,如果我們通過Test的實例去調(diào)用它一定會出錯。因為我們在通過實例調(diào)用方法的時候,Python會自動為我們把實例作為第一個參數(shù)傳入。這樣就導致了接受和傳輸?shù)膮?shù)對應不上,于是引發(fā)報錯,如果我們想要調(diào)用這個say方法,應該這樣:

  1. Test.say() 

也就是說這個方法不再屬于類創(chuàng)建的實例,而屬于類本身。可以理解成Java類當中的static關鍵字修飾的方法。

方法的方法

Python當中對于方法的定義是比較靈活的,我們可以給一個類創(chuàng)建方法,同樣也可以在一個方法的內(nèi)部創(chuàng)建另外一個方法。比如下面這個例子:

  1. def outer(arg1, arg2): 
  2.      
  3.     def inner(arg1, arg2): 
  4.         return arg1 + arg2 
  5.      
  6.     return inner(arg1, arg2) 

由于Python支持函數(shù)式編程,所以方法內(nèi)部的方法還可以實現(xiàn)像是閉包、 裝飾器等等功能。不過這里我們用不到那么高端的用法,只需要會最基本的就可以了。最基本的也就是在函數(shù)內(nèi)部定義一個函數(shù),主要在這個inner函數(shù)當中是可以使用outer當中的定義的變量的。比如:

  1. def outer(arg1): 
  2.      
  3.     arg2 = 10 
  4.     def inner(arg1): 
  5.         return arg1 + arg2 
  6.      
  7.     return inner(arg1) 

上述的代碼沒有問題,不過還有一點需要注意。在inner當中雖然可以訪問到outer中定義的參數(shù)和變量,但是它是不可以修改的。如果想要修改,需要使用nonlocal關鍵字聲明這是一個外層變量。

比如:

  1. def outer(arg1): 
  2.      
  3.     arg2 = 10 
  4.     def inner(arg1): 
  5.         nonlocal arg2 
  6.         arg2 += 1 
  7.         return arg1 + arg2 
  8.      
  9.     return inner(arg1) 

通過在方法內(nèi)實現(xiàn)方法,可以進一步簡化函數(shù)內(nèi)部代碼的邏輯,把一些很復雜的函數(shù)功能進行進一步的拆分和簡化。了解這個用法,也是后面學習閉包、函數(shù)式編程等進階內(nèi)容的基礎。

尾聲

這一次的課題相比之前的,整體的實現(xiàn)難度相差不大,主要是涉及的Python文件變多了,之前都是單文件運行的Python程序。這一次需要編寫多個文件,以及這一次引入了面向?qū)ο蟮母拍睿枰獙σ恍┕δ苓M行抽象。所以總體上還是有一定難度的,如果大家做不出來的話,可以點擊查看原文,獲取我的github地址。

在這一次的項目當中,我們創(chuàng)建的是最簡單的隨機選擇的AI,完全沒有任何難度。在接下來的課題當中,我們將會使用一些ai算法,給它加上一些ai,讓它變得聰明起來,甚至變得不可戰(zhàn)勝。

本文轉(zhuǎn)載自微信公眾號「TechFlow」,作者梁唐。轉(zhuǎn)載本文請聯(lián)系TechFlow公眾號。

 

責任編輯:武曉燕 來源: TechFlow
相關推薦

2016-09-27 11:31:34

JavaScript編程語言

2020-12-07 16:20:53

Python 開發(fā)編程語言

2012-01-10 12:48:52

Java

2023-11-29 08:10:36

javascriptH5游戲

2019-05-05 09:46:01

Python代碼神經(jīng)網(wǎng)絡

2022-04-19 07:45:40

代碼Python美圖秀秀

2013-08-20 18:50:46

JS模板引擎模塊化Web App

2011-05-29 15:39:46

佳能噴墨打印機

2021-10-28 09:42:38

代碼編碼開發(fā)

2023-11-10 09:41:44

Python代碼

2019-11-18 17:05:02

JavaScript面向?qū)ο蟪绦蚓幊?/a>Java

2022-02-24 10:40:14

Python代碼

2018-03-15 13:31:48

潤乾LinuxGREP搜索

2012-12-25 10:51:39

IBMdW

2012-07-03 10:25:53

HTML5

2021-11-08 07:48:48

Go語言對象

2023-01-10 09:38:09

面向對象系統(tǒng)

2021-04-13 06:35:13

Elixir語言編程語言軟件開發(fā)

2021-08-02 13:20:31

代碼Python文件

2020-11-12 09:44:43

鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线激情 | 免费久久视频 | 久久久一| 精品无码久久久久久国产 | 亚洲精品在线免费看 | 91精品国产91久久综合桃花 | 亚洲国产成人一区二区 | 国产中文一区二区三区 | 91新视频 | 尤物视频在线免费观看 | 亚洲网在线 | 一区二区免费高清视频 | www.成人免费视频 | 国产91在线播放精品91 | 国产成人精品网站 | 亚洲视频观看 | 视频在线观看亚洲 | 9999视频| 中文字幕在线免费视频 | 成人国产精品免费观看视频 | 亚洲精品乱码久久久久久久久 | 欧美一级二级在线观看 | 欧美精品久久 | 国产精品久久久久久 | 国产美女福利在线观看 | 久久黄色网 | 日韩欧美中文在线 | 国产91丝袜在线播放 | 欧产日产国产精品99 | 久干网 | 免费h在线 | 91精品亚洲 | 午夜精品视频一区 | 精品视频在线观看 | 成人亚洲片 | 午夜精品久久久久久久久久久久 | 久久精品毛片 | 亚洲成人av一区二区 | 欧美性生交大片免费 | 91麻豆精品国产91久久久久久久久 | 亚洲精品一级 |