Implementation of Lucifers Pastime
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

278 рядки
3.8KB

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my $PAD_EVEN = " ";
  5. my $PAD_ODD = " ";
  6. my $HEX_1 = '-/--\-';
  7. my $HEX_2 = '| __ |';
  8. my $HEX_3 = '| |';
  9. my $PREF_1 = '\-';
  10. my $PREF_2 = ' ';
  11. my $PREF_3 = ' ';
  12. # Pieces
  13. my $MG_A = 0; # Apprentice
  14. my $MG_I = 1; # Iron Maiden
  15. my $MG_N = 2; # Nekomata
  16. my $MG_IT = 3; # Ittan-Momen
  17. my $MG_H = 4; # Harpy
  18. my $MG_S = 5; # Slime
  19. my $MG_RC = 6; # Redcap
  20. my $MG_RO = 7; # Red Oni
  21. my $MG_HS = 8; # Holstaur
  22. my $MG_B = 9; # Blue Oni
  23. my $MG_P = 10; # Preistess
  24. my $MG_IM = 11; # Imp
  25. my $MG_F = 12; # False Angel
  26. my $MG_QS = 13; # Queen slime
  27. my $MG_AU = 14; # Automaton
  28. my $MG_SY = 15; # Sylph
  29. my $MG_Q = 16; # Queen
  30. my %AXIS = (
  31. "A" => 1,
  32. "B" => 2,
  33. "C" => 3,
  34. "D" => 4,
  35. "E" => 5,
  36. "F" => 6,
  37. "G" => 7,
  38. "H" => 8,
  39. "I" => 9,
  40. "J" => 10,
  41. "K" => 11
  42. );
  43. #
  44. # /--\ +1
  45. # | __ |
  46. # | |+1
  47. # \--/
  48. # -1 -1
  49. #
  50. # [Row change, Col change]
  51. my %MOVE = (
  52. $MG_A => [
  53. [-1, 1],
  54. [ 0, 1]
  55. ],
  56. $MG_Q => [
  57. [ 0, 1],
  58. [ 1, 0],
  59. [-1, 0],
  60. [ 0,-1],
  61. ],
  62. $MG_I => [
  63. [0,0]
  64. ],
  65. $MG_IT => [
  66. [ 0,-1],
  67. [ 1,-1]
  68. ],
  69. $MG_N => [
  70. [-1, 2],
  71. [ 1,-2]
  72. ],
  73. $MG_H => [
  74. [-3, 2],
  75. [-1,-2],
  76. [ 1, 2],
  77. [ 3,-2]
  78. ],
  79. $MG_RC => [
  80. [-1, 0],
  81. [-2, 0],
  82. [ 0, 1],
  83. [ 0, 2]
  84. ],
  85. $MG_S => [
  86. [-1, 1],
  87. [-2, 2],
  88. [ 0, 1],
  89. [ 0, 2],
  90. [ 0,-1],
  91. [ 0,-2],
  92. [ 1,-1],
  93. [ 2,-2],
  94. ],
  95. $MG_HS => [
  96. [-3, 1],
  97. [-2,-1],
  98. [ 2, 1],
  99. [ 3,-1]
  100. ],
  101. $MG_RO => [
  102. [-1, 1],
  103. [ 0, 1],
  104. [ 1, 1],
  105. [ 1,-2]
  106. ],
  107. $MG_B => [
  108. [-1, 1],
  109. [ 0, 1],
  110. [ 0,-2],
  111. [ 1,-2]
  112. ],
  113. $MG_P => [
  114. [-4, 2],
  115. [-2, 1],
  116. [-2,-2],
  117. [-1,-1],
  118. [ 1, 1],
  119. [ 2,-1],
  120. [ 2, 2],
  121. [ 4,-2]
  122. ],
  123. $MG_IM => [
  124. [-2, 1],
  125. [-1,-1],
  126. [-1, 2],
  127. [ 1, 1],
  128. [ 1,-1],
  129. [ 1,-2],
  130. [ 2,-1]
  131. ],
  132. $MG_F => [
  133. [-1, 0],
  134. [-1, 1],
  135. [ 0, 1],
  136. [ 0,-1],
  137. [ 1, 0],
  138. [ 1,-1]
  139. ],
  140. $MG_QS => [
  141. [-3, 3],
  142. [-2, 2],
  143. [-2, 0],
  144. [-1, 0],
  145. [-1, 1],
  146. [ 0, 1],
  147. [ 0, 2],
  148. [ 0, 3],
  149. [ 0,-1],
  150. [ 0,-2],
  151. [ 0,-3],
  152. [ 1, 0],
  153. [ 1,-1],
  154. [ 2, 0],
  155. [ 2,-2],
  156. [ 3,-3],
  157. ],
  158. $MG_AU => [
  159. [-1, 0],
  160. [-1, 1],
  161. [ 0, 1],
  162. [ 0,-1],
  163. [ 1, 0],
  164. [ 1,-1]
  165. ],
  166. $MG_SY => [
  167. [-4, 4],
  168. [-3, 3],
  169. [-3, 2],
  170. [-1,-2],
  171. [ 0,-2],
  172. [ 0,-3],
  173. [ 0, 3],
  174. [ 0, 4],
  175. [ 1, 2],
  176. [ 3,-2],
  177. [ 3,-3],
  178. [ 4,-4]
  179. ]
  180. );
  181. # Special cells
  182. my $EMPTY_CELL = 900;
  183. my %board;
  184. sub disp_1(){
  185. return $HEX_1
  186. }
  187. sub disp_2(){
  188. return $HEX_2
  189. }
  190. sub disp_3(){
  191. return $HEX_3;
  192. }
  193. sub add_pad($$$$){
  194. my ($s0, $s1, $s2, $r0) = @_;
  195. my $n0;
  196. $n0 = length($r0);
  197. $s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
  198. $s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
  199. $s1 =~ s/^ {$n0}/$r0/;
  200. $s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
  201. return ($s0, $s1, $s2);
  202. }
  203. sub add_cell($$$$$){
  204. my ($s0, $s1, $s2, $r0, $c0) = @_;
  205. $s0 .= disp_1();
  206. $s1 .= disp_2();
  207. $s2 .= disp_3();
  208. return ($s0, $s1, $s2);
  209. }
  210. sub disp_0($){
  211. my $r0;
  212. my ($s0, $s1, $s2);
  213. $r0 = shift;
  214. ($s0, $s1, $s2) = add_pad($s0, $s1, $s2, $r0);
  215. for my $i (1..11){
  216. ($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
  217. }
  218. return $s0."\n".$s1."\n".$s2."\n";
  219. }
  220. sub disp_row($){
  221. return disp_0(shift);
  222. }
  223. sub disp_board(){
  224. for my $i (map {11-$_+1} (1..11)) {
  225. printf("%s", disp_row($i));
  226. }
  227. }
  228. sub cell_index($){
  229. my ($chr1, $chr2) = (split(//, $_[0]));
  230. return ($AXIS{$chr1}, $chr2);
  231. }
  232. %board = map {
  233. $_ => $EMPTY_CELL
  234. } map {
  235. my $l0;
  236. $l0 = $_;
  237. (map {$l0.$_} ("1".."11"))
  238. } ("A".."K");
  239. disp_board()
  240. # disp_0("C1");
  241. # printf(">>%s, %s\n", cell_index("C1"));