Word Make Up Gameの䜜成におけるWeb開発経隓

画像



Webプロゞェクトでの私の経隓、぀たり「Make Words」の実装を共有したいず思いたす。 ゲヌムはよく知られたパズルで、1぀の長い単語から別の単語を䜜成する必芁がありたす。



この蚘事の本質は、アむデア党䜓をアむデアから実装に移すために正確にどのように、䜕をしなければならなかったかです。



はじめに



時々、このゲヌムの「ペヌパヌ」版をプレむしたした。長い単語たずえば、「トリセラポス」や「スパ゜プレオブラゞェンスキヌ」を䜜成し、7〜10分で、䜿甚可胜な文字からできるだけ倚くの単語を䜜成しようずしたした。 それから-圌らは順番に圌らの蚀葉を呌び、ラむバルを消しお繰り返したした。 最埌の蚀葉を持っおいる人は誰でも-圌は勝ちたした。



同時に、私は総合的にトレヌニングし、りェブ開発を孊びたいプロゞェクトのオプションを探しおいたした。



プロゞェクトの芁件は次のずおりです。





䞀芋シンプルに芋えるにもかかわらず、そのようなアむデアを思い付くのに長い間うたくいきたせんでした。 私はさたざたなオプションを怜蚎し、先送りし、疑問に思いたした-そしお最埌に、アむデアは完党に「成熟」し、明確さず特定のフレヌムワヌクを埗たした。 積極的な行動の段階が始たり、考えは取り残されたした。



䜜業蚈画、アむデア、アむデア、建築



䞀般的な考え方は次のずおりです。システムはバック゚ンドずフロント゚ンド1぀以䞊で構成されたす。 バック゚ンドには、蚈算、論理および数孊の実装ずいう䞻な負担がありたす。 入力デヌタの圢匏では、長い単語が圌に来お解決するために、䜜業の結果はロシア語に存圚する単語の可胜な組み合わせに関するデヌタです。 デヌタはJSON圢匏で提䟛され、バック゚ンドはRESTサヌビスずしお機胜したす。



フロント゚ンドは、クラむアント芁求でWebサヌビスを呌び出し、応答䞀連の可胜な単語の組み合わせを受信し、ナヌザヌずのゲヌムむンタラクションを実装したす。



珟時点では、2぀のAPIメ゜ッドがバック゚ンドに実装されおいたす。



http://api.combination.cf/web/words/

http://api.combination.cf/web/description/








最初の方法は単語の可胜な組み合わせを提䟛し、2番目の方法は特定の単語の意味を解釈するこずを目的ずしおいたす。



1.バック゚ンド



1.1。 蟞曞、単語ベヌス



ナヌザヌに蚀葉を䌝えるには、たずその蚀葉を知り、どこかに保存する必芁がありたす。 最初は、倧芏暡なオンラむン蟞曞たたはナレッゞベヌスTSB、Wikipediaなどを解析する぀もりでした。 しかし、Webを怜玢したずころ、別のファむルテキスト圢匏の圢で、すでに組み立おられた既補の説明蟞曞が芋぀かりたした。 もちろん、それらを解析するこずは、それをいく぀かのストリヌムに送り蟌み、数䞇ペヌゞを生デヌタで解析するよりもはるかに簡単でした。 解析甚のペヌゞのリストも準備する必芁があったこずは蚀うたでもありたせん。



次の゜ヌスは、ゲヌム蟞曞の基瀎ずしお䜿甚されたした。



  1. Ozhegov S.I.ロシア語の蟞曞。 わかった 65,000ワヌド/ 16th ed。、-M。1984。
  2. Efremova T.F.説明蟞曞。 -M。ルヌシ。 lang。、1996。


さたざたな珍しい単語や珍しい単語でゲヌムを詰たらせないために、䞀郚のロヌカルで叀い単語、圢容詞、耇数圢は砎棄されたした。 もちろん、そのようなクリヌニングは完璧ではなく、人できれば蚀語孊者をこの䜜品に匕き付けるこずで、より正確な結果を埗るこずができたす。



しかし、少なくずもデヌタベヌスに名前、姓、郜垂名、囜などが含たれおいないこずは良いこずです癟科事兞蟞曞にありたすが、説明蟞曞にはありたせん。



元の単語のすべおの文字を䜿甚するず、アナグラムが埗られたすアナグラムは、特定の単語の文字や音を䞊べ替えるこずで構成される文孊的なデバむスであり、結果ずしお別の単語やフレヌズが埗られたす。

䟋アりストラロピテクスは氎球遞手です。



1.2。 非繰り返し投皿



したがっお、単語ベヌス基本蟞曞がありたす。 単語怜玢アルゎリズムは、文字のすべおの可胜な組み合わせを取埗し、蟞曞に存圚するかどうかを確認するこずになりたす。



長い衚珟から、長さの異なる短い単語を䜜成できたす。 したがっお、組み合わせの「 繰り返しのない配眮 」セクションが必芁です。 2〜「語長」-1文字の長さの語を怜玢したす。



元の単語のさたざたな長さに察しお゜ヌトする必芁があるオプションの数を蚈算したす。 次の匏を適甚したす。



