Implementation of Lucifers Pastime
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

301 řádky
4.3KB

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