Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产成人精品日本,日韩黄色一级,视频一区二区三区在线观看

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          chatGPT 輔助備課案例-撲克圖片拆分

          chatGPT 輔助備課案例-撲克圖片拆分

          用Javascript給學(xué)生做個(gè)隨機(jī)發(fā)牌的案例。需要撲克的圖片素材。找到一張圖片,所有撲克圖案以6行9列的方式平均分布在整張圖片上。現(xiàn)在需要將其拆分為54個(gè)圖片。為此,向chatGPT提出如下要求:

          用python編寫代碼,將圖片文件 allpokers.jpg 拆分為54張圖片。尺寸按照6行9列的方式平均拆分。拆分出的圖片以行號(hào)加列號(hào)命名保存。

          以下是chatGPT將圖片文件 `allpokers.jpg` 拆分為 54 張圖片并保存的 Python 代碼。


          chatGPT生成的圖片分割代碼


          以上代碼中,`split_image` 函數(shù)接受圖片文件路徑、行數(shù)和列數(shù)作為參數(shù)。它使用 PIL 庫(kù)打開圖片并獲取圖片的寬度和高度。然后,根據(jù)行數(shù)和列數(shù)計(jì)算每個(gè)拆分圖塊的寬度和高度。接下來,使用雙重循環(huán)遍歷每個(gè)圖塊的位置,并使用 `crop` 方法從原始圖片中提取圖塊。最后,將每個(gè)圖塊保存為以行號(hào)加列號(hào)命名的圖片文件。

          請(qǐng)確保代碼和圖片文件 `allpokers.jpg` 在同一目錄下,并且安裝了 Pillow 庫(kù)(可以使用 `pip install Pillow` 安裝)。執(zhí)行代碼后,將會(huì)生成 54 張按照行號(hào)和列號(hào)命名的圖片文件。

          程派微信號(hào):codingpy

          如何實(shí)現(xiàn)撲克牌游戲?怎樣去表示卡牌、手牌、牌堆等概念?發(fā)牌等概念又該如何實(shí)現(xiàn)?

          本文不會(huì)細(xì)致去講這些問題,因?yàn)檫@是《Think Python 2e》第18章的具體內(nèi)容。請(qǐng)點(diǎn)擊“閱讀原文”,或者訪問http://codingpy.com/books/thinkpython2/18-inheritance.html 查看最新更新。

          第18章的題目是繼承,作者以實(shí)現(xiàn)撲克牌游戲?yàn)槔^續(xù)深入講解了面向?qū)ο缶幊痰倪@個(gè)重要特性。

          作者還在這章中介紹了一種新的開發(fā)計(jì)劃:

          1. 首先編寫讀取全局變量的函數(shù)(如有必要)。

          2. 一旦你讓程序跑起來了,開始查找全局變量和使用它們的函數(shù)的聯(lián)系。

          3. 封裝相關(guān)的變量作為一個(gè)對(duì)象的屬性。

          4. 轉(zhuǎn)換相關(guān)函數(shù)為新類的方法。

          貢獻(xiàn)者:

          翻譯:@bingjin

          校對(duì):@bingjin aka EarlGrey

          參考:@carfly

          最后,歡迎大家指正譯文中可能存在的錯(cuò)誤,或是將此中譯版分享給更多的人。

          克的玩法非常多,常見的就有斗地主、跑得快、五十K、拖拉機(jī)、等等。在國(guó)內(nèi)的不同地方,同類游戲的玩法也有不同講究。粗略估計(jì),國(guó)內(nèi)的撲克玩法,超過上百種。

          要短期內(nèi)開發(fā)出這么多款撲克游戲,需要先對(duì)大多數(shù)撲克游戲進(jìn)行系統(tǒng)的分析,歸納總結(jié),然后打造一條流水線,每一款游戲都使用相同的框架,使用通用的零組件,等等。本文主要內(nèi)容就是講述這個(gè)設(shè)計(jì)過程。


          1.算法庫(kù)

          撲克游戲的歷史很悠久,能夠廣為流行的一個(gè)原因就是上手比較容易。就算在今天,如果說一個(gè)人沒讀過書就學(xué)不會(huì)打撲克,這沒人會(huì)相信。所以我估計(jì)撲克游戲的算法,都是比較簡(jiǎn)單的。歸納一下,一般包括:

          - 牌的大小(包括數(shù)字、花色等);牌的數(shù)目和分?jǐn)?shù);判斷幾張牌相同或連續(xù);

          - 還需要一些對(duì)一組牌進(jìn)行操作的算法,比如取出、合并等等。

          基于以上的分析,我們估計(jì)可以完成一套通用的撲克的算法庫(kù),能滿足所有撲克游戲。最后實(shí)踐證明,撲克算法庫(kù)比預(yù)期稍微復(fù)雜一點(diǎn),但仍在可接受范圍內(nèi)。

          此外,我們很容易發(fā)現(xiàn),很多流行的手游的玩法、功能層出不窮,開發(fā)團(tuán)隊(duì)頻繁升級(jí)迭代。相反,撲克游戲的玩法相對(duì)固定,演化相對(duì)較慢。所以,在系統(tǒng)設(shè)計(jì)上,我們假定撲克游戲的數(shù)量有限,玩法有限,發(fā)展慢。這樣的好處是流水線設(shè)計(jì)好之后,以后改動(dòng)很小,維護(hù)工作量也比較小。

          2.交互UI庫(kù)

          撲克游戲可以歸納出3個(gè)核心要素:牌、規(guī)則、人(玩家)。對(duì)撲克游戲的一種高度抽象的描述是:**按照一定的流程和規(guī)則,每個(gè)人通過選擇選項(xiàng)、選擇牌、選擇數(shù)值,來爭(zhēng)取獲勝的一種游戲。**

          歸納了一下,玩家的行為包括以下3種:

          - 對(duì)游戲流程中的選項(xiàng),做出選擇

          比如斗地主中的叫地主、不搶,都是玩家自己要做的一種選擇。出牌的時(shí)候選擇不出,也是一種選擇。后續(xù)會(huì)將“選項(xiàng)”稱之為“命令”。

          - 按照游戲規(guī)則,對(duì)牌進(jìn)行選擇。

          - 比如選擇要出的牌,分組擺牌等。

          - 對(duì)數(shù)值(分?jǐn)?shù))進(jìn)行選擇。

          以上三種玩家的行為,決定了游戲客戶端需要提供哪些業(yè)務(wù)級(jí)UI庫(kù),對(duì)應(yīng)下面幾種:

          - 一組按鈕

          由玩家選擇其中一個(gè)按鈕;在業(yè)務(wù)層,稱為**命令選擇器**

          - 選牌或牌分組的UI

          > 允許玩家在一組牌中選出符合要求的牌。牌分組UI則允許玩家將牌放入不同分組或按不同順序排布。這2種在業(yè)務(wù)層都稱為**牌選擇器**

          - 選擇數(shù)值的UI

          > 可以用滑動(dòng)條,也有用按鈕的。在業(yè)務(wù)層稱為**值選擇器**

          以上我們抽象出了撲克游戲的3個(gè)核心要素,以及玩家使用的3類UI。現(xiàn)在我們思考一下?lián)淇擞螒蜻€需要哪些UI。

          除了牌、規(guī)則、人,實(shí)際上我們還需要房間(桌子)、椅子(座位)。

          一款撲克游戲有很多界面、子界面;我們大體將其分為:房間內(nèi),房間外。房間內(nèi)就是一個(gè)桌面,UI都顯示到桌面上。房間外包括一些撲克游戲的常用界面和功能:注冊(cè)、登錄、用戶信息;房間列表;查詢(分?jǐn)?shù)記錄、排名等);其他比如:公告、幫助、設(shè)置。這些都可以做成通用的幾套,不同游戲選擇其中的一套即可。房間內(nèi)除了3類選擇器,還需要下面一些界面UI:座位、牌(比如公共牌、出牌)、定時(shí)器、圖片、文本(用于顯示數(shù)值或文字)。這里除了一些業(yè)務(wù)級(jí)別的UI對(duì)象,也包含一些基礎(chǔ)的UI對(duì)象。

          3.管理員與通訊庫(kù)

          現(xiàn)實(shí)中,幾個(gè)朋友坐一桌打撲克的時(shí)候,每個(gè)人都按照流程和規(guī)則來,大家共同監(jiān)督。而對(duì)于線上的撲克游戲,其實(shí)有一個(gè)規(guī)則執(zhí)行者,不妨稱之為**管理員**(我們前面將選項(xiàng)稱之為“命令”,可以理解為:管理員下達(dá)出牌的命令,由玩家選擇出牌還是不出。所以,“選項(xiàng)”是站在玩家角度,“命令”是站在管理員角度)。那么前文的說法,可以進(jìn)一步升級(jí)為:**撲克游戲就是由管理員控制一套流程規(guī)則,特定的時(shí)候交由玩家來選擇選項(xiàng)、選擇牌、選擇值,這樣一種競(jìng)賽游戲。**這里我們引入了管理員的概念。

          下面說通訊庫(kù):

          幾個(gè)朋友坐一桌打撲克的時(shí)候,比如發(fā)牌,每個(gè)人收到的牌,其他人不能看到;再比如一個(gè)人出牌,是要給其他人看到。現(xiàn)實(shí)中打牌,我們是靠視覺來看,相當(dāng)于靠光線傳播數(shù)據(jù)(圖像),而對(duì)于網(wǎng)絡(luò)游戲,則需要的是一個(gè)通訊庫(kù)通過網(wǎng)絡(luò)傳輸數(shù)據(jù)。我們不能僅僅提供一個(gè)簡(jiǎn)單的基于socket、websocket、http封裝(比如常見的封裝接口有

          read_cmd,read_version,read_int,read_string....),這太底層了,我們需要的是一個(gè)業(yè)務(wù)級(jí)別的通訊庫(kù)。

          比如你跟你老婆說:晚上加班要11點(diǎn)回去,你老婆說“好的”。通訊庫(kù)應(yīng)該是這樣的:

          創(chuàng)建一問一答的異步請(qǐng)求,發(fā)給老婆;

          請(qǐng)求分類是告假(晚上晚回);參數(shù)是11點(diǎn);

          答復(fù)選項(xiàng)是3種:好的;不行;超時(shí);(如果你老婆不是話癆的話)

          再比如人事部給每個(gè)員工發(fā)短信,內(nèi)容是本月工資明細(xì)。通訊庫(kù)就是群發(fā)短信,格式相同,但內(nèi)容不同。

          通過分析一些撲克游戲,我們從這樣幾個(gè)層面進(jìn)行設(shè)計(jì)抽象:通訊方向、是否應(yīng)答、發(fā)送目標(biāo)、單發(fā)還是群發(fā)。其中:不需要答復(fù)的,我們叫通知;需要答復(fù)的,我們叫“命令”或“請(qǐng)求”。從客戶端發(fā)向管理員,稱之為“客戶端請(qǐng)求”;從管理員向客戶端發(fā)送,稱之為“服務(wù)端命令”;最終,我們把通訊歸納成5種模板:**客戶端請(qǐng)求;服務(wù)端命令;服務(wù)端廣播;服務(wù)端私有通知;服務(wù)端公開通知;**

          有了通訊庫(kù),我們需要往里面塞數(shù)據(jù),數(shù)據(jù)包括:通訊類型名稱、命令選項(xiàng)、數(shù)值、牌。實(shí)際上數(shù)據(jù)內(nèi)容也正是對(duì)應(yīng)了**選擇選項(xiàng)、選擇牌、選擇數(shù)值**

          舉個(gè)例子:比如輪到一個(gè)玩家出牌了,我們使用**服務(wù)端命令**定義了一個(gè)出牌命令,這是一問一答的通訊,管理員發(fā)送時(shí),不攜帶數(shù)據(jù)。客戶端答復(fù)時(shí),選項(xiàng)包括:出、不出;如果出牌,則需要攜帶出的牌。

          再舉一個(gè)例子:游戲結(jié)束時(shí)需要通知輸贏,這時(shí)可以使用**服務(wù)端公開通知**,就是服務(wù)端給每一個(gè)玩家發(fā)送通知,通知內(nèi)容是這一局輸了還是贏了,贏了多少金幣。那么,這個(gè)通訊中,攜帶的就是贏的金幣(如果為負(fù)值,則表明是輸)

          總結(jié)一下:套用這5種模板,通過定義名稱、攜帶的數(shù)據(jù),來定義游戲中特定的通訊過程。比如拖拉機(jī)游戲中有以下幾種通訊的定義:發(fā)牌公開通知、亮主請(qǐng)求、亮主結(jié)果廣播、扣底牌命令、扣底牌通知、出牌命令、出牌結(jié)果廣播、結(jié)算通知。此外所有游戲都會(huì)用到一些公共的通訊定義:坐下請(qǐng)求、站起請(qǐng)求、一局開始廣播、一局結(jié)束廣播、聊天等。

          在通訊中,還涉及到數(shù)據(jù)對(duì)不同客戶端的可見性的問題,這里就不再深入介紹了。

          4.流程

          通過分析數(shù)十款不同特點(diǎn)的撲克游戲,整理了下面一種思路:

          所有撲克游戲,在概念上,可以這樣劃分:

          - **一局**

          比如斗地主,從發(fā)牌,到出牌,到結(jié)束,這是一局。一局結(jié)束后,開始下一局。

          - **階段**

          一局游戲可以劃分成幾個(gè)階段,比如發(fā)牌階段,出牌階段,結(jié)算階段;

          - **一輪**

          大多數(shù)撲克游戲都是每個(gè)人輪著來的。還有一些游戲(或者游戲中的某個(gè)環(huán)節(jié))是允許搶先的(比如拖拉機(jī)的亮主)。在技術(shù)上,一輪就是一個(gè)異步循環(huán),提供很多參數(shù)和控制。

          以上是為了方便而從概念上劃分的,并不絕對(duì),使用這樣一種套路,開發(fā)不同撲克游戲時(shí),可以更加統(tǒng)一了。

          5.組裝

          到目前為止,我們已經(jīng)完成了下面的成品模塊、框架、零組件。

          - 一套撲克算法庫(kù)

          - 房間內(nèi)的UI庫(kù)

          命令選擇器;牌選擇器;值選擇器;頭像、牌、圖片、文本;

          - 房間外的幾套成品模塊

          注冊(cè)、登錄、用戶信息;房間列表;查詢(分?jǐn)?shù)記錄、排名等);其他比如:公告、幫助、設(shè)置。

          - 5種通訊類模板

          客戶端請(qǐng)求;服務(wù)端命令;服務(wù)端廣播;服務(wù)端私有通知;服務(wù)端公開通知;

          - 流程庫(kù)

          提供一局、階段、一輪等控制;

          對(duì)于不同撲克游戲,我們首先要把游戲玩法弄清楚,然后用這些成品模塊、框架、零組件,通過配置,通過編寫一些代碼來進(jìn)行粘合,從而實(shí)現(xiàn)一個(gè)完整的游戲。

          在實(shí)際的開發(fā)過程中我們驗(yàn)證了:對(duì)于簡(jiǎn)單的游戲,三五天就可以完成,對(duì)于極其復(fù)雜的游戲,一般在1\~2周(比如拖拉機(jī)這類游戲)。這里說的是一個(gè)人,同時(shí)也包含自測(cè)時(shí)間。

          為了提升粘合的效率,開發(fā)一個(gè)圖形化編程工具,這里附上一些截圖供參考:

          - 主界面


          - 函數(shù)庫(kù)


          除了算法庫(kù)、UI庫(kù)以外,還包含了編程語言級(jí)別的函數(shù)、流程控制函數(shù)等。

          - 牌型算法的例子


          > 有了這個(gè)工具,寫牌型算法就快多了。

          - 流程控制


          這個(gè)圖中的例子,包括了對(duì)一副牌進(jìn)行洗牌,每次取出17張牌,在一個(gè)循環(huán)中,給每一個(gè)玩家發(fā)牌。下面是用英文顯示函數(shù)的樣子:


          實(shí)際使用過程中,還是習(xí)慣英文編程。切換到中文相當(dāng)于看看文檔。

          - 調(diào)試


          調(diào)試的時(shí)候,可以隨時(shí)看一組牌是什么牌,這樣很方便,對(duì)開發(fā)效率的提升很明顯。

          以上介紹的圖形化開發(fā)工具,已經(jīng)具備的工程管理、圖形化編程(編輯)、調(diào)試、發(fā)布、以及界面設(shè)置等輔助功能為一體的集成化開發(fā)環(huán)境。是圖形化編程的一次有益的嘗試。

          6.測(cè)試

          技術(shù)人員自己可以搞定的測(cè)試是:?jiǎn)卧獪y(cè)試;功能測(cè)試;性能測(cè)試(壓力測(cè)試);我們還請(qǐng)了專業(yè)的測(cè)試團(tuán)隊(duì)進(jìn)行了游戲內(nèi)測(cè)。

          簡(jiǎn)單的公測(cè):找老家親戚朋友拉微信群,有些朋友人脈廣,可以拉很多人。然后每天集中半小時(shí)搞一次測(cè)試,玩5局發(fā)10元紅包,連續(xù)測(cè)試一周就差不多了。這種測(cè)試還挺有效,而且投入不大。

          7.進(jìn)展

          目前,項(xiàng)目已經(jīng)基本達(dá)成了技術(shù)目標(biāo),所有撲克游戲使用了同一套算法庫(kù)(C++代碼使用emscripten轉(zhuǎn)為javascript)、同一套UI庫(kù)(html5/pixi.js)、兩套標(biāo)準(zhǔn)的大廳,同一個(gè)服務(wù)器程序(C++),同一套通訊庫(kù)(javascript)。另外還有:管理和監(jiān)控后臺(tái);服務(wù)器更新;客戶端更新;html5錯(cuò)誤上報(bào);C++錯(cuò)誤上報(bào)等等。

          除C++代碼未開源,其他代碼都開源了,文檔齊全,放在gitee上了,歡迎大家下載使用,歡迎提意見和交流。

          (在html5瀏覽器兼容性方面有一些問題,比如UC瀏覽器、搜狗瀏覽器,特別需要熟悉這塊的同學(xué)能給與一些幫助.)

          [gitee.com/szcuipeng/public](https://gitee.com/szcuipeng/public)

          8.作者的話

          作者風(fēng)馬9年前進(jìn)入到游戲行業(yè),也有幸在一家上市游戲公司擔(dān)任技術(shù)副總監(jiān),并承擔(dān)過游戲引擎主程的工作。如果有機(jī)會(huì),我很想去加入古劍或河洛的團(tuán)隊(duì)中去學(xué)習(xí)。我大學(xué)出來后大部分時(shí)間里,從事的是GIS(地圖編輯、空間分析、圖形)開發(fā),也有一部分跟AutoCAD有關(guān),都是windows客戶端。一個(gè)團(tuán)隊(duì)40多號(hào)人,開發(fā)企業(yè)用大型客戶端,當(dāng)時(shí)在國(guó)內(nèi)也頗為壯觀。現(xiàn)在看到米國(guó)禁止咱們大學(xué)用MATLAB,我也很想投入到這些領(lǐng)域中。

          自己一直喜歡干技術(shù),雖然早已是大齡,但也一直堅(jiān)持干技術(shù),是因?yàn)閺拇髮W(xué)時(shí)候起,就想在技術(shù)上干出一點(diǎn)名堂來。那時(shí)自己仰望一些技術(shù)大牛,就像小蝦米仰望14本天書中的大俠一樣,希望有一天像他們一樣,成為技術(shù)界的俠之大者,成為對(duì)社會(huì)對(duì)行業(yè)有用的人。


          主站蜘蛛池模板: 亚洲AV无码第一区二区三区| 一区二区三区免费视频网站 | 亚洲一区免费在线观看| 91video国产一区| 日韩视频在线观看一区二区| 亚洲一区二区三区亚瑟 | 日本激情一区二区三区| 东京热无码av一区二区| 国产一区二区三区在线观看影院| 亚洲国产成人久久综合一区| 无码一区二区三区视频| 区三区激情福利综合中文字幕在线一区| 亚洲色精品VR一区区三区| 亚洲一区综合在线播放| 日韩精品成人一区二区三区| 在线观看国产一区| 亚洲A∨精品一区二区三区 | 久久亚洲中文字幕精品一区| 国产一区二区三区手机在线观看 | 国产成人无码AV一区二区在线观看| 日韩精品一区二区三区老鸦窝| 五月婷婷一区二区| 亚洲一区无码中文字幕乱码| 色久综合网精品一区二区| 日本成人一区二区三区| 久久高清一区二区三区| 日韩精品无码中文字幕一区二区| 日本不卡一区二区视频a| 日韩精品在线一区二区| 日本一区二区不卡在线| 久久精品一区二区东京热| 国产一区二区三区夜色| 国产一区二区免费视频| 日韩精品一区二区三区色欲AV| 精品人妻一区二区三区浪潮在线| 日韩一区二区超清视频| 精品国产一区在线观看 | 国产精品制服丝袜一区| 亚洲欧洲日韩国产一区二区三区 | 国产91精品一区| 极品少妇伦理一区二区|