Π”ΠΈΠΏΠ»ΠΎΠΌ, курсовая, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π°
ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚

Π˜Π³Ρ€Π° Β«Π‘Π°Π»Π΄Π°Β» с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ сСти

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ сСтСвой ΠΈΠ³Ρ€Ρ‹ основной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ являСтся Π²Ρ‹Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ»Π° распрСдСлСния суммарного Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ сформированной самими ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ сСтСвой структурС. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» распрСдСлСния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π¨Π΅ΠΏΠ»ΠΈ (классичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈΠ³Ρ€), построСнный ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ сСтСвой… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π˜Π³Ρ€Π° Β«Π‘Π°Π»Π΄Π°Β» с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ сСти (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π˜Π³Ρ€Π° «Π‘Π°Π»Π΄Π°» с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€Π° Π±Π°Π»Π΄Π°

Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΈΠ³Ρ€Ρ‹ (ΠΈΠ³Ρ€Ρ‹ с ΡΠ΅Ρ‚Π΅Π²ΠΎΠΉ структурой) ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΈΠ³Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ формирования связСй ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ Π² ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½ΠΎ-управляСмых систСмах, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° опрСдСлСния Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ΠΉ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ этих связСй. Π’ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚Ρ€ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ связСй ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ: стратСгичСский, ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΈΠΉ.

ΠŸΡ€ΠΈ стратСгичСском ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ³Ρ€Ρƒ Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ нСзависимо Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ свою ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ (мноТСство ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΆΠ΅Π»Π°Π΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ связь ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ ΡΠ²ΡΠ·ΠΈ Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π±ΠΎΡ€Π° формируСтся сСтСвая структура, которая ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ².

Π’ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ сСтСвой ΠΈΠ³Ρ€Ρ‹ основной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ являСтся Π²Ρ‹Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ»Π° распрСдСлСния суммарного Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ сформированной самими ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ сСтСвой структурС. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» распрСдСлСния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π¨Π΅ΠΏΠ»ΠΈ (классичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈΠ³Ρ€), построСнный ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ сСтСвой структуры взаимодСйствия.

ΠŸΡ€ΠΈ рассмотрСнии динамичСского ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° прСдполагаСтся, Ρ‡Ρ‚ΠΎ сСтСвая структура ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ согласно Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ порядку очСрСдности Ρ…ΠΎΠ΄ΠΎΠ². ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· ΡΠ΅Ρ‚ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΎΡΡΡ‰ΡƒΡŽ Π΅ΠΌΡƒ Π²Ρ‹Π³ΠΎΠ΄Ρ‹ связь, Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ²Ρ‹Π³ΠΎΠ΄Π½Ρ‹Π΅ связи.

«Π‘Π°Π»Π΄Π°» — лингвистичСская Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Π°Ρ ΠΈΠ³Ρ€Π° для 2—4 ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ слова с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΡƒΠΊΠ², добавляСмых ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Π’ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, слова ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ посрСдством ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² ΠΎΡ‚ Π±ΡƒΠΊΠ²Ρ‹ ΠΊ Π±ΡƒΠΊΠ²Π΅ ΠΏΠΎΠ΄ прямым ΡƒΠ³Π»ΠΎΠΌ.

1. ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния, ΠΎΠ±Π·ΠΎΡ€ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ срСдству

1.1 ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΎΠ± ΠΈΠ³Ρ€Π΅ «Π‘Π°Π»Π΄Π°»

Π’ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ прСдставляСт собой 25-ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ячСйки/ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ строки ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТат ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Π΅, Π° ΡΡ‚Ρ€ΠΎΠΊΠ° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ — ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ 5-Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π°Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ имя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π² ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠ°Π΄Π΅ΠΆΠ΅ ΠΈ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΠΎΠΌ числС (мноТСствСнном числС, Ссли слово Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнного числа). Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ поля, располоТСниС ΠΈ Π΄Π»ΠΈΠ½Π° слова ΠΌΠΎΠ³ΡƒΡ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ количСство пустых ΠΊΠ»Π΅Ρ‚ΠΎΠΊ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ³Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‡Ρ‘Ρ‚Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ ΠΎΠ±ΠΎΠΈΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π±Ρ‹Π»ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство Ρ…ΠΎΠ΄ΠΎΠ²/слов.

Π’ΠΎ Π²Ρ€Π΅ΠΌΡ своСго Ρ…ΠΎΠ΄Π° ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΡƒΠΊΠ²Ρƒ Π² ΠΊΠ»Π΅Ρ‚ΠΊΡƒ, ΠΏΡ€ΠΈΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΡƒΡŽ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ/Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ (Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ «ΠšΠΎΡ€ΠΎΠ»Π΅Π²ΡΠΊΠΈΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚» Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ) ΠΊ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ ΠΊΠ»Π΅Ρ‚ΠΊΠ΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»Π°ΡΡŒ нСразрывная ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰Π°ΡΡΡ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ ломаная («Π·ΠΌΠ΅ΠΉΠΊΠ°») ΠΈΠ· ΠΊΠ»Π΅Ρ‚ΠΊΠΈ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»Π΅Ρ‚ΠΎΠΊ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ собой слово (ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ описанным Π²Ρ‹ΡˆΠ΅ трСбованиям), ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄ (Ссли ΠΎΠ±Π° ΠΈΠ³Ρ€ΠΎΠΊΠ° Ρ‚Ρ€ΠΈΠΆΠ΄Ρ‹ подряд ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Ρ…ΠΎΠ΄, Ρ‚ΠΎ Ρ„иксируСтся Π½ΠΈΡ‡ΡŒΡ). Π’ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°:

Π˜Π³Ρ€ΠΎΠΊΠΈ ходят ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ (Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ «ΠšΠΎΡ€ΠΎΠ»Π΅Π²ΡΠΊΠΈΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚» для Π΄Π²ΡƒΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Ρ…ΠΎΠ΄Ρ‹ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊ, Ссли Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ Ρ…ΠΎΠ΄, добавляСт подряд Π΄Π²Π΅ Π±ΡƒΠΊΠ²Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ).

КаТдая ΠΊΠ»Π΅Ρ‚ΠΊΠ° содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Π±ΡƒΠΊΠ²Ρƒ, каТдая Π±ΡƒΠΊΠ²Π° Π² ΡΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΠΎΠΌ словС приносит ΠΈΠ³Ρ€ΠΎΠΊΡƒ ΠΎΠ΄Π½ΠΎ ΠΎΡ‡ΠΊΠΎ.

Π‘Π»ΠΎΠ²ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ хотя Π±Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ‚ΠΎΠ»ΠΊΠΎΠ²ΠΎΠΌ ΠΈΠ»ΠΈ энциклопСдичСском словарС (ΠΈΠ»ΠΈ энциклопСдии), ΠΏΡ€ΠΈ этом Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ΡΡ Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, слова с ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ-Π»Π°ΡΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ (банька, Π΄ΠΎΡ‡ΡƒΡ€ΠΊΠ°, Π½ΠΎΠΆΠΈΠΊ) ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎ-ΠΎΡ†Π΅Π½ΠΎΡ‡Π½Ρ‹ΠΌΠΈ суффиксами (Π΄ΠΎΠΌΠΈΠ½Π°, Π·Π²Π΅Ρ€ΡŽΠ³Π°, Π½ΠΎΠΆΠΈΡ‰Π°), Ссли Ρ‚Π°ΠΊΠΈΠ΅ слова Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ слова, Π½Π΅ Π²Ρ…одящиС Π² ΡΠΎΡΡ‚Π°Π² русского Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ языка, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²ΡƒΠ»ΡŒΠ³Π°Ρ€ΠΈΠ·ΠΌΡ‹, Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚ΠΈΠ·ΠΌΡ‹ ΠΈ ΠΆΠ°Ρ€Π³ΠΎΠ½ΠΈΠ·ΠΌΡ‹ (ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ словарныС ΠΏΠΎΠΌΠ΅Ρ‚Ρ‹ Π²ΡƒΠ»ΡŒΠ³., Π΄ΠΈΠ°Π»., ΠΎΠ±Π»., ΠΆΠ°Ρ€Π³. ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сокращённыС названия ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²).

Π‘Π»ΠΎΠ²Π° Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ³Ρ€Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚, Π΄Π°ΠΆΠ΅ Ссли это ΠΎΠΌΠΎΠ½ΠΈΠΌΡ‹ (Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ «ΠšΠΎΡ€ΠΎΠ»Π΅Π²ΡΠΊΠΈΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚» запрСщаСтся составлСниС слов, ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π²ΡˆΠΈΡ…ΡΡ Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»Π΅, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ составлСны Π½ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²).

Π˜Π³Ρ€Π° заканчиваСтся Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ всС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, Π»ΠΈΠ±ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ слово согласно ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. Π’Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΈΠ³Ρ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π±Π΅Ρ€Ρ‘Ρ‚ большСС количСство ΠΎΡ‡ΠΊΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ случая Π½ΠΈΡ‡ΡŒΠΈ послС Ρ‚Ρ€ΠΎΠ΅ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ пропуска Ρ…ΠΎΠ΄Π° ΠΎΠ±ΠΎΠΈΠΌΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ.

Рисунок 1.1.1 Π˜Π³Ρ€Π° «Π‘Π°Π»Π΄Π°». Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅.

1.2 ΠžΠ±Π·ΠΎΡ€ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²

1. Андройд-прилоТСния «King Square».

Рисунок 1.2.1 Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° прилоТСния King Square

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ King Square устанавливаСтся Π½Π° ΠΠ½Π΄Ρ€ΠΎΠΉΠ΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ.

Π˜ΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° поля. Π’Π°ΠΊ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π²ΠΎΠ΄Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ слова.

Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ взаимодСйствиС осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ-ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚.

Рисунок 1.2.2 ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈΠ³Ρ€Ρ‹ прилоТСния King Square.

Π˜Π³Ρ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ приятный интСрфСйс. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ слова осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΈ Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠ΅Π½ΡΠΎΡ€Π½ΠΎΡΡƒ экрану.

Рисунок 1.2.3 ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈΠ³Ρ€Ρ‹ прилоТСния King Square.

1.3 ВрСбования ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ срСдству

НазначСниС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

ЦСлью Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прилоТСния являСтся созданиС прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ «Π‘Π°Π»Π΄Π°» Π³Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π»ΠΈΠ±ΠΎ ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ.

ВыполняСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Β· Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈΠ³Ρ€Ρ‹. ДоступныС Ρ€Π΅ΠΆΠΈΠΌΡ‹:

1. Π˜Π³Ρ€Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

2. БСтСвая ΠΈΠ³Ρ€Π°.

Β· ΠŸΡ€ΠΈ создании ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ для ΠΈΠ³Ρ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ количСство ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ для Π²Π²ΠΎΠ΄Π° слов.

Β· ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Β· Π‘ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ взаимодСйствия с ΠΈΠ½Ρ‚СрфСйсом.

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π’ качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ скачиваСмыС Ρ„Π°ΠΉΠ»Ρ‹, описания Ρ„Π°ΠΉΠ»ΠΎΠ².

ВрСбования ΠΊ ΡΠΎΡΡ‚Π°Π²Ρƒ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ тСхничСских срСдств

Β· ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€: рСкомСндуСмая частота — 1.0 Π“Π“Ρ† ΠΈ Π²Ρ‹ΡˆΠ΅.

Β· ΠžΠ—Π£: Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 512 Мб.

Β· ЖСсткий диск: 32-bit — Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 850 Мб, 64-bit — Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 2 Π“Π±.

ВрСбования ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ совмСстимости

На ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ установлСно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС:

Β· .Net Framework 4.5

1.4 ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ курсового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ срСдство, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ собой ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ «Π‘Π°Π»Π΄Π°». Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, описанныС Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 1.3.

2. Анализ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠŸΠ‘ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ

2.1 ОбоснованиС Π²Ρ‹Π±ΠΎΡ€Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.NET Framework состоит ΠΈΠ· ΠΎΠ±Ρ‰Π΅ΡΠ·Ρ‹ΠΊΠΎΠ²ΠΎΠΉ срСды выполнСния (срСды CLR) ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ классов.NET Framework. Основой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.NET Framework являСтся срСда CLR. Π‘Ρ€Π΅Π΄Ρƒ выполнСния ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π°Π³Π΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ выполнСния ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт основныС слуТбы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ взаимодСйствиС. ΠŸΡ€ΠΈ этом Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ условия строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ точности ΠΊΠΎΠ΄Π°, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ. ЀактичСски основной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ срСды выполнСния являСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обращаСтся ΠΊ ΡΡ€Π΅Π΄Π΅ выполнСния, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ управляСмым ΠΊΠΎΠ΄ΠΎΠΌ, Π° ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ся ΠΊ ΡΡ€Π΅Π΄Π΅ выполнСния, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° классов являСтся комплСксной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ — начиная с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, запускаСмых ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с Π³Ρ€Π°Ρ„ичСским интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (GUI), ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ прилоТСниями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ послСдниС тСхнологичСскиС возмоТности ASP.NET, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Web Forms ΠΈ Π²Π΅Π±-слуТбы XML.

Класс TcpClient Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ€Π΅ΡΡƒΡ€ΡΠ° Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΡΠ²ΠΎΠΉΡΡ‚Π²Π° TcpClient Ρ€Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΡŽΡ‚ свСдСния для создания Socket для запроса ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ устройство прСдставлСно Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ с ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ.NET Framework ΠΏΠΎΡ‚ΠΎΠΊΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP устанавливаСт соСдинСниС с ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ пользами, соСдинСниС ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅, ΠΈ ΡΠ±ΠΎΡ€ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TCP, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ адрСс устройства сСти ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ слуТбы, ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ TCP-ΠΏΠΎΡ€Ρ‚, слуТба ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

TcpListener ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для контроля ΠΏΠΎΡ€Ρ‚ΠΎΠ² для входящих запросов, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π‘ΠΎΠΊΠ΅Ρ‚ ΠΈΠ»ΠΈ TcpClient, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ управляСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. ΠœΠ΅Ρ‚ΠΎΠ΄Start Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ Stop ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ AcceptTcpClient ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ запросы входящСго ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ‚ TcpClientдля ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ AcceptSocket ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ запросы входящСго ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ‚ Π‘ΠΎΠΊΠ΅Ρ‚ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ созданиС сСрвСр Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сСти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° TcpListener Π½Π° TCP-ΠΏΠΎΡ€Ρ‚ 13. ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ запроса входящСго ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, сСрвСр ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ· Ρ…оста-сСрвСра.

2.2 БпСцификация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ

Π Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прСдставлСна Π½Π° EDF0 Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ этапы функционирования систСмы.

1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚ΠΎΠΌ этапС Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΈΠ³Ρ€Ρ‹, количСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. Боздаётся ΠΊΠΎΠΌΠ½Π°Ρ‚Π°. Π’ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΠ³Ρ€Ρ‹ производятся настройка ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΡ€Ρ‚Π° прилоТСния (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это 1986). Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ этапа — запрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ ΠΈΠ³Ρ€Ρ‹. Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΠ³Ρ€Ρ‹, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ³Ρ€Ρ‹.

2. ОТиданиС ΠΎΠΏΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². На ΡΡ‚Π°ΠΏΠ΅ оТидания ΠΎΠΏΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΡŒΠ»Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡΡ ΠΊ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅. Если Π²Ρ‹Π±Ρ€Π°Π½ сСтСвой Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠ³Ρ€Ρ‹, Ρ‚ΠΎ ΡΡ‚ΠΎΡ‚ этап пропускаСтся ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΡ‚Π°ΠΏΡƒ «ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΈΠ³Ρ€Ρ‹». Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹. Π’Ρ‹Ρ…ΠΎΠ΄Π½Π²Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — список участников.

3. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΈΠ³Ρ€Ρ‹ На ΡΡ‚ΠΎΠΌ этапС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠΎΡ‡Π΅Ρ€Ρ‘Π΄Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π±ΡƒΠΊΠ²Ρ‹ Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ слова, ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚ ΠΈΡ… Π²Ρ‹Π±ΠΎΡ€. ΠŸΡ€ΠΎΡ†Π΅ΡΡ продолТаСтся ΠΏΠΎΠΊΠ° Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ слов Π΅ΡΡ‚ΡŒ свободныС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ. Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — список участников, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ настройки. Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — заполнСнная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈ ΡΡ‚атистика ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ².

4. ПодвСдСниС ΠΈΡ‚ΠΎΠ³ΠΎΠ² ΠΈΠ³Ρ€Ρ‹.

На ΡΡ‚ΠΎΠΌ этапС поднимаСтся статистика Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… слов. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡΡ подсчёт Π±ΡƒΠΊΠ². Π˜Π³Ρ€ΠΎΠΊ, Π½Π°Π±Ρ€Π°Π²ΡˆΠΈΠΉ наибольшСС количСство Π±ΡƒΠΊΠ² становится ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ. Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — заполнСнная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈ ΡΡ‚атистика ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ². Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ³Ρ€Ρ‹ (имя побСдитСля).

3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ классы прилоТСния ΠΈ ΠΈΡ… ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅

Имя класса

ОписаниС класса

Π›ΠΎΠ³ΠΈΠΊΠ° отобраТСния

DisplayManager

Класс, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… элСмСнтов управлСния.

DisplaySettings

Класс-Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΡŒ настроСк для отобраТСния.

GameLogicControls

Класс Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΡŒ элСмСнтов управлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ ΠΈΠ³Ρ€Ρ‹.

DisplayCell

Π―Ρ‡Π΅ΠΉΠΊΠ° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. Π˜Π³Ρ€ΠΎΠ²ΠΎΠΉ элСмСнт управлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π²ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ

ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ

NegotiationManager

Класс посрСдник. БвязываСт ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π»ΠΎΠ³ΠΈΠΊΡƒ отобраТСния, ΠΈΠ³Ρ€ΠΎΠ²ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ сСрСлизации сообщСний для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ.

БСтСвая Π»ΠΎΠ³ΠΈΠΊΠ°

NetworkManager

Боздания ΠΊΠΎΠΌΠ½Π°Ρ‚, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ, ооповСщСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ Π½Π΅ΠΎΠ±Ρ…одимости смСны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°.

NetworkMassageHandler

Класс для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ состояния прилоТСния.

MessageType

Π’ΠΈΠΏ сообщСния

NetworkClient

Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. Класс основанный Π½Π° TCP ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ для взаимодСйствия клиСнского ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ прилоТСния.

NetworkServer

Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ сСрвСр. Класс, основанный Π½Π° TCP сСрвСрС для взаимодСйствия с ΠΊΠ»ΠΈΠ΅Π½Ρ‚скими прилоТСниями.

БСрСализация

SerializerManager

Класс для сСрСализации ΠΈ Π΄Π΅ΡΠ΅Ρ€Π΅Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ.

SettingsManager

Класс для управлСния ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ настройками.

Π˜Π³Ρ€ΠΎΠ²Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ°

GamePlayManager

Класс для управлСния ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ.

GameSattistics

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ элСмСнтов ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ… статистику ΠΈΠ³Ρ€Ρ‹.

LogicCell

ЛогичСская абстракция ячСйки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

Player

Π˜Π³Ρ€ΠΎΠΊ — ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ прилоТСния

Word

Абстракция слова.

ВзаимодСйствиС ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ отобраТСния с Ρ†Π΅Π»ΡŒΡŽ поддСрТания инкапсуляции происходит ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ².

Π”Π΅Π»Π΅Π³Π°Ρ‚

НазначСниС

void DisplayMatrixCells (List logicCells);

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π³Ρ€Π°Ρ„ичСском интСрфСйсС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹Ρ… логичСских ячССк ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ.

void DisplayMessage (string message);

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π³Ρ€Π°Ρ„ичСском интСрфСйсС подсказки.

void DisplayError (string message);

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π³Ρ€Π°Ρ„ичСском ошибки.

bool ConditionAction (string word);

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия.

4. ВСстированиС прилоТСния

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ:

Β· Intel Core i5−3470 (3.2 GHz), 8 Gb RAM, 500 Gb HDD.

Β· AMD A8−4500M (1,9 GHz), 6 Gb RAM, 500 Gb HDD.

ВСстированиС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ клиСнтского прилоТСния.

На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΌΠ°ΡˆΠΈΠ½ Π±Ρ‹Π»ΠΎ установлСно всС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС. На ΡΡ‚ΠΈΡ… систСмах ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ быстро, Π±Π΅Π· зависаний.

ВсС ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ситуации Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ, ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ ΠΈ ΠΊΡ€ΠΈΡ‚ичСских ошибок Π·Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ.

ВСстированиС Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π° ΠΈΠ³Ρ€Ρ‹ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅

ВСст

ОТидаСмоС повСдСниС

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

ΠΠ°ΠΆΠ°Ρ‚ΡŒ «Π˜Π³Ρ€Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅», Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² 3, — Π Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ 7. ΠΠ°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠžΠš»

Появилось 3 поля для Π²Π²ΠΎΠ΄Π° ΠΈΠΌΡ‘Π½ ползоватСля.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½

ΠΠ°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠžΠš»

Появилоась ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° 7 Π½Π° 7.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½

Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ячСйку для вставки Π±ΡƒΠΊΠ²Ρ‹. ΠŸΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ячСйку ΠΎΡ‚Π΄Π°Π»Ρ‘Π½Π½ΡƒΡŽ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΡƒΠΊΠ² Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ячССк.

Π―Ρ‡Π΅ΠΉΠΊΠ° подсвСчСна ΠΎΡ€Π°Π½ΠΆΠ΅Π²Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ячСйки появляСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½

Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ слово. ΠŸΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ слово Π±Π΅Π· вставлСнной Π±ΡƒΠΊΠ²Ρ‹.

Π’Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ слово подсвСчиваСтся ΠΎΡ€Π°Π½ΠΆΠ΅Π²Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ. ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹Π±ΠΎΡ€Π° слова Π±Π΅Π· вставлСнной Π±ΡƒΠΊΠ²Ρ‹ Π²Ρ‹Π±ΠΎΡ€ слова запрСщаСтся. Выводится сообщСниС.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½

ВСстированиС сСтСвого Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π° ΠΈΠ³Ρ€Ρ‹

ВСст

ОТидаСмоС повСдСниС

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ экзСмпляра прилоТСния.

На Ρ‚Ρ€Ρ‘Ρ… экзСмплярах появляСтся стартовоС мСню.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.

На ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ «Π‘СтСвая ΠΈΠ³Ρ€Π°», Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ «Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ», Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ 3 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ 5. ΠΠ°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠžΠš».

На ΡΠΊΡ€Π°Π½Π΅ появляСтся Ρ„ΠΎΡ€ΠΌΠ° с Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈΠΈ «ΠžΠš» появляСтся сообщСниС «ΠžΠΆΠΈΠ΄Π°ΠΉΡ‚Π΅».

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.

На ΠΊΠ»ΠΈΠ΅Π½Ρ‚ских прилоТСниях Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ сСтСвой Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠ³Ρ€Ρ‹, ΠΏΠΎΠ΄ΠΊΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ, Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ «ΠžΠš»

На ΡΠΊΡ€Π°Π½Π΅ появляСтся Ρ„ΠΎΡ€ΠΌΠ° задания ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ip ΡΠ΅Ρ€Π²Π΅Ρ€Π°. ПослС наТатия «ΠžΠš» появляСтся надпись ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.

ПослС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ Π΅Ρ‰Ρ‘ 2 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π²ΡΠ΅Ρ… 3 прилоТСниях появляСтся список участников. ΠΠ°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ОК

На ΡΠΊΡ€Π°Π½Π΅ появляСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° 5 Π½Π° ΠΏΡΡ‚ΡŒ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΈΠ³Ρ€Ρ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌΡƒ Π½Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

ВСст ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.

5. Руководство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ским ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΌ. ΠŸΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ прилоТСния появляСтся Ρ„ΠΎΡ€ΠΌΠ°.

Рисунок 5.1. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ прилоТСния

МоТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΈΠ³Ρ€Ρ‹: Π˜Π³Ρ€Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΈ ΠΈΠ³Ρ€Π° Π½Π° ΠΏΠΎ ΡΠ΅Ρ‚ΠΈ.

ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΈΠ³Ρ€Ρ‹ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ появляСтся Ρ„ΠΎΡ€ΠΌΠ° настройки ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹.

Рисунок 5.2 Настройки ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹

На Π΄Π°Π½Π½ΠΎΠΌ этапС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ количСство ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… участиС Π² ΠΈΠ³Ρ€Π΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠžΠš появляСтся Ρ„ΠΎΡ€ΠΌΠ° для Π²Π²ΠΎΠ΄Π° ΠΈΠΌΡ‘Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Рисунок 5.3. Π€ΠΎΡ€ΠΌΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠΌΡ‘Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

Π—Π°Ρ‚Π΅ΠΌ происходит старт ΠΈΠ³Ρ€Ρ‹. ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° для Π²Ρ‹Π±ΠΎΡ€Π° Π±ΡƒΠΊΠ² ΠΈ Π²Π²ΠΎΠ΄Π° слов.

Рисунок 5.4. Π’Ρ‹Π±ΠΎΡ€ ячСйки для вставки Π±ΡƒΠΊΠ²Ρ‹

Π’ ΡΠΎΠΎΡ‚вСтствии с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сосСднюю ячСйку для вставки Π±ΡƒΠΊΠ². Π—Π°Ρ‚Π΅ΠΌ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ набираСтся Π±ΡƒΠΊΠ²Π° ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ся ΠΌΠ΅Ρ‚ΠΊΠ° «ΠŸΡ€ΠΈΠ½ΡΡ‚ΡŒ».

Π—Π°Ρ‚Π΅ΠΌ происходит Π²Ρ‹Π±ΠΎΡ€ слова.

Рисунок 5.5. Π’Ρ‹Π±ΠΎΡ€ слова

Π—Π°Ρ‚Π΅ΠΌ слово одобряСтся. Π₯ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π’Π°ΠΊ происходит ΠΏΠΎΠΊΠ° вся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π½Π΅ ΡΡ‚ановится Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ. ПослС этого подводится ΠΈΡ‚ΠΎΠ³ ΠΈΠ³Ρ€Ρ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ся сообщСниС ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅.

Рисунок 5.6. Π’Ρ‹Π±ΠΎΡ€ слова

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ курсовым ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π±Ρ‹Π»ΠΎ создано ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ срСдство, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ собой ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ «Π‘Π°Π»Π΄Π°». Π˜Π³Ρ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ друТСствСнный интСрфСйс, Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ всС возмоТности ΠΈΠ³Ρ€Ρ‹ «Π‘Π°Π»Π΄Π°», Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ этого Π½Π°Π±ΠΎΡ€Π° Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ³Ρ€ΠΎΠΉ.

Π’ Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ курсовым ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠ½ΠΎΠΉ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ срСдства ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.Net ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΡΠ΅Ρ‚ΡŒΡŽ ΠΈ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ прилоТСниями, Ρ‚.ΠΊ. ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ тСхнология TCPClient ΠΈ TCPListener.

Π’ Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡƒΠΊΡ€Π΅ΠΏΠΈΠ» знания ΠΏΠΎ Ρ‚Схнологиями.Net Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ WinForms, сСрСализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Xml.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ сдСлано Π² ΡΠΎΠΎΡ‚вСтствии с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ ООП. Π¨ΠΈΡ€ΠΎΠΊΠΎ использовалась событийная модСль ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹.

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… источников

1. Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚. ΠŸΠΎΠ»Π½Ρ‹ΠΉ справочник ΠΏΠΎ Π‘# — М.: Π˜Π·Π΄Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π΄ΠΎΠΌ «Π’ΠΈΠ»ΡŒΡΠΌΡ», 2004. — 752 с.

2. Π­Π½Π΄Ρ€ΡŽ ВроСлсСн. Π―Π·Ρ‹ΠΊ программирования C# 2010 ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.NET 4.0 — M.: Π’ΠΈΠ»ΡŒΡΠΌΡ, 2010. —1392 c.

3. ΠœΡΡ‚ΡŒΡŽ Мак-Π”ΠΎΠ½Π°Π»ΡŒΠ΄ C# для профСссионалов - М.: Π˜Π·Π΄Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π΄ΠΎΠΌ «Π’ΠΈΠ»ΡŒΡΠΌΡ», 2010. — 656 с.

4. ВикипСдия [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс]. — Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. — Π Π΅ΠΆΠΈΠΌ доступа: http://ru.wikipedia.org/wiki/

5. WPF — Windows Presentation Foundatin[Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс]. — Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. — Π Π΅ΠΆΠΈΠΌ доступа: http://professorweb.ru/my/WPF/base_WPF/level1/info_WPF.php

6. Windows Presentation Foundation[Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс]. — Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. — Π Π΅ΠΆΠΈΠΌ доступа: http://msdn.microsoft.com/ru-ru/library/ms754130.aspx

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Листинг класса NegotiationManager.

using System;

using System.Collections.Generic;

using System. Drawing;

using System. Linq;

using System. Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using BaldaClient. DisplayLogic;

using BaldaClient. NetworkManagment;

using BaldaClient. SettingsManagment;

using BaldaGameLogic. Delegates;

using BaldaGameLogic. GameLogic;

using BaldaGameLogic. GameModel;

namespace BaldaClient. Negotiation

{

public class NegotiationManager

{

#region GameManagment

private GameLogicManager gameLogicManager;

private DisplayManager displayManager;

private NetworkManager networkManager;

public SettingsManager SettingsManager { get; set; }

public GameLogicControls GameLogicControls { get; set; }

public bool IsProcessServer { get; set; }

public BaldaAplicationForm MainForm

{

get;

set;

}

public String ProcessUserName { get; set; }

private LogicCell previousLogicCell;

#endregion

#region GameLogicFlags

public bool IsCellSelectionExpected

{

get { return gameLogicManager. IsCellSelectionExpected; }

set { gameLogicManager. IsCellSelectionExpected = value; }

}

public bool IsLetterSelectionExpected

{

get { return gameLogicManager. IsLetterSelectionExpected; }

set { gameLogicManager. IsLetterSelectionExpected = value; }

}

public bool IsWordSelectionExpected

{

get { return gameLogicManager. IsWordSelectionExpected; }

set { gameLogicManager. IsWordSelectionExpected = value; }

}

public bool IsSelectedNetworkGameMode

{

get { return gameLogicManager. IsSelectedNetworkGameMode; }

set { gameLogicManager. IsSelectedNetworkGameMode = value; }

}

#endregion

public List Players

{

get { return gameLogicManager. Players; }

set { gameLogicManager. Players = value; }

}

public List TempPlayerList { get; set; }

public NegotiationManager (BaldaAplicationForm mainForm)

{

MainForm = mainForm;

gameLogicManager = new GameLogicManager ();

networkManager = new NetworkManager (this);

}

public void AddPlayerToTempPlayerList (String userName)

{

if (TempPlayerList == null)

{

TempPlayerList = new List ();

}

if (TempPlayerList.FirstOrDefault (pl => pl.Name == userName) == null)

{

var number = TempPlayerList. Count + 1;

TempPlayerList.Add (new Player{Name = userName, Number = number});

}

if (gameLogicManager.Settings.PlayerCount == TempPlayerList. Count)

{

gameLogicManager.Players = TempPlayerList;

MainForm.CreateAllPlayersNameControls ();

}

}

private void BindGameManagers ()

{

gameLogicManager.DisplayCells = displayManager. DisplayCells;

gameLogicManager.DisplayCellAsLight = displayManager. DisplayCellsAsLight;

gameLogicManager.DisplayCurrentWord = displayManager. DispalyCurrentWord;

gameLogicManager.DisplayCurrentPlayerName = displayManager. DisplayCurrentPlayerName;

gameLogicManager.DisplayCurrentGuide = displayManager. DisplayCurrentGuide;

gameLogicManager.DisplayCurrentError = displayManager. DisplayCurrentError;

gameLogicManager.AddWordConfirmationButtons =

GameLogicControls.GameForm.CreateWordConfirmationLabels;

gameLogicManager.RemoveConfirmationLabels = GameLogicControls.GameForm.RemoveConfirmationLabels;

gameLogicManager.AddLetterConfirmationButtons = GameLogicControls.GameForm.AddLetterConfirmationLabels;

}

public void ConfigureGame ()

{

ConfigureGameSettings ();

gameLogicManager.CreateGameLogicObjects ();

}

public void ConfigureGameSettings ()

{

gameLogicManager.Settings = SettingsManager. GameLogicSettings;

}

public void StartGame ()

{

gameLogicManager.StartGame ();

displayManager.DrawFullMatrix ();

SetFirstWord («Π‘АЛДА»);

}

private void SetFirstWord (string word)

{

gameLogicManager.SetFirstWord (word);

}

public void TrySelectCell (int xCor, int yCor)

{

var logicCell = displayManager. GetLogicCellByCor (xCor, yCor);

if (logicCell≠ null)

{

if (gameLogicManager.TrySelectCellForInsertingLetter (logicCell))

{

IsLetterSelectionExpected = true;

IsCellSelectionExpected = false;

}

}

}

public void SetLetterToCell (string letter)

{

if (gameLogicManager.LetterIsValidForInserting (letter))

{

gameLogicManager.SetLetterToCell (letter);

}

}

public void TryAddNextCellToWordSelection (int xCor, int yCor)

{

var logicCell = displayManager. GetLogicCellByCor (xCor, yCor);

if (logicCell≠ null && previousLogicCell≠ logicCell)

{

previousLogicCell = logicCell;

if (gameLogicManager.IsLogicCellValidForWordSelection (logicCell))

{

gameLogicManager.AddCellToWordSelection (logicCell);

}

}

}

public void StopWordSelection ()

{

gameLogicManager.StopWordSelection ();

}

public void ConfigureDisplaySettings ()

{

displayManager =

new DisplayManager (GameLogicControls, SettingsManager. DisplaySettings, gameLogicManager. LogicCells);

BindGameManagers ();

}

public void CancelSelectedWord ()

{

gameLogicManager.CancelSelectedWord ();

}

public void AcceptLetter ()

{

gameLogicManager.AcceptLetter ();

}

public void CancelLetter ()

{

gameLogicManager.CancelLetter ();

}

public void AcceptWord ()

{

gameLogicManager.AcceptWord ();

}

public void CreateGameRoom (String userName)

{

IsProcessServer = true;

ProcessUserName = userName;

networkManager.CreateGameRoom ();

networkManager.ConnectToServer («localhost», userName);

}

public void ConnectToRoom (String ipString, String userName)

{

networkManager.ConnectToServer (ipString, userName);

networkManager.SendUserInformation (userName);

}

public void ConfigureGameParameters (List players, int size)

{

var gameLogicSettings = new GameSettings

{

MatrixSize = size,

PlayerCount = players. Count

};

var settingsManager = new SettingsManager

{

GameLogicSettings = gameLogicSettings,

DisplaySettings = new DisplaySettings

{

cellBackgroundColor = Color. Black,

cellBorderColor = Color. Chartreuse,

selectedCellBackroundColor = Color. Bisque,

cellLetterColor = Color. DarkOrange,

StartWorldTextColor = Color. Aqua,

MatrixCellSize = 360 / gameLogicSettings. MatrixSize — 2,

MatrixCellBorderWidth = 2

}

};

SettingsManager = settingsManager;

ConfigureGame ();

Players = players;

MainForm.CreateAllPlayersNameControls ();

}

}

}

public abstract class FtpCommandParserBase

{

protected readonly Dictionary> CommandHandlers =

new Dictionary>

{

{ FtpCommand. Abor, (parser, s) => parser. AborCommandHandler (s) },

{ FtpCommand. Cdup, (parser, s) => parser. CdupCommandHandler (s) },

{ FtpCommand. Cwd, (parser, s) => parser. CwdCommandHandler (s) },

{ FtpCommand. Dele, (parser, s) => parser. DeleCommandHandler (s) },

{ FtpCommand. List, (parser, s) => parser. ListCommandHandler (s) },

{ FtpCommand. Mdtm, (parser, s) => parser. MdtmCommandHandler (s) },

{ FtpCommand. Mkd, (parser, s) => parser. MkdCommandHandler (s) },

{ FtpCommand. Nlst, (parser, s) => parser. NlstCommandHandler (s) },

{ FtpCommand. Noop, (parser, s) => parser. NoopCommandHandler (s) },

{ FtpCommand. Pass, (parser, s) => parser. PassCommandHandler (s) },

{ FtpCommand. Pasv, (parser, s) => parser. PasvCommandHandler (s) },

{ FtpCommand. Port, (parser, s) => parser. PortCommandHandler (s) },

{ FtpCommand. Pwd, (parser, s) => parser. PwdCommandHandler (s) },

{ FtpCommand. Quit, (parser, s) => parser. QuitCommandHandler (s) },

{ FtpCommand. Rein, (parser, s) => parser. ReinCommandHandler (s) },

{ FtpCommand. Retr, (parser, s) => parser. RetrCommandHandler (s) },

{ FtpCommand. Rmd, (parser, s) => parser. RmdCommandHandler (s) },

{ FtpCommand. Rnfr, (parser, s) => parser. RnfrCommandHandler (s) },

{ FtpCommand. Rnto, (parser, s) => parser. RntoCommandHandler (s) },

{ FtpCommand. Size, (parser, s) => parser. SizeCommandHandler (s) },

{ FtpCommand. Stor, (parser, s) => parser. StorCommandHandler (s) },

{ FtpCommand. Stou, (parser, s) => parser. StouCommandHandler (s) },

{ FtpCommand. User, (parser, s) => parser. UserCommandHandler (s) }

};

#region Command delegates

public virtual Action AborCommand { get; set; }

public virtual Action CdupCommand { get; set; }

public virtual Action CwdCommand { get; set; }

public virtual Action DeleCommand { get; set; }

public virtual Action ListCommand { get; set; }

public virtual Action MdtmCommand { get; set; }

public virtual Action MkdCommand { get; set; }

public virtual Action NlstCommand { get; set; }

public virtual Action NoopCommand { get; set; }

public virtual Action PassCommand { get; set; }

public virtual Action PasvCommand { get; set; }

public virtual Action PortCommand { get; set; }

public virtual Action PwdCommand { get; set; }

public virtual Action QuitCommand { get; set; }

public virtual Action ReinCommand { get; set; }

public virtual Action RetrCommand { get; set; }

public virtual Action RmdCommand { get; set; }

public virtual Action RnfrCommand { get; set; }

public virtual Action RntoCommand { get; set; }

public virtual Action SizeCommand { get; set; }

public virtual Action StorCommand { get; set; }

public virtual Action StouCommand { get; set; }

public virtual Action UserCommand { get; set; }

#endregion

#region Command handlers

protected abstract void AborCommandHandler (string parameters);

protected abstract void CdupCommandHandler (string parameters);

protected abstract void CwdCommandHandler (string parameters);

protected abstract void DeleCommandHandler (string parameters);

protected abstract void ListCommandHandler (string parameters);

protected abstract void MdtmCommandHandler (string parameters);

protected abstract void MkdCommandHandler (string parameters);

protected abstract void NlstCommandHandler (string parameters);

protected abstract void NoopCommandHandler (string parameters);

protected abstract void PassCommandHandler (string parameters);

protected abstract void PasvCommandHandler (string parameters);

protected abstract void PortCommandHandler (string parameters);

protected abstract void PwdCommandHandler (string parameters);

protected abstract void QuitCommandHandler (string parameters);

protected abstract void ReinCommandHandler (string parameters);

protected abstract void RetrCommandHandler (string parameters);

protected abstract void RmdCommandHandler (string parameters);

protected abstract void RnfrCommandHandler (string parameters);

protected abstract void RntoCommandHandler (string parameters);

protected abstract void SizeCommandHandler (string parameters);

protected abstract void StorCommandHandler (string parameters);

protected abstract void StouCommandHandler (string parameters);

protected abstract void UserCommandHandler (string parameters);

#endregion

#region Methods

public abstract void Parse (string message);

#endregion

}

public class FtpCommandParser: FtpCommandParserBase

{

#region Fields

private readonly Action _onUnsupportedCommand;

#endregion

#region ctor

public FtpCommandParser (Action onUnsupportedCommandAction = null)

{

if (onUnsupportedCommandAction == null)

_onUnsupportedCommand = c => { throw new UnsupportedFtpCommandException (c); };

else

_onUnsupportedCommand = onUnsupportedCommandAction;

}

#endregion

#region Methods

#region Public methods

public override void Parse (string message)

{

message = message. Trim (' ', 'n', 'r', 't');

if (string.IsNullOrEmpty (message))

return;

string[] parts = message. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

FtpCommand ftpCommand;

if (!FtpCommandHelper.Commands.TryGetValue (parts[0], out ftpCommand))

throw new UnknownFtpCommandException (parts[0]);

CommandHandlers[ftpCommand](this, string. Join (««, parts. Skip (1)));

}

#endregion

#region Private methods

private void InvokeCommand (FtpCommand command, Action commandAction)

{

if (commandAction≠ null)

commandAction ();

else

_onUnsupportedCommand (command);

}

private void InvokeCommand (FtpCommand command, Action commandAction, string parameter)

{

if (commandAction≠ null)

{

if (parameter == null)

throw new IncorrectFtpCommandFormatException (command);

commandAction (parameter);

}

else

_onUnsupportedCommand (command);

}

#endregion

#region FtpCommandParserBase

#region Command handlers

protected override void AborCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Abor, AborCommand);

}

protected override void CdupCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Cdup, CdupCommand);

}

