Implementation of Lucifers Pastime
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
6.8KB

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use utf8;
  5. my $PAD_AXIS = " ";
  6. my $PAD_EVEN = " ";
  7. my $PAD_ODD = " ";
  8. my $HEX_1 = '-/--\-';
  9. my $HEX_2 = '| __ |';
  10. my $HEX_3 = '| |';
  11. my $SHADE_CHR = chr(0x2592);
  12. my $ALT_US = chr(0x2017);
  13. my $ALT_PIPE = chr(0x2016);
  14. my $HL_1 = "|_____";
  15. my $HL_2 = $ALT_PIPE.$ALT_US.$ALT_US.$ALT_US.$ALT_US.$ALT_US;
  16. my $SUB_CHR = "_";
  17. my $ALT_SUB_CHR = $ALT_US;
  18. my $PREF_1 = substr($HEX_1, -2, 2);
  19. my $PREF_2 = ' ';
  20. my $PREF_3 = ' ';
  21. my $TRAIL_1 = substr($HEX_1, 0, 1);
  22. my $TRAIL_2 = substr($HEX_1, -1, 1);
  23. my $TRAIL_3 = substr($HEX_1, 0, 2);
  24. # Pieces
  25. my $MG_A = "A"; # Apprentice
  26. my $MG_I = "I"; # Iron Maiden
  27. my $MG_N = "N"; # Nekomata
  28. my $MG_IT = "It"; # Ittan-Momen
  29. my $MG_H = "H"; # Harpy
  30. my $MG_S = "S"; # Slime
  31. my $MG_RC = "Rc"; # Redcap
  32. my $MG_RO = "Hs"; # Red Oni
  33. my $MG_HS = "Ro"; # Holstaur
  34. my $MG_B = "B"; # Blue Oni
  35. my $MG_P = "P"; # Preistess
  36. my $MG_IM = "Im"; # Imp
  37. my $MG_F = "F"; # False Angel
  38. my $MG_QS = "Qs"; # Queen slime
  39. my $MG_AU = "Au"; # Automaton
  40. my $MG_SY = "Sy"; # Sylph
  41. my $MG_Q = "Q"; # Queen
  42. # Players
  43. my $P1 = "P1";
  44. my $P2 = "P2";
  45. my $DIV = ":";
  46. my %AXIS = (
  47. "A" => 1,
  48. "B" => 2,
  49. "C" => 3,
  50. "D" => 4,
  51. "E" => 5,
  52. "F" => 6,
  53. "G" => 7,
  54. "H" => 8,
  55. "I" => 9,
  56. "J" => 10,
  57. "K" => 11
  58. );
  59. my %AXIS_RV = map {
  60. $AXIS{$_} => $_
  61. } keys(%AXIS);
  62. #
  63. # /--\ +1
  64. # | __ |
  65. # | |+1
  66. # \--/
  67. # -1 -1
  68. #
  69. # [Row mvoe, Diag move]
  70. my %MOVE = (
  71. $MG_A => [
  72. [-1, 1],
  73. [ 0, 1]
  74. ],
  75. $MG_Q => [
  76. [ 0, 1],
  77. [ 1, 0],
  78. [-1, 0],
  79. [ 0,-1],
  80. ],
  81. $MG_I => [
  82. [0,0]
  83. ],
  84. $MG_IT => [
  85. [ 0,-1],
  86. [ 1,-1]
  87. ],
  88. $MG_N => [
  89. [-1, 2],
  90. [ 1,-2]
  91. ],
  92. $MG_H => [
  93. [-3, 2],
  94. [-1,-2],
  95. [ 1, 2],
  96. [ 3,-2]
  97. ],
  98. $MG_RC => [
  99. [-1, 0],
  100. [-2, 0],
  101. [ 0, 1],
  102. [ 0, 2]
  103. ],
  104. $MG_S => [
  105. [-1, 1],
  106. [-2, 2],
  107. [ 0, 1],
  108. [ 0, 2],
  109. [ 0,-1],
  110. [ 0,-2],
  111. [ 1,-1],
  112. [ 2,-2],
  113. ],
  114. $MG_HS => [
  115. [-3, 1],
  116. [-2,-1],
  117. [ 2, 1],
  118. [ 3,-1]
  119. ],
  120. $MG_RO => [
  121. [-1, 1],
  122. [ 0, 1],
  123. [ 1, 1],
  124. [ 1,-2]
  125. ],
  126. $MG_B => [
  127. [-1, 1],
  128. [ 0, 1],
  129. [ 0,-2],
  130. [ 1,-2]
  131. ],
  132. $MG_P => [
  133. [-4, 2],
  134. [-2, 1],
  135. [-2,-2],
  136. [-1,-1],
  137. [ 1, 1],
  138. [ 2,-1],
  139. [ 2, 2],
  140. [ 4,-2]
  141. ],
  142. $MG_IM => [
  143. [-2, 1],
  144. [-1,-1],
  145. [-1, 2],
  146. [ 1, 1],
  147. [ 1,-1],
  148. [ 1,-2],
  149. [ 2,-1]
  150. ],
  151. $MG_F => [
  152. [-1, 0],
  153. [-1, 1],
  154. [ 0, 1],
  155. [ 0,-1],
  156. [ 1, 0],
  157. [ 1,-1]
  158. ],
  159. $MG_QS => [
  160. [-3, 3],
  161. [-2, 2],
  162. [-2, 0],
  163. [-1, 0],
  164. [-1, 1],
  165. [ 0, 1],
  166. [ 0, 2],
  167. [ 0, 3],
  168. [ 0,-1],
  169. [ 0,-2],
  170. [ 0,-3],
  171. [ 1, 0],
  172. [ 1,-1],
  173. [ 2, 0],
  174. [ 2,-2],
  175. [ 3,-3],
  176. ],
  177. $MG_AU => [
  178. [-1, 0],
  179. [-1, 1],
  180. [ 0, 1],
  181. [ 0,-1],
  182. [ 1, 0],
  183. [ 1,-1]
  184. ],
  185. $MG_SY => [
  186. [-4, 4],
  187. [-3, 3],
  188. [-3, 2],
  189. [-1,-2],
  190. [ 0,-2],
  191. [ 0,-3],
  192. [ 0, 3],
  193. [ 0, 4],
  194. [ 1, 2],
  195. [ 3,-2],
  196. [ 3,-3],
  197. [ 4,-4]
  198. ]
  199. );
  200. # Special cells
  201. my $EMPTY_CELL = "_";
  202. my %board;
  203. # Display pieces
  204. #==================================================
  205. sub f_1($$){
  206. my $p = shift;
  207. my $c0 = shift;
  208. my $s0;
  209. $p =~ s/($P1|$P2)$DIV//;
  210. $p .= "_" if length($p) < 2;
  211. $s0 = $HEX_2;
  212. $s0 =~ s/$SUB_CHR{1,2}/$p/;
  213. if($c0 % 2 == 0){
  214. $s0 =~ s/$SUB_CHR/$ALT_SUB_CHR/g;
  215. }
  216. return $s0;
  217. }
  218. # Display lines
  219. #==================================================
  220. sub disp_1($$){
  221. my ($r0, $c0) = (shift, shift);
  222. return $HEX_1;
  223. }
  224. sub disp_2($$){
  225. my ($r0, $c0) = (shift, shift);
  226. my $p;
  227. # Cell notation
  228. my $not;
  229. $not = cell_index_rev($c0, $r0);
  230. $p = $board{$not};
  231. return f_1($p, $c0);
  232. # my ($r0, $c0) = (shift, shift);
  233. # return $HEX_2;
  234. }
  235. sub disp_3($$){
  236. my ($r0, $c0) = (shift, shift);
  237. return $HEX_3;
  238. }
  239. sub disp_y_axis($$$$){
  240. my ($s0, $s1, $s2, $r0) = @_;
  241. my $n0;
  242. $n0 = length($r0);
  243. $s0 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_1;
  244. $s1 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_2;
  245. $s1 =~ s/^ {$n0}/$r0/;
  246. $s2 = $r0 % 2 == 1 ? $PAD_ODD : $PAD_EVEN.$PREF_3;
  247. return ($s0, $s1, $s2);
  248. }
  249. # Display cell
  250. #==================================================
  251. sub add_cell($$$$$){
  252. my ($s0, $s1, $s2, $r0, $c0) = @_;
  253. $s0 .= disp_1($r0, $c0);
  254. $s1 .= disp_2($r0, $c0);
  255. $s2 .= disp_3($r0, $c0);
  256. # if($c0 % 2 == 0){
  257. # $s0 =~ s/ /$SHADE_CHR/g;
  258. # $s1 =~ s/ /$SHADE_CHR/g;
  259. # $s2 =~ s/ /$SHADE_CHR/g;
  260. # }
  261. return ($s0, $s1, $s2);
  262. }
  263. sub disp_0($){
  264. my $r0;
  265. my ($s0, $s1, $s2);
  266. $r0 = shift;
  267. # Append the y axis
  268. ($s0, $s1, $s2) = disp_y_axis($s0, $s1, $s2, $r0);
  269. # Iterate through the cells
  270. for my $i (1..11){
  271. ($s0, $s1, $s2) = add_cell($s0, $s1, $s2, $r0, $i);
  272. }
  273. return $s0."\n".$s1."\n".$s2."\n";
  274. }
  275. # Display row
  276. #==================================================
  277. sub disp_row($){
  278. my $row;
  279. my $r0;
  280. $r0 = shift;
  281. $row = disp_0($r0);
  282. # Handle trailing characters
  283. if($r0 % 2 == 1){
  284. # Trim the start of the first line
  285. $row =~ s/$TRAIL_1/ /;
  286. # Trim the end of the first line
  287. $row =~ s/\n/$TRAIL_3\n/
  288. }else{
  289. # Trim the end of the last line
  290. $row =~ s/$TRAIL_2\n/ \n/m;
  291. }
  292. return $row;
  293. }
  294. sub disp_trailing_row(){
  295. my $s0;
  296. my $s1;
  297. $s0 = $PAD_EVEN.$PREF_1;
  298. # Clear some chars from
  299. # our hex patterns
  300. $s1 = $HEX_1;
  301. substr($s1, 2,2) = " ";
  302. # Append hex pattern to
  303. # trailing row
  304. for my $i (1..11){
  305. $s0 .= $s1;
  306. }
  307. # Clear one last pair of
  308. # chrs
  309. substr($s0, -2,2) = " ";
  310. $s0 .= "\n";
  311. return $s0;
  312. }
  313. sub disp_x_axis(){
  314. my $s0;
  315. $s0 = $PAD_AXIS;
  316. $s0 .= join(
  317. $PAD_AXIS, map{
  318. $AXIS_RV{$_}
  319. }(1..11));
  320. $s0 .= "\n";
  321. $s0 .= $PAD_AXIS;
  322. $s0 .= join(
  323. "", map{
  324. $_ % 2 == 1 ? $HL_1 : $HL_2
  325. }(1..11));
  326. $s0 .= "\n";
  327. return $s0
  328. }
  329. # Display board
  330. #==================================================
  331. sub disp_board(){
  332. my $b;
  333. for my $i (map {11-$_+1} (1..11)) {
  334. $b .= disp_row($i);
  335. }
  336. $b .= disp_trailing_row();
  337. $b .= disp_x_axis();
  338. $b =~ s/$TRAIL_1$TRAIL_3\n/\n/m;
  339. for my $i (1..11-1){
  340. substr($b, 2+6*$i, 2) = " ";
  341. }
  342. printf("%s", $b);
  343. }
  344. sub cell_index_rev($$){
  345. return $AXIS_RV{$_[0]}.$_[1];
  346. }
  347. sub cell_index($){
  348. my ($chr1, $chr2) = (split(//, $_[0]));
  349. return ($AXIS{$chr1}, $chr2);
  350. }
  351. # Main starts here!
  352. binmode(STDOUT, ":utf8");
  353. # Creates a hash of the the form
  354. # $board{cell_notation} = piece_enum
  355. %board = map {
  356. $_ => $EMPTY_CELL
  357. } map {
  358. my $l0;
  359. $l0 = $_;
  360. (map {$l0.$_} ("1".."11"))
  361. } map {
  362. $AXIS_RV{$_}
  363. }(1...11);
  364. $board{"F5"} = $P1.$DIV.$MG_QS;
  365. disp_board();
  366. # disp_0("C1");
  367. # printf(">>%s, %s\n", cell_index("C1"));