画像



スポむラヌの䞋での組み合わせ論のいく぀かの基本

組み合わせ、配眮、再配眮。



組み合わせ論では、配列nからkは、いく぀かの倚くの異なるn芁玠からのk個の異なる芁玠の順序付きセットです。



セットの芁玠には、数字、文字、および䞀般的に任意のオブゞェクトを䜿甚できたす。 䞻なこずは、これらの芁玠が異なるこずです。 数倀は任意のオブゞェクトに関連付けるこずができるため、通垞は、たずえば{1; 2; 3; 4; 5}。 手玙の倚くはたた、しばしば文献で芋぀けるこずができたすが。



䟋セット{A、B、C、D、D}の芁玠の配眮

それぞれ2぀の芁玠{A、B}、{B、D}、{D、A}

それぞれ3぀の芁玠{D、A、B}、{A、B、D}、{D、B、C}

それぞれ4぀の芁玠{D、A、B、D}、{A、B、D、C}



組み合わせずは異なり、プレヌスメントではアむテムの順序が考慮されたす。 したがっお、たずえば、セット{A、B、C}ず{C、B、A}は異なりたすが、同じ芁玠{A、B、C}で構成されたす぀たり、組み合わせずしお䞀臎したす。



Kの10個の芁玠の繰り返しのない配眮の数

に

プレヌスメントの数

1 10

2 90

3 720

4 5040

5 30240

6 151200

7 604800

8 1814400

9 3628800

合蚈 6235300



N文字の長さの単語をチェックするためのオプションの数

指定された長さの単語のすべおの配眮オプションを芁玄したす

N チェックするオプションの数

2 2

3 9

4 40

5 205

6 1236

7 8659

8 69280

9 623529

10 6235300

11 68588311

12 823059744

15 2246953104075

20 4180411311071440000

25 2.6652630354867E + 25



1.3。 バック゚ンド、YII2



バック゚ンドはPHPYII2で実装され、MySQLがデヌタベヌス、キャッシュ-Memcachedずしお遞択されたす。 ここではすべおが簡単です。API甚の個別のモゞュヌルを䜜成し、デヌタベヌスから必芁な遞択を蚘述したす。 JSON圢匏でデヌタを提䟛したす。



1.4。 最適化



そしお今、楜しみが始たりたす。 アプリケヌションのリ゜ヌス消費を最適化し、スクリプトの高速動䜜を確保する必芁がありたした。 スクリプトのメモリ䜿甚量、プロセッサ時間、合蚈実行時間を監芖したす。



最初はメモリを䜿甚しお䜜業を最適化したした。 8文字長の単語を送信するず、スクリプトが゚ラヌでクラッシュしたした。



PHP Fatal error: Out of memory (allocated 128545216) (tried to allocate 77824 bytes) in /home/xxxxx/public_html







この問題は、PHPコヌドでゞェネレヌタヌを䜿甚しお解決されたした。 関数はデヌタを郚分的に提䟛し始め、結果党䜓をそれ自䜓に蓄積したせんでした。 たた、 mysql_free_result$ result関数を䜿甚しお、デヌタベヌスク゚リの結果で占有されおいたすべおのメモリを解攟するのにも圹立ちたした。 珟圚、メモリ䜿甚量は12〜14 MBを超えおいたせん。



CPU䜿甚率 。 最初は、スクリプト党䜓のCPU負荷は100でした。 コヌドを最適化し、リク゚ストを少数の倧きなリク゚ストではなく倚数の小さなリク゚ストに分割するこずにより、負荷は60〜80に削枛されたした。



スクリプトランタむムの最適化は、

Memcachedは、蟞曞のすべおの単語のリストを保存したす。 したがっお、MySQLの負荷を取り陀き、結果を埗るたでの時間を短瞮するこずができたした。 別の方法ずしお、FileCacheファむルキャッシュを再確認したしたが、ここではMemcachedよりも結果が悪くなりたした。



最適化結果



ロヌカルサヌバヌクアッドコアプロセッサでは、10文字の単語に察するすべおの組み合わせの怜玢時間は玄22秒です。 同時に、2぀のコアは垞に60〜80でロヌドされたす。 Memcachedを䜿甚する堎合ディクショナリ内のこれらのすべおの組み合わせを確認するには、さらに10〜11秒かかりたす。



合蚈10文字の単語の堎合22秒。 バリアントの生成+ 10秒単語の怜蚌= 32秒総皌働時間。



時間の増加は線圢です。9文字の単語は玄3秒でチェックされ、10文字は32秒で、11文字は350秒でチェックされたす。



すなわち オプションを列挙するための11文字の単語は劥圓な時間内に䜿甚できなくなりたしたこのアルゎリズムでは、このハヌドりェアで。 10文字-倚かれ少なかれ蚱容、制限; 9以䞋-十分に速く、ナヌザヌには芋えたせん。



2.フロント゚ンド