protected override void CwdCommandHandler (string parameters)

{

string[] args = parameters. Split (new []{' '}, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Cwd, CwdCommand, args. Length > 0? args[0]: null);

}

protected override void DeleCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Dele, DeleCommand, args. Length > 0? args[0]: null);

}

protected override void ListCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.List, ListCommand, args. Length > 0? args[0]: string. Empty);

}

protected override void MdtmCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Mdtm, MdtmCommand, args. Length > 0? args[0]: null);

}

protected override void MkdCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Mkd, MkdCommand, args. Length > 0? args[0]: null);

}

protected override void NlstCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Nlst, NlstCommand, args. Length > 0? args[0]: string. Empty);

}

protected override void NoopCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Noop, NoopCommand);

}

protected override void PassCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Pass, PassCommand, args. Length > 0? args[0]: null);

}

protected override void PasvCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Pasv, PasvCommand);

}

protected override void PortCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] {','}, StringSplitOptions. RemoveEmptyEntries);

if (args.Length < 6)

throw new IncorrectFtpCommandFormatException (FtpCommand.Port);

if (PortCommand == null)

{

_onUnsupportedCommand (FtpCommand.Port);

return;

}

long address = 0;

int port = 0;

for (int i = 0; i < 6; i++)

{

byte part;

if (!byte.TryParse (args[i], out part))

throw new IncorrectFtpCommandFormatException (FtpCommand.Port);

if (i < 4)

address += part << (8 * i);

else

port = port * 256 + part;

}

