ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

РСализация ΠΈΠ³Ρ€Ρ‹ «Шашки» Π½Π° Delphi

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

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

РСализация ΠΈΠ³Ρ€Ρ‹ «Шашки» Π½Π° Delphi (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π€Π΅Π΄Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠ΅ агСнтство образования РСспублики Бурятия Бурятский государствСнный унивСрситСт Π˜Π½ΡΡ‚ΠΈΡ‚ΡƒΡ‚ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠšΠ°Ρ„Π΅Π΄Ρ€Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠšΡƒΡ€ΡΠΎΠ²Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π°

РСализация ΠΈΠ³Ρ€Ρ‹ «Π¨Π°ΡˆΠΊΠΈ» Π½Π° Delphi

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°: Π Π°Π΄Π½Π°Π΅Π²Π° М., Π³Ρ€ΡƒΠΏΠΏΠ° 5 470

Научный Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ: ΠœΠΎΡ€Π΄ΠΎΠ²ΡΠΊΠΎΠΉ А. К.

Улан-Удэ

1. Из ΠΈΡΡ‚ΠΎΡ€ΠΈΠΈ

2. ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ

3. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹

4. Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

1. Из ΠΈΡΡ‚ΠΎΡ€ΠΈΠΈ

Как ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΠ³Ρ€, шашки появились достаточно Π΄Π°Π²Π½ΠΎ ΠΈ Π²ΠΎ Π²ΡΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π° пользовались Π½Π΅ΠΌΠ°Π»ΠΎΠΉ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒΡŽ. Π’ΠΎΡ‡Π½ΠΎΠΉ истории возникновСния ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π΅Ρ‚ся, хотя ΠΏΡ€ΠΈ раскопках, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ»ΠΈ Π² Π•Π³ΠΈΠΏΡ‚Π΅, Π±Ρ‹Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° дрСвняя доска ΠΈ Π½Π°Π±ΠΎΡ€ ΠΈΠ· Ρ„ΠΈΡˆΠ΅ΠΊ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π΄Π°Π»Π΅Π½Π½ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ соврСмСнный ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ.

Богласно Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, шашки взяли своС Π½Π°Ρ‡Π°Π»ΠΎ ΠΎΡ‚ ΠΈΠ³Ρ€Ρ‹ «Π»Π°Ρ‚Ρ€ΡƒΠ½ΠΊΡƒΠ»ΠΈ», которая Π±Ρ‹Π»Π° достаточно популярна Π² Π ΠΈΠΌΠ΅. ΠŸΡ€Π°Π²ΠΈΠ»Π° практичСски ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ соотвСтствовали соврСмСнным шашкам, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нюансов. НапримСр, Π² ΡΡ‚ΠΎΠΉ ΠΈΠ³Ρ€Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ возмоТности ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π°, Π·Π°Ρ‚ΠΎ сущСствовали Π°Π½Π°Π»ΠΎΠ³ΠΈ Π΄Π°ΠΌΠΎΠΊ — ΠΈΠΌΠΈ ΡΡ‡ΠΈΡ‚Π°Π»ΠΈΡΡŒ Ρ„ΠΈΡˆΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ Π½Π° Ρ‚Π΅Ρ€Ρ€ΠΈΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° ΠΈ Ρ‚Π΅ΠΌ самым ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСимущСства ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ шашками.

Π§Ρ‚ΠΎ касаСтся происхоТдСния, Ρ‚ΠΎ Π·Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΎΠ± ΠΈΠ³Ρ€Π΅ «Π°Π»ΡŒΠΊΠ΅Ρ€ΠΊ» — мавританской Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΠΎΠΉ вСрсии, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присутствовало Π΄Π²Π΅ Π°Ρ€ΠΌΠΈΠΈ ΠΏΠΎ 12 шашСк, Π° Ρ…ΠΎΠ΄ производился ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠ»Π΅Ρ‚ΠΎΠΊ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ поля.

Помимо Ρ‚Π΅ΠΎΡ€ΠΈΠΉ возникновСния ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ΄ собой ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ историчСскиС Ρ„Π°ΠΊΡ‚Ρ‹, сущСствуСт ΠΈ Π»Π΅Π³Π΅Π½Π΄Π°. Π’ Π½Π΅ΠΉ говорится ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ шашки Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Ρ‹ грСчСским Π±ΠΎΠ³ΠΎΠΌ ГСрмСсом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ благодаря ΠΏΠ°Ρ€Ρ‚ΠΈΠΈ, Π²Ρ‹ΠΈΠ³Ρ€Π°Π» 5 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π½Π΅ΠΉ Π² Π³ΠΎΠ΄Ρƒ. ПослС этого, ΠΎΠ½ΠΈ добавились ΠΊ 360 дням, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ соврСмСнная ΠΏΡ€ΠΎΡ‚ΡΠΆΡ‘Π½Π½ΠΎΡΡ‚ΡŒ Π³ΠΎΠ΄Π°.

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

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

Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅, Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π° правлСния ΠŸΠ΅Ρ‚Ρ€Π° I, ΠΈΠ³Ρ€Π° ΡƒΠΆΠ΅ стала Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ популярна ΠΈ ΠΈΠ·Π²Π΅ΡΡ‚Π½Π°, Ρ‡Ρ‚ΠΎ для Π½Π΅Ρ‘ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹. ПозТС стали ΡƒΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΡƒΡ€Π½ΠΈΡ€Ρ‹ ΠΈ ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ большС ΡƒΠΊΠΎΡ€Π΅Π½ΠΈΠ»ΠΎ этот Π²ΠΈΠ΄ Ρ€Π°Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΉ.

ΠŸΠ΅Ρ€Π²Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎ ΡˆΠ°ΡˆΠΊΠ°Ρ… Π² Π ΠΎΡΡΠΈΠΈ появилась Π² 1803 Π³ΠΎΠ΄Ρƒ. Π•Π΅ Π°Π²Ρ‚ΠΎΡ€ — Н. М. ΠšΠ°Ρ€Π°ΠΌΠ·ΠΈΠ½. Π›ΡŽΠ±ΠΈΡ‚Π΅Π»ΡΠΌΠΈ шашСк Π±Ρ‹Π»ΠΈ Π”Π΅Ρ€ΠΆΠ°Π²ΠΈΠ½, ΠŸΡƒΡˆΠΊΠΈΠ½. Π›. Н. Волстой Π² «Π’ΠΎΠΉΠ½Π΅ ΠΈ ΠΌΠΈΡ€Π΅» сравниваСт ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ Π²ΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ искусства со ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠ΅ΠΉ ΡˆΠ°ΡˆΠ΅Ρ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. НаполСон ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π°ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π» шашки, чСрпая Π² ΡΡ‚ΠΎΠΉ ΠΈΠ³Ρ€Π΅ ΠΈΠ΄Π΅ΠΈ для Ρ‚Π°ΠΊΡ‚ΠΈΠΊΠΈ вСдСния боя, ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π°ΡΡΡ‚авался Π²ΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΠ΅Ρ€Π»Π°ΠΌΡƒΡ‚Ρ€ΠΎΠ²ΠΎΠΉ ΡˆΠ°ΡˆΠ΅Ρ‡Π½ΠΎΠΉ доской.

Шашки — ΠΈΠ³Ρ€Π° для Π΄Π²ΡƒΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠΉ доскС, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„ΠΈΡˆΠΊΠ°ΠΌΠΈ — шашками. Подобно ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π°ΠΌ, шашки воспроизводят дСйствия ΡΡ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ сил.

2. ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ

шашки ΠΈΠ³Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠΎΠ΄ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ классификации ΡˆΠ°ΡˆΠ΅Ρ‡Π½Ρ‹Ρ… ΠΈΠ³Ρ€. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнно шашки ΠΈ «ΠΈΠ³Ρ€Ρ‹ ΡˆΠ°ΡˆΠ΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ шашками ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ (Π³ΠΎ, Ρ€ΡΠ½Π΄Π·ΡŽ, ΠΈ ΠΏΡ€., см. Π²Ρ‹ΡˆΠ΅). Данная ΡΡ‚Π°Ρ‚ΡŒΡ рассматриваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈΠ· ΡΡ‚ΠΈΡ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ.

По Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ доски — 12×12 (канадскиС), 10×10 (ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Π΅), 8×8 (ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² шашСк).

По ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ям ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ³Ρ€Ρ‹. К Π½ΠΈΠΌ относятся:

ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ располоТСниС шашСк. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹.

НаправлСниС Ρ…ΠΎΠ΄Π° ΠΈ Π²Π·ΡΡ‚ия: ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ/Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ боя Π½Π°Π·Π°Π΄ простой шашкой.

ΠŸΡ€Π°Π²ΠΈΠ»Π° прСдпочтСния взятия: ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² боя Π² ΠΎΠ΄Π½ΠΈΡ… ΠΈΠ³Ρ€Π°Ρ… ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… — Π΅Π³ΠΎ свобода Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°.

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

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ шашСк

ΠœΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Π΅ шашки. Π˜Π³Ρ€Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярна Π² Π•Π²Ρ€ΠΎΠΏΠ΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ доска 10Π§10 ΠΊΠ»Π΅Ρ‚ΠΎΠΊ. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠΎ 20 шашСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ряда с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны, «ΠΏΡ€ΠΎΡΡ‚ая» шашка ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΈΡ‚ΡŒ Π²ΠΏΠ΅Ρ€Ρ‘Π΄ ΠΈ Π½Π°Π·Π°Π΄, Π΄Π°ΠΌΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ Π±ΠΈΡ‚ΡŒ Π½Π° Π»ΡŽΠ±ΠΎΠ΅ число ΠΏΠΎΠ»Π΅ΠΉ. «ΠŸΡ€ΠΎΡΡ‚ая» прСвращаСтся Π² Π΄Π°ΠΌΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ свой Ρ…ΠΎΠ΄ Π½Π° ΠΏΠΎΠ»Π΅ прСвращСния. ΠŸΡ€ΠΈ Π±ΠΎΠ΅ «ΠΏΡ€ΠΎΡΡ‚ΠΎΠΉ» Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅ прСвращСния ΠΎΠ½Π° Π½Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ся ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π±ΠΎΠΉ ΠΊΠ°ΠΊ простая. Если послС поля прСвращСния «ΠΏΡ€ΠΎΡΡ‚ая» ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ Π΄Π°ΠΌΠΊΠ°, ΠΎΠ½Π° остаётся Π½Π° ΠΏΠΎΠ»Π΅ прСвращСния ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π±ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΄Π°ΠΌΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ…ΠΎΠ΄Π°. Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² Ρ€ΡƒΡΡΠΊΠΈΡ… ΡˆΠ°ΡˆΠΊΠ°Ρ… сущСствуСт ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ «Ρ‚ΡƒΡ€Π΅Ρ†ΠΊΠΎΠ³ΠΎ ΡƒΠ΄Π°Ρ€Π°». ΠŸΡ€ΠΈ возмоТности Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² взятия полагаСтся Π±ΠΈΡ‚ΡŒ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ количСство шашСк. ЦСль ΠΈΠ³Ρ€Ρ‹, ΠΊΠ°ΠΊ ΠΈ Π² Ρ€ΡƒΡΡΠΊΠΈΡ… ΡˆΠ°ΡˆΠΊΠ°Ρ…, — ΡΡŠΠ΅ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΠ΅Ρ€Π΅Ρ‚ΡŒ всС шашки ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°.

АлтайскиС шашки. Π‘ΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ Π² ΡΠ΅Π±Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° шашСк ΠΈ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚.

Π‘Ρ€Π°Π·ΠΈΠ»ΡŒΡΠΊΠΈΠ΅ шашки. ΠŸΡ€Π°Π²ΠΈΠ»Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ шашкам, Π½ΠΎ ΠΈΠ³Ρ€Π° вСдётся Π½Π° Π΄ΠΎΡΠΊΠ΅ 8Π§8, ΠΏΠΎ 12 шашСк с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны.

КанадскиС шашки. Π’ ΠΊΠ°Π½Π°Π΄ΡΠΊΠΈΠ΅ шашки ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π½Π° Π΄ΠΎΡΠΊΠ΅ 12Π§12, ΠΏΠΎ 24 шашки с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ шашкам.

АнглийскиС шашки. АнглийскиС ΠΈΠ»ΠΈ амСриканскиС шашки, ΠΈΠ»ΠΈ чСкСрс (Π°Π½Π³Π». Checkers). Доска 8Π§8, Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΏΠΎ 12 шашСк, располоТСнных Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Ρ‘Ρ… рядах Π½Π° Ρ‡Ρ‘Ρ€Π½Ρ‹Ρ… ΠΊΠ»Π΅Ρ‚ΠΊΠ°Ρ…. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ…ΠΎΠ΄ Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‡Ρ‘Ρ€Π½Ρ‹Π΅. «ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅» шашки ΠΌΠΎΠ³ΡƒΡ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ Π²ΠΏΠ΅Ρ€Ρ‘Π΄ ΠΈ Π±ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΠ΅Ρ€Ρ‘Π΄, Π΄Π°ΠΌΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Π²ΠΏΠ΅Ρ€Ρ‘Π΄ ΠΈ Π½Π°Π·Π°Π΄ ΠΈ Π±ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ Π² Π»ΡŽΠ±ΡƒΡŽ сторону. Π‘ΠΈΡ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡƒΡ‚Π΅ΠΉ, ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой, Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ самый Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ, Π½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π΅Π³ΠΎ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Π’ 2007 Π³ΠΎΠ΄Ρƒ Π”ΠΆΠΎΠ½Π°Ρ‚Π°Π½ Π¨Π΅Ρ„Ρ„Π΅Ρ€ Π΄ΠΎΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ сущСствуСт Π±Π΅ΡΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, слСдуя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° Π½ΠΈΡ‡ΡŒΡŽ Π² Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΡ… ΡˆΠ°ΡˆΠΊΠ°Ρ…, Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΎΠ½ ΠΈΠ³Ρ€Π°Π΅Ρ‚. Являясь Π±Π΅ΡΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹ΠΌ, Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ.

ΠŸΡƒΠ» (Pool Checkers). ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹ΠΉ Π² Π‘ША Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ³Ρ€Ρ‹. ΠŸΡ€Π°Π²ΠΈΠ»Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ шашкам, Π½ΠΎ ΠΈΠ³Ρ€Π° вСдётся Π½Π° Π΄ΠΎΡΠΊΠ΅ 8Π§8, ΠΏΠΎ 12 шашСк с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны. Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ — Π½Π΅ Ρ‚рСбуСтся Π±ΠΈΡ‚ΡŒ максимальноС количСство шашСк.

Π˜Ρ‚Π°Π»ΡŒΡΠ½ΡΠΊΠΈΠ΅ шашки. Π’ ΠΈΡ‚Π°Π»ΡŒΡΠ½ΡΠΊΠΈΠ΅ шашки ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π½Π° ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 8Π§8 ΠΊΠ»Π΅Ρ‚ΠΎΠΊ, которая ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚Π° Π½Π° 90 градусов ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ. Шашки ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ряда с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡŒ Π½Π° Π±Π΅Π»Ρ‹Ρ… полях. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹ Π² ΠΈΡ‚Π°Π»ΡŒΡΠ½ΡΠΊΠΈΠ΅ шашки ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹ чСкСрс, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ отличия: простая шашка Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΈΡ‚ΡŒ Π½Π°Π·Π°Π΄ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΊΡƒ; Π±ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ количСство шашСк сопСрника, Π° ΠΏΡ€ΠΈ Ρ€Π°Π²Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… боя Π½ΡƒΠΆΠ½ΠΎ Π±ΠΈΡ‚ΡŒ максимальноС количСство Π΄Π°ΠΌΠΎΠΊ.

ИспанскиС шашки. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ Π±Ρ€Π°Π·ΠΈΠ»ΡŒΡΠΊΠΈΠΌ шашкам, Π½ΠΎ Π΄ΠΎΡΠΊΠ° ΠΏΠΎΠ²Ρ‘Ρ€Π½ΡƒΡ‚Π° Π½Π° 90 градусов ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ. Шашки ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ряда с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡŒ Π½Π° Π±Π΅Π»Ρ‹Ρ… полях. Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ — простыС шашки Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±ΠΈΡ‚ΡŒ Π½Π°Π·Π°Π΄.

Π’ΡƒΡ€Π΅Ρ†ΠΊΠΈΠ΅ шашки. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ ΠΏΠΎ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ Π²ΠΈΠ΄Ρƒ Ρ‚ΡƒΡ€Π΅Ρ†ΠΊΠΈΠ΅ шашки. Π’ Π½ΠΈΡ… ΠΈΠ³Ρ€Π° вСдётся Π½Π° ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ 64-ΠΊΠ»Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠΉ доскС, Π½ΠΎ ΡˆΠ°ΡˆΠΊΠΈ ходят ΠΈ Π±ΡŒΡŽΡ‚ Π½Π΅ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡΠΌ, Π° ΠΏΠΎ Π²Π΅Ρ€Ρ‚икалям ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚алям, взятиС Π½Π°Π·Π°Π΄ для простой шашки Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ. Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ΠΈΡ… ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ — Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ «Π΄ΠΆΠ΅Π½Ρ‚Π»ΡŒΠΌΠ΅Π½ΡΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»» — ΠΏΡ€Π°Π²ΠΈΠ», Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡ‚ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ шашки ставятся ΠΏΠΎΠ΄ ΡƒΠ΄Π°Ρ€ ΠΈ ΠΊΠΎΠ³Π΄Π° простая шашка оказываСтся Π½Π° ΡΠ΅Π΄ΡŒΠΌΠΎΠΉ ΠΈΠ»ΠΈ восьмой Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ.

Поддавки (ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ шашки). ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹ Π² ΠΏΠΎΠ΄Π΄Π°Π²ΠΊΠΈ (здСсь Ρ‚Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 8Π§8 ΠΈ 10Π§10) Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ русскиС ΠΈ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Π΅ шашки, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ†Π΅Π»ΡŒ ΠΈΠ³Ρ€Ρ‹ — ΠΏΠΎΠ΄Π΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΠ΅Ρ€Π΅Ρ‚ΡŒ всС свои шашки.

Шашки-самоСды. Π˜Π³Ρ€Π°ΡŽΡ‚ΡΡ Π½Π° Π΄ΠΎΡΠΊΠ΅ 8*8. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ€ΡƒΡΡΠΊΠΈΡ… шашСк, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ (ΠΈ ΠΎΠ±ΡΠ·Π°Π½ ΠΏΡ€ΠΈ возмоТности, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, с ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΈΠ³Ρ€Ρ‹) Π±ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ шашки ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°, Ρ‚Π°ΠΊ ΠΈ ΡΠ²ΠΎΠΈ шашки (взятиС всСгда производится своСй шашкой). МоТно Π±ΠΈΡ‚ΡŒ нСсколько шашСк ΠΎΠ±ΠΎΠΈΡ… Ρ†Π²Π΅Ρ‚ΠΎΠ² Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΠ΄. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈΠ³Ρ€Π° Π½Π° Π΄ΠΎΡΠΊΠ΅ 10*10, Π½ΠΎ Π±Π΅Π· ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ взятия Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π°.

Π‘Ρ‚ΠΎΠ»Π±ΠΎΠ²Ρ‹Π΅ шашки. Π‘Ρ‚Π°Ρ€ΠΈΠ½Π½Ρ‹ΠΉ русский Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π³Π΄Π΅ побитая простая шашка Π½Π΅ ΡΠ½ΠΈΠΌΠ°Π΅Ρ‚ся с ΠΏΠΎΠ»Ρ, Π° ΡΡ‚авится ΠΏΠΎΠ΄ ΠΏΠΎΠ±ΠΈΠ²ΡˆΡƒΡŽ Π΅Ρ‘ Π±Π°ΡˆΠ½ΡŽ.

Π‘Ρ‚Π°Π²Ρ€ΠΎΠΏΠΎΠ»ΡŒΡΠΊΠΈΠ΅ шашки. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€ΡƒΡΡΠΊΠΈΠΌΠΈ шашками Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ лишь ΠΎΠ΄Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π΅Π·ΠΊΠΎ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΠ²ΡˆΠ΅Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ Π±ΠΎΡ€ΡŒΠ±Ρ‹: Π² ΡΡ‚Π°Π²Ρ€ΠΎΠΏΠΎΠ»ΡŒΡΠΊΠΈΡ… ΡˆΠ°ΡˆΠΊΠ°Ρ… любой ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² вмСсто Ρ…ΠΎΠ΄Π° своСй шашкой всСгда ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°. Π’Π°ΠΊ, начиная ΠΈΠ³Ρ€Ρƒ, Π±Π΅Π»Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΎ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρ‡Ρ‘Ρ€Π½ΠΎΠΉ шашкой. Π”Π²ΠΈΠ³Π°Ρ‚ΡŒ Ρ‡ΡƒΠΆΠΈΠ΅ простыС шашки ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡΠ²ΠΎΡŽ сторону ΠΈ Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠΌΠΈ слСдуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свои шашки. ВзятиС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π”ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ шашки. ΠŸΡ€Π°Π²ΠΈΠ»Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π² Ρ€ΡƒΡΡΠΊΠΈΠ΅ шашки, Π½ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ расстановка — иная (большая диагональ свободна, свСрху ΠΈ ΡΠ»Π΅Π²Π° ΠΎΡ‚ Π½Π΅Π΅ всС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ заняты Ρ‡Π΅Ρ€Π½Ρ‹ΠΌΠΈ шашками, снизу ΠΈ ΡΠΏΡ€Π°Π²Π° — Π±Π΅Π»Ρ‹ΠΌΠΈ).

3. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹

ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹ Π² Ρ€ΡƒΡΡΠΊΠΈΠ΅ шашки

Для ΠΈΠ³Ρ€Ρ‹ Π² Ρ€ΡƒΡΡΠΊΠΈΠ΅ шашки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π° ΠΆΠ΅ Π΄ΠΎΡΠΊΠ°, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π»Ρ ΠΈΠ³Ρ€Ρ‹ Π² ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Ρ‹. Π˜Π³Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ полями ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌΠ½Ρ‹Π΅ поля. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ ΠΏΠΎ 12 шашСк. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ…ΠΎΠ΄ всСгда Π΄Π΅Π»Π°ΡŽΡ‚ Π±Π΅Π»Ρ‹Π΅. Π˜Π³Ρ€ΠΎΠΊΠΈ ходят ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ располоТСниС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅1:

ЦСль ΠΈΠ³Ρ€Ρ‹ Π² ΡˆΠ°ΡˆΠΊΠΈ: Π²Ρ‹Π±ΠΈΡ‚ΡŒ всС шашки ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° ΠΈΠ»ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ… Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ.

Π₯одят шашки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ Π²ΠΏΠ΅Ρ€Π΅Π΄.

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

Если Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΈΡ‚ΡŒ ΡˆΠ°ΡˆΠΊΡƒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°, Ρ‚ΠΎ ΠΎΠ½ ΠΎΠ±ΡΠ·Π°Π½ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этот ΡƒΠ΄Π°Ρ€Π½Ρ‹ΠΉ Ρ…ΠΎΠ΄, Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ‚ Π΅Π³ΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠΉ.

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

Если Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΈΡ‚ΡŒ Ρ‡ΡƒΠΆΠΈΠ΅ шашки Π² Ρ€Π°Π·Π½Ρ‹Ρ… направлСниях, Ρ‚ΠΎ ΠΎΠ½ ΡΠ°ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ.

4. Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

const

MM_DOMOVE = WM_USER + 1;

MM_DEBUG = WM_USER + 2;

MM_IS_ANIMATION = WM_USER + 3;

implementation

uses GameTactics;

{$R *.DFM}

function Thinker (APosition: Pointer): Integer;

var

Position: TPosition;

Estimate: Integer;

begin

Position := TPosition (APosition^);

SelectMove (Position, MainForm. Deep, Estimate);

SendMessage (MainForm.Handle, MM_DOMOVE, Integer (@Position), Estimate);

Result := 0;

end;

procedure TMainForm. SelectCellBtnClick (Sender: TObject);

begin

PositionFrame.SelectCell (1, 6);

end;

procedure TMainForm. AcceptMove (Sender: TObject; const NewPosition: TPosition);

var

St: string;

begin

GameHistory.AddMove (NewPosition);

PositionFrame.SetPosition (NewPosition);

St := GameOver (NewPosition);

if St <> '' then

begin

ShowMessage (St);

PositionFrame.AcceptMove := False;

Exit;

end;

TuneState;

end;

procedure TMainForm. FormResize (Sender: TObject);

begin

PositionFrame.Left := 3;

PositionFrame.Top := 3;

Memo.Left := 3;

Memo.Top := PositionFrame. Top + PositionFrame. Height + 3;

Memo.Width := ClientWidth — 6;

Memo.Height := ClientHeight — PositionFrame. Height — 9;

PartyView.Left := PositionFrame. Left + PositionFrame. Width + 3;

PartyView.Width := ClientWidth — PositionFrame. Width — 9;

PartyView.Top := 3;

PartyView.Height := PositionFrame. Height;

PartyView.Columns[0]. Width := 30;

PartyView.Columns[1]. Width := (PartyView.Width — 40) div 2;

PartyView.Columns[2]. Width := (PartyView.Width — 40) div 2;

end;

procedure TMainForm. DoMove (var Message: TMessage);

var

NewPosition: TPosition;

begin

NewPosition := TPosition (Pointer (Message.WParam)^);

CloseHandle (ThreadHandle);

ThreadHandle := 0;

AcceptMove (nil, NewPosition);

end;

procedure TMainForm. FormCreate (Sender: TObject);

begin

FMode := mdMachineBlack;

Memo.Clear;

DoubleBuffered := True;

FGameHistory := TGameHistory. Create;

end;

procedure TMainForm. TuneState;

var

RunThinker: Boolean;

ThreadId: Cardinal;

Index: Integer;

V: Integer;

begin

if ThreadHandle <> 0 then StopThinking;

PositionFrame.AcceptMove := (Mode = mdView)

or ((Mode = mdMachineWhite) and (PositionFrame.Position.Active = ActiveBlack))

or ((Mode = mdMachineBlack) and (PositionFrame.Position.Active = ActiveWhite));

RunThinker := (Mode = mdTwoMachine)

or ((Mode = mdMachineWhite) and (PositionFrame.Position.Active = ActiveWhite))

or ((Mode = mdMachineBlack) and (PositionFrame.Position.Active = ActiveBlack));

if DebugMenu. Visible then

begin

Index := Lib. IndexOf (FormatPosition (PositionFrame.Position));

if Index <> -1 then

begin

V := Integer (Lib.Objects[Index]);

Memo.Lines.Add (Format ('Theory = %.3f', [V/200]));

end;

end;

if not RunThinker then Exit;

ThreadHandle := BeginThread (nil, 8*4096, @Thinker, @PositionFrame.Position, CREATE_SUSPENDED, ThreadId);

SetThreadPriority (ThreadHandle, THREAD_PRIORITY_BELOW_NORMAL);

ResumeThread (ThreadHandle);

end;

Position := Pointer (Message.WPAram);

Memo.Lines.Add (Format ('E=%d N=%.3f M=%s',

[Message.LParam, Message. LParam/200, GetLastMove (Position^)]));

end;

const

MAX_LEN = 60;

procedure TMainForm. StopThinking;

begin

TerminateThread (ThreadHandle, 0);

CloseHandle (ThreadHandle);

ThreadHandle := 0;

end;

procedure TGameHistory. AddWhiteMove (const Move: string);

var

NewItem: TListItem;

begin

NewItem := PartyView.Items.Add;

NewItem.Caption := IntToStr ((MoveNo div 2) + 1);

NewItem.Subitems.Add (Move);

PartyView.Selected := NewItem;

PartyView.Selected.MakeVisible (False);

end;

procedure TGameHistory. AddBlackMove (const Move: string);

var

Item: TListItem;

begin

Assert (MainForm.PartyView.Items.Count > 0);

Item := PartyView. Items[PartyView.Items.Count-1];

Item.Subitems.Add (Move);

PartyView.Selected := Item;

PartyView.Selected.MakeVisible (False);

end;

procedure TGameHistory. AddMove (NewPosition: TPosition);

var

Move: string;

begin

Move := GetLastMove (NewPosition);

if Move <> '' then

if FPositions[MoveNo]. Active = ActiveWhite

then AddWhiteMove (Move)

else AddBlackMove (Move);

MoveNo := MoveNo + 1;

FPositions[MoveNo] := NewPosition;

end;

procedure TGameHistory. NewGame;

begin

MoveNo := 0;

PartyView.Items.Clear;

FPositions[0] := StartBoard;

PositionFrame.SetPosition (StartBoard);

end;

function TGameHistory. GetPartyView: TListView;

begin

Result := MainForm. PartyView;

end;

function TGameHistory. GetPositionFrame: TPositionFrame;

begin

Result := MainForm. PositionFrame;

end;

procedure TGameHistory. Undo;

var

Last: Integer;

Item: TListItem;

begin

Assert (MoveNo > 0);

MainForm.ViewItem.Click;

MoveNo := MoveNo — 1;

PositionFrame.SetPosition (FPositions[MoveNo], False);

Last := PartyView.Items.Count-1;

Assert (Last >= 0);

Item := PartyView. Items[Last];

if Item.SubItems.Count > 1

then Item.SubItems.Delete (1)

else PartyView.Items.Delete (Last);

end;

procedure TMainForm. NewGameActionExecute (Sender: TObject);

begin

StopThinking;

GameHistory.NewGame;

if Mode in [mdMachineWhite, mdTwoMachine] then MachineBlackItem. Click;

PositionFrame.AcceptMove := True;

end;

procedure TMainForm. Deselect (Action: TAction; const Category: string);

var

I: Integer;

begin

for I := 0 to ActionList. ActionCount — 1 do

begin

if ActionList. Actions[I]. Category <> Category then Continue;

if ActionList. Actions[I] = Action then Continue;

(ActionList.Actions[I] as TAction).Checked := False;

end;

end;

procedure TMainForm. LevelActionExecute (Sender: TObject);

begin

Deselect (Sender as TAction, 'Level');

with Sender as TAction do

begin

Checked := True;

Deep := Tag;

end;

end;

procedure TMainForm. UndoMoveActionExecute (Sender: TObject);

begin

GameHistory.Undo;

end;

procedure TMainForm. ActionListUpdate (Action: TBasicAction;

var Handled: Boolean);

begin

UndoMoveAction.Enabled := GameHistory. MoveNo > 0;

end;

procedure TMainForm. ExitActionExecute (Sender: TObject);

begin

ViewItem.Click;

Close;

end;

procedure TMainForm. MachineWhiteActionExecute (Sender: TObject);

begin

Deselect (Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;

if Mode = mdMachineWhite then Exit;

FMode := mdMachineWhite;

PositionFrame.FlipBoard := True;

TuneState;

end;

procedure TMainForm. MachineBlackActionExecute (Sender: TObject);

begin

Deselect (Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;

if Mode = mdMachineBlack then Exit;

FMode := mdMachineBlack;

PositionFrame.FlipBoard := False;

TuneState;

end;

procedure TMainForm. TwoMachineActionExecute (Sender: TObject);

begin

Deselect (Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;

if Mode = mdTwoMachine then Exit;

FMode := mdTwoMachine;

TuneState;

end;

procedure TMainForm. ViewGameActionExecute (Sender: TObject);

begin

Deselect (Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;

if Mode = mdView then Exit;

FMode := mdView;

ViewItem.Checked := True;

if ThreadHandle <> 0 then StopThinking;

end;

procedure TMainForm. SetPositionActionExecute (Sender: TObject);

var

Position: TPosition;

begin

ViewItem.Click;

FillChar (Position.Field, 32, $ 00);

Position.Field[31] := -20;

Position.Field[29] := 70;

Position.Active := ActiveWhite;

// Position. Field[0] := 20;

// Position. Field[2] := -70;

// Position. Active := ActiveBlack;

Position.MoveCount := 0;

PositionFrame.SetPosition (Position);

end;

procedure TMainForm. AddToLibraryActionExecute (Sender: TObject);

var

V: Integer;

Estimate: string;

PositionFmt: string;

Index: Integer;

begin

DecimalSeparator := '.';

Estimate := InputBox ('Input', 'Please, enter estimate', '');

if Estimate = '' then Exit;

Estimate := StringReplace (Estimate, ',', '.', []);

V := Round (200 * StrToFloat (Estimate));

PositionFmt := FormatPosition (PositionFrame.Position);

Index := Lib. IndexOf (PositionFmt);

if Index = -1 then

Lib.AddObject (PositionFmt, TObject (V))

else begin

Lib.Sorted := False;

Lib[Index] := PositionFmt;

Lib.Objects[Index] := TObject (V);

Lib.Sorted := True;

end;

SaveLib;

end;

procedure TMainForm. CopyGameActionExecute (Sender: TObject);

var

MoveNo: Integer;

Item: TListItem;

CurrentSt: string;

AllParty: TStringList;

procedure Add (const St: string);

begin

if Length (CurrentSt) + Length (St) + 1 > MAX_LEN then

begin

AllParty.Add (CurrentSt);

CurrentSt := '';

end;

if CurrentSt <> '' then CurrentSt := CurrentSt + ' ';

CurrentSt := CurrentSt + St;

end;

begin

AllParty := TStringList. Create;

try

CurrentSt := '';

for MoveNo := 0 to PartyView.Items.Count-1 do

begin

Item := PartyView. Items[MoveNo];

Add (Item.Caption + '.');

Add (Item.SubItems[0]);

if Item.SubItems.Count > 1 then

Add (Item.SubItems[1]);

end;

if CurrentSt <> '' then AllParty. Add (CurrentSt);

Clipboard.AsText := AllParty. Text;

finally

AllParty.Free;

end;

end;

end.

procedure TPositionFrame. BeginDebug;

begin

{$IFDEF SELECT_DEBUG}

if Assigned (Debug) then

begin

Debug.BeginUpdate;

Debug.Clear;

end;

{$ENDIF}

end;

procedure TPositionFrame. EndDebug;

begin

{$IFDEF SELECT_DEBUG}

if Assigned (Debug) then Debug. EndUpdate;

{$ENDIF}

end;

procedure TPositionFrame. OutputDebug (const St: string);

begin

{$IFDEF SELECT_DEBUG}

Debug.Add (St);

{$ENDIF}

end;

procedure TPositionFrame. OutputDebug (const St: string; const Args: array of const);

begin

{$IFDEF SELECT_DEBUG}

OutputDebug (Format (St, Args));

{$ENDIF}

end;

procedure TPositionFrame. OutputDebugSelectMove;

{$IFDEF SELECT_DEBUG}

var

I, J: Integer;

St: string;

{$ENDIF}

begin

{$IFDEF SELECT_DEBUG}

OutputDebug ('Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ…ΠΎΠ΄Π°:');

for I := 0 to FAnswersCount — 1 do

begin

St := PointsDef[FAnswers[I]. MoveStr[0]];

J := 1;

repeat

if FAnswers[I]. MoveStr[J] = -1 then Break;

St := St + FAnswers[I]. TakeChar + PointsDef[FAnswers[I]. MoveStr[J]];

J := J + 1;

until False;

OutputDebug ('(%d) %s', [I, St]);

end;

OutputDebug ('');

St := '';

for I := 0 to 31 do

if FSelectedCells[I] then St := ' ' + PointsDef[I];

OutputDebug ('Selected =' + St);

St := '';

for I := 0 to FAnswersCount-1 do

St := St + Format (' %d (%d)', [FEnabledAnswer[I], I]);

OutputDebug ('EnabledAnswer =' + St);

St := '';

for I := 0 to FUserSelectCount-1 do

St := St + ' ' + PointsDef[FUserSelect[I]];

OutputDebug ('UserSelect =' + St);

{$ENDIF}

end;

function TPositionFrame. CellToField (X, Y: Integer): Integer;

begin

if FlipBoard

then Result := 4*Y + (7-X) div 2

else Result := 28 — 4*Y + (X div 2);

end;

procedure TPositionFrame. ClearSelect;

begin

FSelected := -1;

RefreshView;

end;

procedure TPositionFrame. DrawField (X, Y, Index: Integer);

begin

ImageList.Draw (Image.Canvas, X*ImageList.Width, Y*ImageList.Height, Index);

end;

function TPositionFrame. IsWhite (X, Y: Integer): Boolean;

begin

Result := ((X xor Y) and 1) = 0;

end;

procedure TPositionFrame. Loaded;

begin

inherited;

FSelected := -1;

end;

procedure TPositionFrame. RefreshView;

var

X, Y: Integer;

X1, X2, Y1, Y2: Integer;

P, Q: Single;

FieldIndex: Integer;

OutPosition: PPosition;

begin

if Animate

then OutPosition := @FAnimatePosition

else OutPosition := @FPosition;

ClientWidth := 8 * ImageList. Width;

ClientWidth := 8 * ImageList. Height;

for Y := 0 to 7 do

for X := 0 to 7 do

if IsWhite (X, Y) then

DrawField (X, Y, 0)

else begin

FieldIndex := CellToField (X, Y);

if Animate and (Position.MoveStr[0] = FieldIndex) then

DrawField (X, Y, 1)

else

case OutPosition. Field[FieldIndex] of

brWhiteSingle: DrawField (X, Y, 2);

brBlackSingle: DrawField (X, Y, 3);

brWhiteMam: DrawField (X, Y, 4);

brBlackMam: DrawField (X, Y, 5);

brEmpty: DrawField (X, Y, 1)

else DrawField (X, Y, 6)

end;

if FSelectedCells[FieldIndex] then

begin

Image.Canvas.Brush.Style := bsClear;

Image.Canvas.Pen.Width := 1;

Image.Canvas.Pen.Color := clGreen;

Image.Canvas.Rectangle (CellRect (X, Y));

Image.Canvas.Rectangle (CellRect (X, Y, -1));

end;

end;

if Animate then

begin

if FlipBoard then

begin

X1 := ImageList. Width * (7 — FAnimateWay[FAnimateStep-1] mod 8);

Y1 := ImageList. Height * (FAnimateWay[FAnimateStep-1] div 8);

X2 := ImageList. Width * (7 — FAnimateWay[FAnimateStep] mod 8);

Y2 := ImageList. Height * (FAnimateWay[FAnimateStep] div 8);

end

else begin

X1 := ImageList. Width * (FAnimateWay[FAnimateStep-1] mod 8);

Y1 := ImageList. Height * (7 — FAnimateWay[FAnimateStep-1] div 8);

X2 := ImageList. Width * (FAnimateWay[FAnimateStep] mod 8);

Y2 := ImageList. Height * (7 — FAnimateWay[FAnimateStep] div 8);

end;

P := FAnimateSubStep /ANIMATE_SUBSTEP_COUNT;

Q := 1 — P;

X := Round (Q*X1+P*X2);

Y := Round (Q*Y1+P*Y2);

TransparentImages.Draw (Image.Canvas, X, Y, FAnimateObject);

end;

Image.Refresh;

end;

procedure TPositionFrame. SelectCell (X, Y: Integer);

begin

if IsWhite (X, Y) then Exit;

FSelected := CellToField (X, Y);

RefreshView;

end;

procedure TPositionFrame. SetFlipBoard (const Value: Boolean);

begin

if FFlipBoard = Value then Exit;

FFlipBoard := Value;

RefreshView;

end;

procedure TPositionFrame. SetPosition (const Position: TPosition; NeedAnimate: Boolean);

begin

FAnimatePosition := FPosition;

FPosition := Position;

if AcceptMove then PrepareAccept;

if NeedAnimate and (Position.MoveStr[0] <> -1)

then BeginAnimate (Position)

else RefreshView

end;

function TPositionFrame. CellRect (X, Y: Integer; Grow: Integer = 0): TRect;

begin

Result.Left := X * ImageList. Width — Grow;

Result.Top := Y * ImageList. Height — Grow;

Result.Right := Result. Left + ImageList. Width + 2*Grow;

Result.Bottom := Result. Top + ImageList. Height + 2*Grow;

end;

procedure TPositionFrame. SetAcceptMove (const Value: Boolean);

begin

if FAcceptMove = Value then Exit;

if Value and not PrepareAccept then Exit;

FAcceptMove := Value;

end;

procedure TPositionFrame. InitSelectMoveVars;

begin

FillChar (FSelectedCells, SizeOf (FSelectedCells), $ 00);

FillChar (FEnabledAnswer, SizeOf (FEnabledAnswer), $ 00);

FUserSelectCount := 0;

end;

function TPositionFrame. PrepareAccept: Boolean;

begin

FAnswersCount := GetMoves (FPosition, @FAnswers, ANSWERS_SIZE);

Result := (FAnswersCount <> 0) and (FAnswersCount <= ANSWERS_SIZE);

InitSelectMoveVars;

end;

procedure TPositionFrame. AddCellToMove (X, Y: Integer);

begin

if IsWhite (X, Y) then Exit;

if FUserSelectCount = 0 then

begin

BeginMove (CellToField (X, Y));

Exit;

end;

if Unselect (CellToField (X, Y)) then Exit;

if ThinkBetter (CellToField (X, Y)) then Exit;

if MoveComplete (CellToField (X, Y)) then Exit;

ContinueMove (CellToField (X, Y));

end;

procedure TPositionFrame. BeginMove (Field: Integer);

var

I: Integer;

FindMove: Boolean;

begin

FindMove := False;

for I := 0 to FAnswersCount-1 do

if FAnswers[I]. MoveStr[0] = Field then

begin

FindMove := True;

FEnabledAnswer[I] := 1;

end;

if not FindMove then Exit;

FUserSelect[0] := Field;

FUserSelectCount := 1;

FSelectedCells[Field] := True;

RefreshView;

end;

function TPositionFrame. Unselect (Field: Integer): Boolean;

var

I: Integer;

begin

Result := False;

if FUserSelectCount = 0 then Exit;

if FUserSelect[FUserSelectCount-1] <> Field then Exit;

FSelectedCells[Field] := False;

for I := 0 to FAnswersCount-1 do

if FEnabledAnswer[I] = FUserSelectCount then

FEnabledAnswer[I] := FEnabledAnswer[I] - 1;

FUserSelectCount := FUserSelectCount — 1;

RefreshView;

Result := True;

end;

function TPositionFrame. ThinkBetter (Field: Integer): Boolean;

var

I: Integer;

begin

Result := False;

if FUserSelectCount <> 1 then Exit;

for I := 0 to FAnswersCount-1 do

begin

if FAnswers[I]. MoveStr[0] = Field then

begin

InitSelectMoveVars;

BeginMove (Field);

Result := True;

Exit;

end;

end;

end;

function TPositionFrame. MoveComplete (Field: Integer): Boolean;

var

I, J: Integer;

UserMove: Integer;

begin

Result := False;

UserMove := -1;

for I := 0 to FAnswersCount-1 do

begin

if FEnabledAnswer[I] <> FUserSelectCount then Continue;

J := 2;

while FAnswers[I]. MoveStr[J] <> -1 do J := J + 1;

if FAnswers[I]. MoveStr[J-1] = Field then

if UserMove <> -1 then Exit

else UserMove := I;

end;

if UserMove = -1 then Exit;

AcceptMove := False;

FillChar (FSelectedCells, SizeOf (FSelectedCells), $ 00);

if Assigned (FOnAcceptMove) then FOnAcceptMove (Self, FAnswers[UserMove]);

Result := True;

end;

procedure TPositionFrame. ContinueMove (Field: Integer);

var

I: Integer;

FindMove: Boolean;

function FreeWay (Field1, Field2: Integer): Boolean;

var

NextI: Integer;

Direction: TDirection;

begin

Result := False;

for Direction := Low (TDirection) to High (TDirection) do

begin

NextI := Field1;

repeat

NextI := DirectionTable[Direction, NextI];

if NextI = -1 then Break;

if FPosition. Field[NextI] <> 0 then Break;

if NextI = Field2 then

begin

Result := True;

Exit;

end;

until False;

end;

end;

function SameDiagonal (StartField, Field1, Field2, Field3: Integer): Boolean;

var

FindCount: Integer;

NextI: Integer;

Direction: TDirection;

begin

Result := False;

for Direction := Low (TDirection) to High (TDirection) do

begin

NextI := StartField;

FindCount := 0;

repeat

NextI := DirectionTable[Direction, NextI];

if NextI = -1 then Break;

if NextI = Field1 then FindCount := FindCount + 1;

if NextI = Field2 then FindCount := FindCount + 1;

if NextI = Field3 then FindCount := FindCount + 1;

if FindCount = 3 then

begin

Result := True;

Exit;

end;

until False;

end;

end;

function AcceptMarginaly: Boolean;

begin

Assert (FUserSelectCount > 0);

Result :=

(FAnswers[I]. MoveStr[FUserSelectCount+1] <> -1) and // это Π½Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΏΠΎΠ»Π΅

FreeWay (FAnswers[I]. MoveStr[FUserSelectCount], Field) and // ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ

SameDiagonal (// Одна диагональ

FAnswers[I]. MoveStr[FUserSelectCount-1],

FAnswers[I].MoveStr[FUserSelectCount],

Field,

FAnswers[I].MoveStr[FUserSelectCount+1])

end;

function AcceptDirectly: Boolean;

begin

Result := Field = FAnswers[I]. MoveStr[FUserSelectCount];

end;

function AcceptVariant: Boolean;

begin

Result := AcceptDirectly or AcceptMarginaly;

end;

begin

FindMove := False;

for I := 0 to FAnswersCount-1 do

begin if FEnabledAnswer[I] <> FUserSelectCount then Continue;

if AcceptVariant then

begin

FindMove := True;

FEnabledAnswer[I] := FEnabledAnswer[I] + 1;

end; end;

if FindMove then

begin

FUserSelect[FUserSelectCount] := Field;

FUserSelectCount := FUserSelectCount + 1;

FSelectedCells[Field] := True;

RefreshView; end;

end;

function TPositionFrame. GetAnimate: Boolean;

begin

Result := Timer. Enabled;

end;

procedure TPositionFrame. BeginAnimate (const Position: TPosition);

var

AnimateWayPos: Integer;

I: Integer;

procedure ProcessPair (Field1, Field2: Integer);

var

Delta: Integer;

Step: Integer;

NextI: Integer;

begin

Delta := Abs (Field1 — Field2);

if Field1 > Field2 then

begin

if Delta mod 9 = 0

then Step := -9

else Step := -7

end

else begin

if Delta mod 9 = 0

then Step := 9

else Step := 7

end;

NextI := Field1;

repeat

NextI := NextI + Step;

FAnimateWay[AnimateWayPos] := NextI;

AnimateWayPos := AnimateWayPos + 1;

until NextI = Field2;

end;

begin

with Position do // ВычисляСм ΠΏΡƒΡ‚ΡŒ

begin if MoveStr[0] = -1 then Exit;

FAnimateWay[0] := DecodeField[MoveStr[0]];

AnimateWayPos := 1; I := 1;

while MoveStr[I] <> -1 do begin

ProcessPair (DecodeField[MoveStr[I-1]], DecodeField[MoveStr[I]]);

I := I + 1; end;

case FAnimatePosition. Field[MoveStr[0]] of

brWhiteSingle: FAnimateObject := 0;

brBlackSingle: FAnimateObject := 1;

brWhiteMam: FAnimateObject := 2;

brBlackMam: FAnimateObject := 3; end;

end;

FAnimateWay[AnimateWayPos] := -1;

FAnimateStep := 1;

FAnimateSubStep := 0;

Timer.Enabled := True;

end;

procedure TPositionFrame. TimerTimer (Sender: TObject);

begin

FAnimateSubStep := FAnimateSubStep + 1;

if FAnimateSubStep = ANIMATE_SUBSTEP_COUNT then

begin

FAnimateStep := FAnimateStep + 1;

if FAnimateWay[FAnimateStep] = -1 then Timer. Enabled := False;

if (FAnimateObject = 0) and (FAnimateWay[FAnimateStep] >= 56) then FAnimateObject := 2;

if (FAnimateObject = 1) and (FAnimateWay[FAnimateStep] <= 7) then FAnimateObject := 3;

FAnimateSubStep := 0;

end;

RefreshView;

end;

end.

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