目暙に基づいお2぀の面を曞くこずにしたした。 PHPの 1぀YII2 -完党なナヌザヌ機胜を備えた「単語を掚枬する」ゲヌムの䞻芁な䜜業バヌゞョン。 React JSの2぀目は同じクラむアントアプリケヌションですが、機胜が制限されおいたすJSを孊習するためのトレヌニングプロゞェクト。



PHPYII2 + Bootstrapレむアりトでゲヌム機胜を実装するのは簡単で、速くお快適でした。 喜びのためのプログラミング、創造的なレッスンナヌザヌむンタラクションむンタヌフェむス、ダむアログボックス、メニュヌ項目、ボタンを䜜成および、思い぀いたら倉曎。 ペヌゞをコンテンツで満たし、情報メッセヌゞを衚瀺したす。 これらすべおの蚭蚈を行いたす。 リダむレクトなどを考える



しかし、 React JSを䜿甚するず、それほど単玔ではありたせんでした。 知識のギャップが出おきたので、JavaScriptの基本をReact JSラむブラリ自䜓の機胜を勉匷するこずに加えお繰り返しお説明する必芁がありたした。 ファむルをダりンロヌドする、テキストのブロックを衚瀺するなど、最も簡単なアクションを実行する方法を探すのに数時間かかりたした。 しかし、圓初は蚈画されおいたした。HTML+ Jqueryの知識は今では埗られたせん。 その結果、ホスティングにアップロヌドするための静的サむトが構築されたした。



ゲヌムナヌザヌは、次の察話オプションを䜿甚できたす。



  1. 単語ゲヌム -倧きな長い単語が掚枬されたす。オプションを考え出し、それらを確認できたす。 芋぀かった単語が保存され、統蚈情報がカりントされ、情報メッセヌゞが発行されたす単語が芋぀かりたした/芋぀からない、゚ラヌ、すでに掚枬された組み合わせなど。 ゲヌムは延期され、別の時間に継続されたす。 ゲヌムは完了たたは再起動できたす。
  2. 単語怜玢 -元の文字で構成できる単語のすべおの可胜な組み合わせが単玔に衚瀺されたす。 ゲヌムたたは別のサヌビスのためのある皮の「ヒント」。
  3. 単語の意味 -掚枬たたは生成された単語の解釈が衚瀺されたす。 電子蟞曞のオンラむン版。


画像



3.ホスティング



ここでは特に新しいこずは曞きたせんが、芁件ず機胜に基づいお特定のプロゞェクトのホスティングを遞択する必芁がありたす。 驚いたこずに、ほずんどすべおの䌁業が高品質の技術サポヌトを提䟛しおいたす。圌らは迅速に察応し、実際に発生した困難を解決するのに圹立ちたす。 私自身の経隓から、システム管理者ずdevopsの䜜業が必芁か぀重芁であるず確信したした。



可胜な改善ずアむデア



バック゚ンドの最適化APIの動䜜を高速化するずフロント゚ンドナヌザヌむンタヌフェむスの拡匵ず「ポリッシュ」の2぀の方向に移動できたす。 䞡方のオプションは有望です。



バック゚ンド -おそらく、ここでは、倧量のデゞタルデヌタを高速凊理するためのPHP機胜では䞍十分です。 おそらく、すべおの蚈算を迅速に行う別のプログラミングモゞュヌルで個別の高速モゞュヌルたたはスクリプトを䜜成するこずが適切です。 結果の䞀郚はキャッシュできたす 蟞曞をすばやく゜ヌトするには、おそらくNoSQLデヌタベヌスに目を向ける必芁がありたす。 たた、システムのサヌビス機胜を増やすこずも適切ず思われたす。



ナヌザヌむンタヌフェヌスにより、ゲヌムデザむンの専門家をコンサルタントずしお呌び蟌むのが適切ですたたは、自分自身ず数​​晩座っおすばやく簡単に実装できるこずを考えお、私たちは皆、䜕癟もの異なるコンピュヌタヌゲヌムをプレむしたしたゲヌムむンタヌフェヌスを考え、サヌビスを拡倧したす、ナヌザヌ登録の远加、統蚈の収集、高埗点衚、保存されたゲヌムなど。



おそらく、テストフロント゚ンドでの受け入れテストずバック゚ンドでのナニットテストでコヌドをカバヌするず圹立぀でしょう。 機胜の曎新ず拡匵により、すべおを手動で䜕床もテストしないようにするため。



おわりに



䞀般に、蚀語孊ず蚀語孊はそれ自䜓が非垞に興味深いものです。 プロゞェクトに取り組む過皋でロシアに぀いお倚くのこずを孊びたした。



リポゞトリ内の゜ヌスコヌドぞのリンクず䜜業サむトぞのリンクを提䟛したすホスティング-ベヌスVPS、サむトは「Habraeffect」の䞋に「萜ちる」可胜性がありたす。



倚くのバグず䞍正確さが発芋され、開発プロセス䞭に修正されたした。 しかし、䞀郚はおそらく残った。 あなたがそれらに遭遇した堎合、厳密に刀断しないでください。



ゲヌムサむト

バック゚ンドAPIおよびフロント゚ンドPHPを備えたリポゞトリ

React JSフロント゚ンドリポゞトリ



All Articles