PortCommand (address, port);

}

protected override void PwdCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Pwd, PwdCommand);

}

protected override void QuitCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Quit, QuitCommand);

}

protected override void ReinCommandHandler (string parameters)

{

InvokeCommand (FtpCommand.Rein, ReinCommand);

}

protected override void RetrCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Retr, RetrCommand, args. Length > 0? args[0]: null);

}

protected override void RmdCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Rmd, RmdCommand, args. Length > 0? args[0]: null);

}

protected override void RnfrCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Rnfr, RnfrCommand, args. Length > 0? args[0]: null);

}

protected override void RntoCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Rnto, RntoCommand, args. Length > 0? args[0]: null);

}

protected override void SizeCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Size, SizeCommand, args. Length > 0? args[0]: null);

}

protected override void StorCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Stor, StorCommand, args. Length > 0? args[0]: null);

}

protected override void StouCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.Stou, StouCommand, args. Length > 0? args[0]: string. Empty);

}

protected override void UserCommandHandler (string parameters)

{

string[] args = parameters. Split (new[] { ' ' }, StringSplitOptions. RemoveEmptyEntries);

InvokeCommand (FtpCommand.User, UserCommand, args. Length > 0? args[0]: null);

}

#endregion

#endregion

#endregion

}

Листинг класса FileSystemWorker. cs

