Implementation of Lucifers Pastime
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

640 lignes
15KB

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use utf8;
  5. my $ARRAY = "ARRAY";
  6. my $X_BOX_CHR = chr(0x2573);
  7. my $GRAY_BOX_CHR = chr(0x2591);
  8. my $ALT_US = chr(0x2017);
  9. my $ALT_PIPE = chr(0x2016);
  10. my $SHADE_1_CHR = $GRAY_BOX_CHR;
  11. my $SHADE_2_CHR = $X_BOX_CHR;
  12. my $PAD_AXIS = " ";
  13. my $PAD_EVEN = " ";
  14. my $PAD_ODD = " ";
  15. my $HEX_1 = '-/--\-';
  16. my $HEX_2 = '| __ |';
  17. my $HEX_3 = '| |';
  18. my $HEX_S1_1 = '-/--\-';
  19. my $HEX_S1_2 = sprintf("|%s%s%s%s|", $SHADE_1_CHR, $SHADE_1_CHR, $SHADE_1_CHR, $SHADE_1_CHR);
  20. my $HEX_S1_3 = sprintf("|%s%s%s%s|", $SHADE_1_CHR, $SHADE_1_CHR, $SHADE_1_CHR, $SHADE_1_CHR);
  21. my $HEX_S2_1 = '-/--\-';
  22. my $HEX_S2_2 = sprintf("|%s%s%s%s|", $SHADE_2_CHR, $SHADE_2_CHR, $SHADE_2_CHR, $SHADE_2_CHR);
  23. my $HEX_S2_3 = sprintf("|%s%s%s%s|", $SHADE_2_CHR, $SHADE_2_CHR, $SHADE_2_CHR, $SHADE_2_CHR);
  24. my $HEX_S3_1 = '-/--\-';
  25. my $HEX_S3_2 = sprintf("|%s%s%s%s|", $SHADE_2_CHR, $SHADE_2_CHR, $SHADE_1_CHR, $SHADE_1_CHR);
  26. my $HEX_S3_3 = sprintf("|%s%s%s%s|", $SHADE_2_CHR, $SHADE_2_CHR, $SHADE_1_CHR, $SHADE_1_CHR);
  27. my $HL_1 = "|____ ";
  28. my $HL_2 = $ALT_PIPE.$ALT_US.$ALT_US.$ALT_US.$ALT_US." ";
  29. my $SUB_CHR = "_";
  30. my $ALT_SUB_CHR = "=";
  31. my $BLANK_CELL_CHR = $ALT_US;
  32. my $PREF_1 = substr($HEX_1, -2, 2);
  33. my $PREF_2 = ' ';
  34. my $PREF_3 = ' ';
  35. my $TRAIL_1 = substr($HEX_1, 0, 1);
  36. my $TRAIL_2 = substr($HEX_1, -1, 1);
  37. my $TRAIL_3 = substr($HEX_1, 0, 2);
  38. # Pieces
  39. my $MG_A = "A"; # Apprentice
  40. my $MG_I = "I"; # Iron Maiden
  41. my $MG_N = "N"; # Nekomata
  42. my $MG_IT = "It"; # Ittan-Momen
  43. my $MG_H = "H"; # Harpy
  44. my $MG_S = "S"; # Slime
  45. my $MG_RC = "Rc"; # Redcap
  46. my $MG_HS = "Hs"; # Holstaur
  47. my $MG_RO = "Ro"; # Red Oni
  48. my $MG_B = "B"; # Blue Oni
  49. my $MG_P = "P"; # Preistess
  50. my $MG_IM = "Im"; # Imp
  51. my $MG_F = "F"; # False Angel
  52. my $MG_QS = "Qs"; # Queen slime
  53. my $MG_AU = "Au"; # Automaton
  54. my $MG_SY = "Sy"; # Sylph
  55. my $MG_Q = "Q"; # Queen
  56. # Players
  57. my $P1 = "P1";
  58. my $P2 = "P2";
  59. my $DIV = ":";
  60. my %AXIS = (
  61. "A" => 1,
  62. "B" => 2,
  63. "C" => 3,
  64. "D" => 4,
  65. "E" => 5,
  66. "F" => 6,
  67. "G" => 7,
  68. "H" => 8,
  69. "I" => 9,
  70. "J" => 10,
  71. "K" => 11
  72. );
  73. my %AXIS_RV = map {
  74. $AXIS{$_} => $_
  75. } keys(%AXIS);
  76. package MoveStruct;
  77. use warnings;
  78. use strict;
  79. sub new {
  80. my $class = shift;
  81. my $self = { @_ };
  82. die "invalid MoveStruct {\"mov\"}" unless $self->{"mov"};
  83. die "invalid MoveStruct ->{\"type\"}" unless $self->{"type"};
  84. die "invalid MoveStruct type" unless ref($self->{"mov"}) eq $ARRAY;
  85. return bless $self, $class;
  86. }
  87. package main;
  88. #
  89. # /--\ +1
  90. # | __ |
  91. # | |+1
  92. # \--/
  93. # -1 -1
  94. #
  95. # ODD
  96. # UP: 0, +1
  97. # DOWN: -1, -1
  98. # EVEN
  99. # UP: +1, +1
  100. # DOWN: +0, -1
  101. # [Row move, Diag move]
  102. # Special cells
  103. my $EMPTY_CELL = "_";
  104. # Shade enum
  105. my $SHADE_3_ENUM = 0b011;
  106. my $SHADE_2_ENUM = 0b010;
  107. my $SHADE_1_ENUM = 0b001;
  108. my $EMPTY_ENUM = 0;
  109. my %SHADE = (
  110. $SHADE_1_ENUM => [$HEX_S1_1, $HEX_S1_2, $HEX_S1_3],
  111. $SHADE_2_ENUM => [$HEX_S2_1, $HEX_S2_2, $HEX_S2_3],
  112. $SHADE_3_ENUM => [$HEX_S3_1, $HEX_S3_2, $HEX_S3_3],
  113. $EMPTY_ENUM => [$HEX_1, $HEX_2, $HEX_3]
  114. );
  115. my $MOVE_ENUM = $SHADE_1_ENUM;
  116. my $BLOCK_ENUM = $SHADE_2_ENUM;
  117. my $MOVBLOCK_ENUM = $SHADE_3_ENUM;
  118. my $ERR_C_1 = -1;
  119. my %MOVE = (
  120. $MG_A => [
  121. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  122. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM)
  123. ],
  124. $MG_Q => [
  125. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  126. MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM),
  127. MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM),
  128. MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM)
  129. ],
  130. $MG_I => [
  131. MoveStruct->new("mov" => [0,0], "type" => $MOVE_ENUM)
  132. ],
  133. $MG_IT => [
  134. MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM),
  135. MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM)
  136. ],
  137. $MG_N => [
  138. MoveStruct->new("mov" => [-1, 2], "type" => $MOVE_ENUM),
  139. MoveStruct->new("mov" => [ 1,-2], "type" => $MOVE_ENUM)
  140. ],
  141. $MG_H => [
  142. MoveStruct->new("mov" => [-3, 2], "type" => $MOVE_ENUM),
  143. MoveStruct->new("mov" => [-1,-2], "type" => $MOVE_ENUM),
  144. MoveStruct->new("mov" => [ 1, 2], "type" => $MOVE_ENUM),
  145. MoveStruct->new("mov" => [ 3,-2], "type" => $MOVE_ENUM)
  146. ],
  147. $MG_RC => [
  148. MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM),
  149. MoveStruct->new("mov" => [-2, 0], "type" => $MOVE_ENUM),
  150. MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM),
  151. MoveStruct->new("mov" => [ 2, 0], "type" => $MOVE_ENUM)
  152. ],
  153. $MG_S => [
  154. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  155. MoveStruct->new("mov" => [-2, 2], "type" => $MOVE_ENUM),
  156. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  157. MoveStruct->new("mov" => [ 0, 2], "type" => $MOVE_ENUM),
  158. MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM),
  159. MoveStruct->new("mov" => [ 0,-2], "type" => $MOVE_ENUM),
  160. MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM),
  161. MoveStruct->new("mov" => [ 2,-2], "type" => $MOVE_ENUM),
  162. ],
  163. $MG_HS => [
  164. MoveStruct->new("mov" => [-3, 1], "type" => $MOVE_ENUM),
  165. MoveStruct->new("mov" => [-2,-1], "type" => $MOVE_ENUM),
  166. MoveStruct->new("mov" => [ 2, 1], "type" => $MOVE_ENUM),
  167. MoveStruct->new("mov" => [ 3,-1], "type" => $MOVE_ENUM)
  168. ],
  169. $MG_RO => [
  170. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  171. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  172. MoveStruct->new("mov" => [ 1, 1], "type" => $MOVE_ENUM),
  173. MoveStruct->new("mov" => [ 1,-2], "type" => $MOVE_ENUM)
  174. ],
  175. $MG_B => [
  176. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  177. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  178. MoveStruct->new("mov" => [ 0,-2], "type" => $MOVE_ENUM),
  179. MoveStruct->new("mov" => [ 2,-2], "type" => $MOVE_ENUM)
  180. ],
  181. $MG_P => [
  182. MoveStruct->new("mov" => [-4, 2], "type" => $MOVE_ENUM),
  183. MoveStruct->new("mov" => [-2, 1], "type" => $MOVE_ENUM),
  184. MoveStruct->new("mov" => [-2,-2], "type" => $MOVE_ENUM),
  185. MoveStruct->new("mov" => [-1,-1], "type" => $MOVE_ENUM),
  186. MoveStruct->new("mov" => [ 1, 1], "type" => $MOVE_ENUM),
  187. MoveStruct->new("mov" => [ 2,-1], "type" => $MOVE_ENUM),
  188. MoveStruct->new("mov" => [ 2, 2], "type" => $MOVE_ENUM),
  189. MoveStruct->new("mov" => [ 4,-2], "type" => $MOVE_ENUM)
  190. ],
  191. $MG_IM => [
  192. MoveStruct->new("mov" => [-2, 1], "type" => $MOVE_ENUM),
  193. MoveStruct->new("mov" => [-1,-1], "type" => $MOVE_ENUM),
  194. MoveStruct->new("mov" => [-1, 2], "type" => $MOVE_ENUM),
  195. MoveStruct->new("mov" => [ 1, 1], "type" => $MOVE_ENUM),
  196. MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM),
  197. MoveStruct->new("mov" => [ 2,-1], "type" => $MOVE_ENUM)
  198. ],
  199. $MG_F => [
  200. MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM),
  201. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  202. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  203. MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM),
  204. MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM),
  205. MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM)
  206. ],
  207. $MG_QS => [
  208. MoveStruct->new("mov" => [-3, 3], "type" => $MOVE_ENUM),
  209. MoveStruct->new("mov" => [-2, 2], "type" => $MOVE_ENUM),
  210. MoveStruct->new("mov" => [-2, 0], "type" => $MOVE_ENUM),
  211. MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM),
  212. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  213. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  214. MoveStruct->new("mov" => [ 0, 2], "type" => $MOVE_ENUM),
  215. MoveStruct->new("mov" => [ 0, 3], "type" => $MOVE_ENUM),
  216. MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM),
  217. MoveStruct->new("mov" => [ 0,-2], "type" => $MOVE_ENUM),
  218. MoveStruct->new("mov" => [ 0,-3], "type" => $MOVE_ENUM),
  219. MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM),
  220. MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM),
  221. MoveStruct->new("mov" => [ 2, 0], "type" => $MOVE_ENUM),
  222. MoveStruct->new("mov" => [ 2,-2], "type" => $MOVE_ENUM),
  223. MoveStruct->new("mov" => [ 3,-3], "type" => $MOVE_ENUM),
  224. MoveStruct->new("mov" => [ 3, 0], "type" => $MOVE_ENUM),
  225. MoveStruct->new("mov" => [-3, 0], "type" => $MOVE_ENUM)
  226. ],
  227. $MG_AU => [
  228. MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM),
  229. MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM),
  230. MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM),
  231. MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM),
  232. MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM),
  233. MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM)
  234. ],
  235. $MG_SY => [
  236. MoveStruct->new("mov" => [-4, 4], "type" => $MOVE_ENUM),
  237. MoveStruct->new("mov" => [-3, 3], "type" => $MOVE_ENUM),
  238. MoveStruct->new("mov" => [-3, 2], "type" => $MOVE_ENUM),
  239. MoveStruct->new("mov" => [-1,-2], "type" => $MOVE_ENUM),
  240. MoveStruct->new("mov" => [ 0,-4], "type" => $MOVE_ENUM),
  241. MoveStruct->new("mov" => [ 0,-3], "type" => $MOVE_ENUM),
  242. MoveStruct->new("mov" => [ 0, 3], "type" => $MOVE_ENUM),
  243. MoveStruct->new("mov" => [ 0, 4], "type" => $MOVE_ENUM),
  244. MoveStruct->new("mov" => [ 1, 2], "type" => $MOVE_ENUM),
  245. MoveStruct->new("mov" => [ 3,-2], "type" => $MOVE_ENUM),
  246. MoveStruct->new("mov" => [ 3,-3], "type" => $MOVE_ENUM),
  247. MoveStruct->new("mov" => [ 4,-4], "type" => $MOVE_ENUM)
  248. ]
  249. );
  250. my %sc = ();
  251. my %board;
  252. # Display pieces
  253. #==================================================
  254. # I hate this function
  255. sub f_1($$$){
  256. my $p = shift;
  257. my $c0 = shift;
  258. my $hex = shift;
  259. my $s0;
  260. $p =~ s/($P1|$P2)$DIV//;
  261. $p .= "_" if length($p) < 2;
  262. $s0 = $hex;
  263. $s0 =~ s/$SUB_CHR{1,2}/$p/;
  264. unless($p eq "__"){
  265. substr($s0, 2,2) = $p;
  266. }
  267. if($c0 % 2 == 0){
  268. $s0 =~ s/$SUB_CHR/$BLANK_CELL_CHR/g;
  269. }
  270. return $s0;
  271. }
  272. # Display shade
  273. #==================================================
  274. sub shade_cell($$){
  275. my $not = shift;
  276. my $en = shift;
  277. $sc{$not} = $en unless (grep /^$not$/, keys(%sc));
  278. }
  279. sub shade_t($){
  280. my $not = shift;
  281. return $sc{$not} if (grep /^$not$/, keys(%sc));
  282. return $EMPTY_ENUM;
  283. }
  284. sub get_shade_chr($){
  285. my $en = shift;
  286. return $SHADE{$en};
  287. }
  288. sub shade_lookup($$){
  289. my ($r0, $c0) = (shift, shift);
  290. my $not;
  291. $not = cell_index_rev($c0, $r0);
  292. return get_shade_chr(shade_t($not));
  293. }
  294. # Display lines
  295. #==================================================
  296. sub disp_1($$){
  297. my ($r0, $c0) = (shift, shift);
  298. my $hex;
  299. $hex = shade_lookup($r0, $c0)->[0];
  300. return $hex;
  301. # return $HEX_1;
  302. }
  303. sub disp_2($$){
  304. my ($r0, $c0) = (shift, shift);
  305. my $p;
  306. my $not;
  307. my $hex;
  308. $hex = shade_lookup($r0, $c0)->[1];
  309. $not = cell_index_rev($c0, $r0);
  310. $p = $board{$not};
  311. return f_1($p, $c0, $hex);
  312. # my ($r0, $c0) = (shift, shift);
  313. # return $HEX_2;
  314. }
  315. sub disp_3($$){
  316. my ($r0, $c0) = (shift, shift);
  317. my $hex;
  318. $hex = shade_lookup($r0, $c0)->[2];
  319. return $hex;
  320. }
  321. sub disp_y_axis($$$$){
  322. my ($s0, $s1, $s2, $r0) = @_;
  323. my $n0;
  324. $n0 = length($r0);
  325. $s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
  326. $s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
  327. $s1 =~ s/^ {$n0}/$r0/;
  328. $s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
  329. return ($s0, $s1, $s2);
  330. }
  331. # Display cell
  332. #==================================================
  333. sub add_cell($$$$$){
  334. my ($s0, $s1, $s2, $r0, $c0) = @_;
  335. $s0 .= disp_1($r0, $c0);
  336. $s1 .= disp_2($r0, $c0);
  337. $s2 .= disp_3($r0, $c0);
  338. return ($s0, $s1, $s2);
  339. }
  340. sub disp_0($){
  341. my $r0;
  342. my ($s0, $s1, $s2);
  343. $r0 = shift;
  344. # Append the y axis
  345. ($s0, $s1, $s2) = disp_y_axis($s0, $s1, $s2, $r0);
  346. # Iterate through the cells
  347. for my $i (1..11){
  348. ($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
  349. }
  350. return $s0."\n".$s1."\n".$s2."\n";
  351. }
  352. # Display row
  353. #==================================================
  354. sub disp_row($){
  355. my $row;
  356. my $r0;
  357. $r0 = shift;
  358. $row = disp_0($r0);
  359. # Handle trailing characters
  360. if($r0 % 2 == 1){
  361. # Trim the start of the first line
  362. $row =~ s/$TRAIL_1/ /;
  363. # Trim the end of the first line
  364. $row =~ s/\n/$TRAIL_3\n/
  365. }else{
  366. # Trim the end of the last line
  367. $row =~ s/$TRAIL_2\n/ \n/m;
  368. }
  369. return $row;
  370. }
  371. sub disp_trailing_row(){
  372. my $s0;
  373. my $s1;
  374. $s0 = $PAD_EVEN.$PREF_1;
  375. # Clear some chars from
  376. # our hex patterns
  377. $s1 = $HEX_1;
  378. substr($s1, 2,2) = " ";
  379. # Append hex pattern to
  380. # trailing row
  381. for my $i (1..11){
  382. $s0 .= $s1;
  383. }
  384. # Clear one last pair of
  385. # chrs
  386. substr($s0, -2,2) = " ";
  387. $s0 .= "\n";
  388. return $s0;
  389. }
  390. sub disp_x_axis(){
  391. my $s0;
  392. $s0 = $PAD_AXIS;
  393. $s0 .= join(
  394. $PAD_AXIS, map{
  395. $AXIS_RV{$_}
  396. }(1..11));
  397. $s0 .= "\n";
  398. $s0 .= $PAD_AXIS;
  399. $s0 .= join(
  400. "", map{
  401. $_ % 2 == 1 ? $HL_1 : $HL_2
  402. }(1..11));
  403. $s0 .= "\n";
  404. return $s0
  405. }
  406. # Display board
  407. #==================================================
  408. sub disp_board(){
  409. my $b;
  410. for my $i (map {11-$_+1} (1..11)) {
  411. $b .= disp_row($i);
  412. }
  413. $b .= disp_trailing_row();
  414. $b .= disp_x_axis();
  415. $b =~ s/$TRAIL_1$TRAIL_3\n/\n/m;
  416. for my $i (1..11-1){
  417. substr($b, 2+6*$i, 2) = " ";
  418. }
  419. printf("%s", $b);
  420. }
  421. # Caclulate movement
  422. #==================================================
  423. sub cell_pi($){
  424. my $not = shift;
  425. return (split(/$DIV/, $board{$not}))[1]
  426. }
  427. sub cell_pl($){
  428. my $not = shift;
  429. return (split(/$DIV/, $board{$not}))[0]
  430. }
  431. sub cell_index_rev($$){
  432. return $AXIS_RV{$_[0]}.$_[1];
  433. }
  434. sub cell_index($){
  435. my ($chr1, $chr2) = (split(//, $_[0]));
  436. return ($AXIS{$chr1}, $chr2);
  437. }
  438. sub apply_shift($$){
  439. my ($not, $my_shift) = (shift, shift);
  440. my $r0;
  441. my $c0;
  442. ($r0, $c0) = cell_index($not);
  443. $r0 += $my_shift->[0];
  444. $c0 += $my_shift->[1];
  445. return $ERR_C_1 if $r0 > 11 or $c0 > 11 or $r0 < 1 or $c0 < 1;
  446. return cell_index_rev($r0, $c0);
  447. }
  448. sub calc_move($$){
  449. my ($not, $mov) = (shift, shift);
  450. my $r0;
  451. my $c0;
  452. my $x_shift;
  453. my $y_shift;
  454. my $n0;
  455. my $ni;
  456. ($c0, $r0) = cell_index($not);
  457. # get y_shift
  458. $y_shift = $mov->[1];
  459. # get x_shift
  460. $x_shift = $mov->[0];
  461. # make x_shift adjustment
  462. $ni = $y_shift != 0 ? ($y_shift / abs($y_shift)) : 1;
  463. # $ni *= -1;
  464. # moving down: $ni == -1 want value of 0
  465. # moving up: $ni == +1 want value of 1
  466. $n0 = ($r0 + (($ni + 1)/2) ) % 2;
  467. $x_shift += int(($y_shift + ($n0 * $ni)) / 2);
  468. return apply_shift($not, [$x_shift, $y_shift]);
  469. }
  470. sub shade_move($$){
  471. my ($not, $en) = (shift, shift);
  472. my $c1;
  473. my @mv1;
  474. $c1 = cell_pi($not);
  475. @mv1 = grep {
  476. $_ if $_->[0] ne $ERR_C_1;
  477. } map {
  478. [
  479. calc_move($not, $_->{"mov"}),
  480. $_->{"type"}
  481. ]
  482. } grep {
  483. ($_->{"type"} & $en) eq $_->{"type"}
  484. } @{$MOVE{$c1}};
  485. for my $mv (@mv1){
  486. shade_cell($mv->[0], $mv->[1]);
  487. }
  488. }
  489. # Main starts here!
  490. binmode(STDOUT, ":utf8");
  491. # Creates a hash of the the form
  492. # $board{cell_notation} = piece_enum
  493. %board = map {
  494. $_ => $EMPTY_CELL
  495. } map {
  496. my $l0;
  497. $l0 = $_;
  498. (map {$l0.$_} ("1".."11"))
  499. } map {
  500. $AXIS_RV{$_}
  501. }(1...11);
  502. my $m1 = "F7";
  503. # my $m1 = "A1";
  504. my $c1 = $MG_QS;
  505. $board{$m1} = $P1.$DIV.$c1;
  506. shade_move($m1, $MOVBLOCK_ENUM);
  507. disp_board();