public class FileSystemWorker

{

private readonly string _rootDirectory;

private UserRights _userRights;

private FileStream _savingFile;

private FileStream _readingFile;

public const int BufferSize = 1 048 576; //1MB

public FileSystemWorker (string rootDirectory)

{

if (!Directory.Exists (rootDirectory))

throw new DirectoryNotFoundException (rootDirectory);

_rootDirectory = Path. GetFullPath (rootDirectory);

Directory.SetCurrentDirectory (_rootDirectory);

}

public void InitUserRights (UserRights userRights)

{

_userRights = userRights;

}

public void GoToParentDirectory ()

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

string currentPath = CheckAndGetCurrentDirectory ();

if (string.Compare (_rootDirectory, currentPath, StringComparison. OrdinalIgnoreCase)≠ 0)

Directory.SetCurrentDirectory (Directory.GetParent (currentPath).FullName);

}

public void GoToRootDirectory ()

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

Directory.SetCurrentDirectory (_rootDirectory);

}

public void ChangeDirecroty (string directory)

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

string newPath = Path. Combine (CheckAndGetCurrentDirectory (), directory. TrimStart (new [] { '\', '/' }));

if (!Directory.Exists (newPath))

throw new FileSystemAccessDeniedException ();

Directory.SetCurrentDirectory (newPath);

}

public string CreateDirectory (string directory)

{

if (!_userRights.CanCreate ())

throw new FileSystemAccessDeniedException ();

string path = Path. Combine (CheckAndGetCurrentDirectory (), directory. TrimStart (new[] { '\', '/' }));

if (Directory.Exists (path))

throw new FileSystemException (string.Format («Directory „{0}“ already exists», directory));

try

{

Directory.CreateDirectory (path);

}

catch (IOException ex)

{

throw new FileSystemException (ex.Message.Replace (_rootDirectory, «»));

}

return path. Replace (_rootDirectory, «»);

}

public void RemoveDirectory (string directory)

{

if (!_userRights.CanCreate ())

throw new FileSystemAccessDeniedException ();

string path = Path. Combine (CheckAndGetCurrentDirectory (), directory. TrimStart (new[] { '\', '/' }));

try

{

Directory.Delete (path);

}

catch (IOException)

{

throw new FileSystemAccessDeniedException ();

}

}

public string GetCurrentDirectory ()

{

string path = CheckAndGetCurrentDirectory ().Replace (_rootDirectory, «»);

return Path. IsPathRooted (path)? path: «» + path;

}

public void DeleteFile (string fileName)

{

if (!_userRights.CanCreate ())

throw new FileSystemAccessDeniedException ();

string filePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new [] { '\', '/' }));

if (!File.Exists (filePath))

throw new FileSystemAccessDeniedException ();

try

{

File.Delete (filePath);

}

catch (IOException ex)

{

throw new FileSystemException (ex.Message.Replace (_rootDirectory, «»));

}

}

public void RenameFile (string fileName, string newFileName)

{

if (!_userRights.CanCreate ())

throw new FileSystemAccessDeniedException ();

string oldFilePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new[] { '\', '/' }));

if (!File.Exists (oldFilePath))

throw new FileSystemAccessDeniedException ();

string newFilePath = Path. Combine (CheckAndGetCurrentDirectory (), newFileName. TrimStart (new[] { '\', '/' }));

if (File.Exists (newFilePath))

throw new FileSystemException (string.Format («File „{0}“ already exists», newFileName));

try

{

File.Move (oldFilePath, newFilePath);

}

catch (IOException ex)

{

throw new FileSystemException (ex.Message.Replace (_rootDirectory, «»));

}

}

public string BeginWriteFile (string fileName, bool newNameIfExists = false)

{

if (_savingFile≠ null)

throw new Exception («Previous file not saved»);

if (!_userRights.CanUpload ())

throw new FileSystemAccessDeniedException ();

string filePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new [] { '\', '/' }));

if (File.Exists (filePath) || string. IsNullOrWhiteSpace (fileName))

{

if (!newNameIfExists)

throw new FileSystemAccessDeniedException ();

fileName = Guid. NewGuid ().ToString ().Substring (0, 8);

filePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new [] { '\', '/' }));

}

_savingFile = new FileStream (filePath, FileMode. CreateNew, FileAccess. Write, FileShare. None, BufferSize,

FileOptions.SequentialScan);

return fileName;

}

public void WriteData (byte[] data, int size)

public void EndWriteFile ()

{

if (_savingFile == null)

throw new Exception («File not opened»);

_savingFile.Close ();

_savingFile = null;

}

public void BeginReadFile (string fileName)

{

if (_readingFile≠ null)

throw new Exception («Previous file not closed»);

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

string filePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new[] { '\', '/' }));

if (!File.Exists (filePath))

throw new FileSystemAccessDeniedException ();

_readingFile = new FileStream (filePath, FileMode. Open, FileAccess. Read, FileShare. Read, BufferSize,

FileOptions.SequentialScan);

}

public int ReadData (byte[] buffer, int size)

if (_readingFile == null

public void EndReadFile ()

{

if (_readingFile == null)

throw new Exception («File not opened»);

_readingFile.Close ();

_readingFile = null;

}

public bool FileExists (string fileName)

{

return File. Exists (Path.Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new[] { '\', '/' })));

}

public bool CanRenameFile ()

{

return _userRights.CanCreate ();

}

public bool CanUploadFile ()

{

return _userRights.CanUpload ();

}

public bool CanDownloadFile ()

{

return _userRights.CanDownload ();

}

public DateTime GetFileModifiedDate (string fileName)

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

string filePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new[] { '\', '/' }));

if (!File.Exists (filePath))

throw new FileSystemAccessDeniedException ();

return File. GetLastWriteTime (filePath);

}

public long GetFileSize (string fileName)

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

string filePath = Path. Combine (CheckAndGetCurrentDirectory (), fileName. TrimStart (new[] { '\', '/' }));

if (!File.Exists (filePath))

throw new FileSystemAccessDeniedException ();

try

{

return new FileInfo (filePath).Length;

}

catch (IOException ex)

{

throw new FileSystemException (ex.Message.Replace (_rootDirectory, «»));

}

}

public string[] GetFileInfo (string fileName, bool onlyNames = false)

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

List files = new List ();

List directories = new List ();

string currentDirectory = CheckAndGetCurrentDirectory ();

string filePath = string. IsNullOrWhiteSpace (fileName)

? currentDirectory

: Path. Combine (currentDirectory, fileName. TrimStart (new[] {'\', '/'}));

if (File.Exists (filePath))

{

files.Add (new FileInfo (filePath));

}

else if (Directory.Exists (filePath))

{

files.AddRange (Directory.GetFiles (filePath).Select (v => new FileInfo (v)));

directories.AddRange (Directory.GetDirectories (filePath).Select (v => new DirectoryInfo (v)));

}

else

{

throw new FileSystemAccessDeniedException ();

}

Func getFileInfo;

Func getDirectoryInfo;

if (onlyNames)

{

getFileInfo =

f => string. Format («t{0}», f.Name.Replace (_rootDirectory, «»));

getDirectoryInfo =

d => string. Format («dirt{0}», d.Name.Replace (_rootDirectory, «»));

}

else

{

getFileInfo =

f => string. Format («t{0}t{1}t{2}», f.Name.Replace (_rootDirectory, «»), f. Length, f. LastWriteTime);

getDirectoryInfo =

d => string. Format («dirt{0}t{1}t{2}», d.Name.Replace (_rootDirectory, «»), «», d. LastWriteTime);

}

List result = new List ();

result.AddRange (

files.Select (

v => getFileInfo (v)));

result.AddRange (

directories.Select (

v => getDirectoryInfo (v)));

return result. ToArray ();

}

private string CheckAndGetCurrentDirectory ()

{

if (!_userRights.CanDownload ())

throw new FileSystemAccessDeniedException ();

string currentDirectory = Directory. GetCurrentDirectory ();

if (!currentDirectory.StartsWith (_rootDirectory))

throw new Exception («Incorrect working directory»);

return currentDirectory;

}

}

Листинг класса DisplayManager

using System;

using System.Collections.Generic;

using System. Drawing;

using System.Drawing.Drawing2D;

using System. Linq;

using System. Text;

using System.Windows.Forms;

using BaldaClient. DisplayModel;

using BaldaGameLogic. GameLogic;

using BaldaGameLogic. GameModel;

namespace BaldaClient. DisplayLogic

{

public class DisplayManager

{

#region Properties for bindings

public GameLogicControls GameControls { get; set; }

#endregion

#region gameLogicFields

private List logicCells;

private List displayCells;

private DisplayCell previousSelectedCell;

private Dictionary cellDictionary;

#endregion

#region forDisplayFields

private int cellBackgroundOffset;

private int cellBackgroundSize;

private int cellTextOffset;

private PictureBox pb;

private Graphics gr;

private Pen pen;

private Brush primaryBrush;

private Brush lightBrush;

private Brush textBrush;

private Font font;

private Label selectedWordLabel;

private DisplaySettings displaySettings;

#endregion

private DisplayCell selectedCellForLetter;

public LogicCell SelectedCellForLetter

{

get { return (selectedCellForLetter≠ null)? selectedCellForLetter. LogicCell: null; }

}

public DisplayManager (GameLogicControls gameLogicControls, DisplaySettings displaySettings, List logiccells)

{

this.GameControls = gameLogicControls;

this.pb = gameLogicControls. pictureBox;

this.selectedWordLabel = gameLogicControls. SelectedWordLabel;

pb.Refresh ();

gr = pb. CreateGraphics ();

this.displaySettings = displaySettings;

pen = new Pen (displaySettings.cellBorderColor, displaySettings. MatrixCellBorderWidth);

primaryBrush = new SolidBrush (displaySettings.cellBackgroundColor);

lightBrush = new SolidBrush (displaySettings.selectedCellBackroundColor);

textBrush = new SolidBrush (displaySettings.cellLetterColor);

font = new Font (FontFamily.GenericMonospace, (displaySettings.MatrixCellSize / 2), FontStyle. Bold);

cellBackgroundOffset = displaySettings. MatrixCellBorderWidth/2;

cellBackgroundSize = displaySettings. MatrixCellSize — displaySettings. MatrixCellBorderWidth;

cellTextOffset = displaySettings. MatrixCellBorderWidth/2 + 6;

logicCells = logiccells;

CreateDisplayCells ();

}

private void CreateDisplayCells ()

{

displayCells = new List ();

cellDictionary = new Dictionary ();

logicCells.ForEach (lc =>

{

var dispayCell = new DisplayCell

{

LogicCell = lc,

offsetX = (lc.X — 1)*displaySettings.MatrixCellSize + cellBackgroundOffset,

offsetY = (lc.Y — 1)*displaySettings.MatrixCellSize + cellBackgroundOffset,

};

displayCells.Add (dispayCell);

cellDictionary.Add (lc, dispayCell);

});

}

public void DrawCell (DisplayCell cell, Brush backGroundBrush)

{

try

{

if (cell≠ null)

{

gr.DrawRectangle (pen, cell. offsetX, cell. offsetY, displaySettings. MatrixCellSize, displaySettings. MatrixCellSize);

gr.FillRectangle (backGroundBrush, cell. offsetX + cellBackgroundOffset, cell. offsetY + cellBackgroundOffset,

cellBackgroundSize, cellBackgroundSize);

if (!String.IsNullOrEmpty (cell.LogicCell.Letter))

gr.DrawString (cell.LogicCell.Letter, font, textBrush, cell. offsetX + cellTextOffset,

cell.offsetY + cellTextOffset);

}

}

catch (Exception ex)

{

throw ex;

}

}

public void DrawLightCell (DisplayCell cell)

{

}

public void DrawFullMatrix ()

{

displayCells.ForEach (cell => DrawCell (cell, primaryBrush));

}

public void DisplayCells (List logCells)

{

logCells.ForEach (lc=> DrawCell (cellDictionary[lc], primaryBrush));

}

public void DisplayCellsAsLight (List logCells)

{

logCells.ForEach (lc => DrawCell (cellDictionary[lc], lightBrush));

}

public bool SelectCellForInsertingLetter (int xCor, int yCor)

{

if (previousSelectedCell≠ null)

{

DrawCell (previousSelectedCell, primaryBrush);

}

LightCellByCor (xCor, yCor);

return true;

}

private void LightCellByCor (int xCor, int yCor)

{

var cell = GetDisplayCellByCor (xCor, yCor);

previousSelectedCell = cell;

DrawCell (cell, lightBrush);

}

private DisplayCell GetDisplayCellByCor (int xCor, int yCor)

{

var logicX = xCor / displaySettings. MatrixCellSize + 1;

var logicY = yCor / displaySettings. MatrixCellSize + 1;

return GetCellByLogicCor (logicX, logicY);

}

private DisplayCell GetCellByLogicCor (int x, int y)

{

return displayCells. FirstOrDefault (cell => (cell.LogicCell.X == x) && (cell.LogicCell.Y == y));

}

public LogicCell GetLogicCellByCor (int x, int y)

{

var logicX = x / displaySettings. MatrixCellSize + 1;

var logicY = y / displaySettings. MatrixCellSize + 1;

var displayCell = GetCellByLogicCor (logicX, logicY);

return (displayCell≠null)? displayCell. LogicCell: null;

}

public void DispalyCurrentWord (string message)

{

selectedWordLabel.Text = message;

}

public void DisplayCurrentPlayerName (string message)

{

GameControls.CurrentPlayerLabel.Text = message;

}

public void DisplayCurrentGuide (string message)

{

GameControls.GuideLabel.Text = message;

}

public void DisplayCurrentError (string message)

{

GameControls.ErrorLabel.Text = message;

}

}

}

using System;

using System.Collections.Generic;

using System. IO;

using System. Linq;

using System.Net;

using System.Net.Sockets;

using System. Text;

using System. Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

public delegate void HandleMassageActivity (String message);

namespace BaldaClient. NetworkModel

{

public class NetworkClient: IDisposable

{

private StreamWriter swSender;

private StreamReader srReceiver;

private TcpClient tcpServer;

private delegate void UpdateLogCallback (string strMessage);

private delegate void CloseConnectionCallback (string strReason);

private Thread thrMessaging;

private IPAddress ipAddr;

private bool Connected;

private HandleMassageActivity HandleMessage;

public NetworkClient (HandleMassageActivity handleMessage)

{

this.HandleMessage = handleMessage;

}

public void ConnectToServer (String ipString, String userName)

{

if (Connected == false)

{

InitializeConnection (ipString, userName);

}

else

{

CloseConnection («Disconnected at user’s request.»);

}

}

private void InitializeConnection (String ipString, String userName)

{

tcpServer = new TcpClient ();

tcpServer.Connect («localhost», 1986);

Connected = true;

swSender = new StreamWriter (tcpServer.GetStream ());

swSender.WriteLine (userName);

swSender.Flush ();

thrMessaging = new Thread (new ThreadStart (ReceiveMessages));

thrMessaging.Start ();

}

private void ReceiveMessages ()

{

srReceiver = new StreamReader (tcpServer.GetStream ());

string ConResponse = srReceiver. ReadLine ();

if (ConResponse[0] == '1')

{

UpdateLog («Connected Successfully!»);

}

else

{

string Reason = «Not Connected: «;

Reason += ConResponse. Substring (2, ConResponse. Length — 2);

UpdateLog (Reason);

return;

}

while (Connected)

{

var newMessage = srReceiver. ReadLine ();

HandleMessage (newMessage);

}

}

private void UpdateLog (string strMessage)

{

Console.WriteLine (strMessage);

}

private void CloseConnection (string Reason)

{

Connected = false;

swSender.Close ();

srReceiver.Close ();

tcpServer.Close ();

}

public void SendMessage (String message)

{

swSender.WriteLine (message);

swSender.Flush ();

}

public void Dispose ()

{

if (Connected == true)

{

Connected = false;

swSender.Close ();

srReceiver.Close ();

tcpServer.Close ();

}

}

}

}

using System;

using System.Collections.Generic;

using System. Linq;

using System. Text;

using BaldaGameLogic. Delegates;

using BaldaGameLogic. GameModel;

namespace BaldaGameLogic. GameLogic

{

public class GameLogicManager

{

public GameSettings Settings { get; set; }

public List LogicCells { get; private set; }

public List MainWordLogicCells { get; private set; }

private LogicCell selectedCell;

public List Players { get; set; }

private List SelectedCellsForWord;

private String selectedWord { get; set; }

public PlayerGameStatistic GameStatistic { get; set; }

private Player activePlayer;

#region GameLogicFlags

public bool IsCellSelectionExpected { get; set; }

public bool IsLetterSelectionExpected { get; set; }

public bool IsWordSelectionExpected { get; set; }

public bool IsSelectedNetworkGameMode { get; set; }

public bool IsWordSelected { get; set; }

private bool IsPreviousInvalid;

#endregion

#region GameLogicDelegates

public DisplayMatrixCells DisplayCells { private get; set; }

public DisplayMatrixCells DisplayCellAsLight { private get; set; }

public DisplayMessage DisplayCurrentWord { private get; set; }

public DisplayMessage DisplayCurrentPlayerName { private get; set; }

public DisplayMessage DisplayCurrentGuide { private get; set; }

public DisplayMessage DisplayCurrentError { private get; set; }

public DispalyAction AddWordConfirmationButtons { private get; set; }

public DispalyAction RemoveConfirmationLabels { private get; set; }

public DispalyAction AddLetterConfirmationButtons { private get; set; }

public ConditionAction IsWordExist { private get; set; }

#endregion

public void CreateGameLogicObjects ()

{

CreateLogicCells ();

CreatePlayersObjects ();

SelectedCellsForWord = new List ();

}

private void CreatePlayersObjects ()

{

Players = new List ();

for (int i = 1; i <= Settings. PlayerCount; i++)

{

Players.Add (new Player {Number = i, Name = String. Empty});

}

GameStatistic = new PlayerGameStatistic (Players);

}

private void CreateLogicCells ()

{

LogicCells = new List ();

for (int i = 1; i <= Settings. MatrixSize; i++)

{

for (int j = 1; j <= Settings. MatrixSize; j++)

{

LogicCells.Add (new LogicCell

{

X = i,

Y = j,

Letter = String. Empty

});

}

}

var middleRowIndex = Settings. MatrixSize / 2 + 1;

MainWordLogicCells = new List ();

LogicCells.Where (cell => cell. Y == middleRowIndex)

.ToList ()

.ForEach (cell => { MainWordLogicCells. Add (cell);

cell.IsMainWorldCell = true;

});

}

public void SetFirstWord (String mainWord)

{

if (mainWord.Length≠ Settings. MatrixSize)

{

throw new Exception («Start wold more then matrix size»);

}

var mainWorldBuilder = new StringBuilder (mainWord);

for (int i = 0; i < Settings. MatrixSize; i++)

{

MainWordLogicCells[i]. Letter = mainWorldBuilder[i]. ToString ();

DisplayCells (MainWordLogicCells);

}

}

public void StartGame ()

{

activePlayer = Players. First (pl => pl. Number == 1);

SetCellCelectionStage ();

}

public bool TrySelectCellForInsertingLetter (LogicCell logCell)

{

if (!String.IsNullOrEmpty (logCell.Letter))

{

DisplayCurrentError (GamePlayMessages.CellMustBeEmpty);

return false;

}

if (!IsOneOfNeigborsContainsLetter (logCell))

{

DisplayCurrentError (GamePlayMessages.NeighborMustContainLetter);

return false;

}

selectedCell = logCell;

DisplayCellAsLight (new List { logCell });

DisplayCurrentError (String.Empty);

DisplayCurrentGuide (GamePlayMessages.InsertLetter);

return true;

}

public bool LetterIsValidForInserting (string letter)

{

return true;

}

public void SetLetterToCell (string letter)

{

selectedCell.Letter = letter;

IsLetterSelectionExpected = false;

IsWordSelectionExpected = false;

DisplayCells (new List{selectedCell});

DisplayCurrentWord (letter);

SetAcceptLetterStage ();

}

public bool IsLogicCellValidForWordSelection (LogicCell logCell)

{

if (SelectedCellsForWord≠ null)

{

if (String.IsNullOrEmpty (logCell.Letter))

{

IsPreviousInvalid = true;

return false;

}

if (SelectedCellsForWord.Contains (logCell) && (SelectedCellsForWord.Last ()≠ logCell))

{

{

HandleDoubleCellInWordSelection (logCell);

IsPreviousInvalid = false;

DisplayCurrentWord (GetCurentSelectedWord ());

}

return false;

}

if (SelectedCellsForWord.Contains (logCell) && (SelectedCellsForWord.Last () == logCell))

{

return false;

}

if (SelectedCellsForWord.Count≠ 0)

{

if (!IsLogicCellsNeighbors (logCell, SelectedCellsForWord. Last ()))

{

return false;

}

}

}

return true;

}

private bool IsLogicCellsNeighbors (LogicCell firstCell, LogicCell secondCell)

{

if ((firstCell == null) || (secondCell == null))

{

return false;

}

var neighbors = GetNeighborsForCell (firstCell);

return neighbors. Contains (secondCell);

}

private List GetNeighborsForCell (LogicCell logicCell)

{

var high = GetCellByLogicCor (logicCell.X, logicCell. Y + 1);

var low = GetCellByLogicCor (logicCell.X, logicCell. Y — 1);

var left = GetCellByLogicCor (logicCell.X — 1, logicCell. Y);

var right = GetCellByLogicCor (logicCell.X + 1, logicCell. Y);

var list = new List ();

if (high≠null) list. Add (high);

if (low≠ null) list. Add (low);

if (left≠ null) list. Add (left);

if (right≠ null) list. Add (right);

return list;

}

private bool IsOneOfNeigborsContainsLetter (LogicCell logicCell)

{

var flag=false;

GetNeighborsForCell (logicCell).ForEach (lc =>

{

if (lc≠ null)

{

if (!String.IsNullOrEmpty (lc.Letter))

{

flag = true;

}

}

});

return flag;

}

private LogicCell GetCellByLogicCor (int x, int y)

{

return LogicCells. FirstOrDefault (lc => (lc.X == x) && (lc.Y == y));

}

private void HandleDoubleCellInWordSelection (LogicCell cell)

{

var index = SelectedCellsForWord. IndexOf (cell);

var temp = SelectedCellsForWord. Take (index+1).ToList ();

for (int i = index+1; i < SelectedCellsForWord. Count; i++)

{

DisplayCells (new List{SelectedCellsForWord[i]});

}

SelectedCellsForWord = temp;

}

public void AddCellToWordSelection (LogicCell logicCell)

{

SelectedCellsForWord.Add (logicCell);

DisplayCellAsLight (new List (){logicCell});

DisplayCurrentWord (GetCurentSelectedWord ());

}

private string GetCurentSelectedWord ()

{

var selectedWord = String. Empty;

SelectedCellsForWord.ForEach (cell=>selectedWord += cell. Letter);

return selectedWord;

}

public void StopWordSelection ()

{

if (IsSelectedWordContainsSelectedCell ())

{

SetAcceptWordStage ();

}

else

{

DisplayCurrentError (GamePlayMessages.WordMustContainSelectedCell);

}

}

private bool IsSelectedWordContainsSelectedCell ()

{

if (SelectedCellsForWord≠ null)

{

if (SelectedCellsForWord.Count≠ 0)

{

if (selectedCell≠ null)

{

return SelectedCellsForWord. Contains (selectedCell);

}

}

}

return false;

}

#region GamePlayAction

public void CancelSelectedWord ()

{

RemoveConfirmationLabels ();

DisplayCells (SelectedCellsForWord);

SelectedCellsForWord = null;

selectedWord = String. Empty;

SetAcceptLetterStage ();

}

public void CancelLetter ()

{

selectedCell.Letter = String. Empty;

DisplayCells (new List{selectedCell});

selectedCell = null;

SetCellCelectionStage ();

}

public void AcceptLetter ()

{

SetWordSelectionStage ();

}

public void AcceptWord ()

{

GameStatistic.SetWordToPlayer (activePlayer, selectedWord);

RemoveConfirmationLabels ();

DisplayCells (SelectedCellsForWord);

SelectedCellsForWord = null;

SetNextActivePlayer ();

SetCellCelectionStage ();

}

#endregion

#region SetGamePlayStage

private void SetWordSelectionStage ()

{

RemoveConfirmationLabels ();

SelectedCellsForWord = new List ();

IsWordSelectionExpected = true;

DisplayCurrentWord (String.Empty);

DisplayCurrentGuide (GamePlayMessages.SelectWord);

DisplayCurrentError (String.Empty);

}

private void SetCellCelectionStage ()

{

RemoveConfirmationLabels ();

IsCellSelectionExpected = true;

DisplayCurrentPlayerName (activePlayer.Name);

DisplayCurrentGuide (GamePlayMessages.SelectCellForLetter);

DisplayCurrentError (String.Empty);

DisplayCurrentWord (String.Empty);

}

private void SetAcceptLetterStage ()

{

RemoveConfirmationLabels ();

AddLetterConfirmationButtons ();

DisplayCurrentWord (selectedCell.Letter);

DisplayCurrentGuide (GamePlayMessages.AcceptLetter);

DisplayCurrentError (String.Empty);

}

private void SetAcceptWordStage ()

{

IsWordSelectionExpected = false;

selectedWord = GetCurentSelectedWord ();

DisplayCurrentWord (selectedWord);

DisplayCurrentError (String.Empty);

DisplayCurrentGuide (GamePlayMessages.AcceptWord);

AddWordConfirmationButtons ();

}

#endregion

private void SetNextActivePlayer ()

{

var index = Players. IndexOf (activePlayer);

if (index == (Players.Count — 1))

{

activePlayer = Players. First ();

}

else

{

activePlayer = Players[index + 1];

}

DisplayCurrentPlayerName (activePlayer.Name);

}

}

}

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