Advertisement
Guest User

AMAZONS

a guest
Apr 24th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Fortran 11.63 KB | None | 0 0
  1. PROGRAM AMAZONS
  2. INTEGER LEGAL_MOVE, TURN_COUNT, GAME_ENDED, INPUT_CORRECT
  3. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  4. CHARACTER(LEN=6) INPUT
  5. 1 FORMAT (A11)
  6. 2 FORMAT (A32)
  7. 3 FORMAT (A26)
  8. 4 FORMAT (A10)
  9. TURN_COUNT = 1
  10. GAME_ENDED = 0
  11. CALL SET_UP_BOARD(GAME_BOARD)
  12. CALL END_GAME(GAME_BOARD, GAME_ENDED)
  13. DO WHILE (GAME_ENDED == 0)
  14. CALL PRINT_BOARD(GAME_BOARD)
  15. INPUT_CORRECT = 0
  16. IF (TURN_COUNT / 2 * 2 == TURN_COUNT) THEN
  17. PRINT 1, 'BLACKS TURN'
  18. ELSE
  19. PRINT 1, 'WHITES TURN'
  20. END IF
  21. DO WHILE (INPUT_CORRECT == 0)
  22. PRINT 2, 'ENTER PIECE AND WHERE TO MOVE IT'
  23. READ '(A)', INPUT
  24. CALL CHECK_INPUT(INPUT, GAME_BOARD, INPUT_CORRECT, TURN_COUNT)
  25. END DO
  26. CALL MAKE_MOVE(INPUT, GAME_BOARD)
  27. CALL PRINT_BOARD(GAME_BOARD)
  28. INPUT_CORRECT = 0
  29. CALL FIND_PLAYER(INPUT(1:2), GAME_BOARD, I_PLAYER, J_PLAYER)
  30. DO WHILE (INPUT_CORRECT == 0)
  31. PRINT 3, 'ENTER PLACE TO SET ON FIRE'
  32. READ '(A)', INPUT
  33. CALL CHECK_FIRE_INPUT(INPUT, INPUT_CORRECT, I_PLAYER, J_PLAYER, GAME_BOARD)
  34. END DO
  35. CALL FIND_TARGET(INPUT(1:2), I_FIRE, J_FIRE)
  36. CALL SET_FIRE(I_PLAYER, J_PLAYER, I_FIRE, J_FIRE, GAME_BOARD, LEGAL_MOVE)
  37. TURN_COUNT = TURN_COUNT + 1
  38. CALL END_GAME(GAME_BOARD, GAME_ENDED)
  39. END DO
  40. CALL PRINT_BOARD(GAME_BOARD)
  41. IF (GAME_ENDED == 1) THEN
  42. PRINT 4, 'WHITE WINS'
  43. ELSE
  44. PRINT 4, 'BLACK WINS'
  45. END IF
  46. END PROGRAM
  47.  
  48. SUBROUTINE MAKE_MOVE(INPUT, GAME_BOARD)
  49. INTEGER I_PLAYER, J_PLAYER, I_TARGET, J_TARGET
  50. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  51. CHARACTER(LEN=6) INPUT
  52. CALL FIND_PLAYER(INPUT(1:2), GAME_BOARD, I_PLAYER, J_PLAYER)
  53. CALL FIND_TARGET(INPUT(4:6), I_TARGET, J_TARGET)
  54. GAME_BOARD(I_TARGET, J_TARGET) = GAME_BOARD(I_PLAYER, J_PLAYER)
  55. GAME_BOARD(I_PLAYER, J_PLAYER) = '  '
  56. RETURN
  57. END SUBROUTINE
  58.  
  59. SUBROUTINE IS_MOVE_LEGAL(I_PLAYER, J_PLAYER, I_TARGET, J_TARGET, GAME_BOARD, LEGAL_MOVE)
  60. INTEGER I_PLAYER, J_PLAYER, I_TARGET, J_TARGET, LEGAL_MOVE
  61. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  62. LEGAL_MOVE = 0
  63. IF (I_PLAYER == I_TARGET .AND. J_PLAYER /= J_TARGET) THEN
  64. LEGAL_MOVE = 1
  65. IF (J_PLAYER > J_TARGET) THEN
  66. DO J = J_PLAYER - 1, J_TARGET, - 1
  67. IF (GAME_BOARD(I_TARGET, J) /= '  ') THEN
  68. LEGAL_MOVE = 0
  69. EXIT
  70. END IF
  71. END DO
  72. ELSE
  73. DO J = J_PLAYER + 1, J_TARGET
  74. IF (GAME_BOARD(I_TARGET, J) /= '  ') THEN
  75. LEGAL_MOVE = 0
  76. EXIT
  77. END IF
  78. END DO
  79. END IF
  80. ELSE IF (J_PLAYER == J_TARGET .AND. I_PLAYER /= I_TARGET) THEN
  81. LEGAL_MOVE = 1
  82. IF (I_PLAYER > I_TARGET) THEN
  83. DO I = I_PLAYER - 1, I_TARGET, - 1
  84. IF (GAME_BOARD(I, J_TARGET) /= '  ') THEN
  85. LEGAL_MOVE = 0
  86. EXIT
  87. END IF
  88. END DO
  89. ELSE
  90. DO I = I_PLAYER + 1, I_TARGET
  91. IF (GAME_BOARD(I, J_TARGET) /= '  ') THEN
  92. LEGAL_MOVE = 0
  93. EXIT
  94. END IF
  95. END DO
  96. END IF
  97. ELSE IF (ABS(I_PLAYER - I_TARGET) == ABS(J_PLAYER - J_TARGET) .AND. J_PLAYER /= J_TARGET) THEN
  98. LEGAL_MOVE = 1
  99. IF (I_PLAYER > I_TARGET .AND. J_PLAYER > J_TARGET) THEN
  100. J = J_PLAYER - 1
  101. DO I = I_PLAYER - 1, I_TARGET, -1
  102. IF (GAME_BOARD(I, J) /= '  ') THEN
  103. LEGAL_MOVE = 0
  104. EXIT
  105. END IF
  106. J = J - 1
  107. END DO
  108. ELSE IF (I_PLAYER > I_TARGET .AND. J_PLAYER < J_TARGET) THEN
  109. J = J_PLAYER + 1
  110. DO I = I_PLAYER - 1, I_TARGET, -1
  111. IF (GAME_BOARD(I, J) /= '  ') THEN
  112. LEGAL_MOVE = 0
  113. EXIT
  114. END IF
  115. J = J + 1
  116. END DO
  117. ELSE IF (I_PLAYER < I_TARGET .AND. J_PLAYER < J_TARGET) THEN
  118. J = J_PLAYER + 1
  119. DO I = I_PLAYER + 1, I_TARGET
  120. IF (GAME_BOARD(I, J) /= '  ') THEN
  121. LEGAL_MOVE = 0
  122. EXIT
  123. END IF
  124. J = J + 1
  125. END DO
  126. ELSE IF (I_PLAYER < I_TARGET .AND. J_PLAYER > J_TARGET) THEN
  127. J = J_PLAYER - 1
  128. DO I = I_PLAYER + 1, I_TARGET
  129. IF (GAME_BOARD(I, J) /= '  ') THEN
  130. LEGAL_MOVE = 0
  131. EXIT
  132. END IF
  133. J = J - 1
  134. END DO
  135. END IF
  136. END IF
  137. RETURN
  138. END SUBROUTINE
  139.  
  140. SUBROUTINE HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE)
  141. INTEGER I_PLAYER, J_PLAYER, POSSIBLE_MOVE
  142. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  143. POSSIBLE_MOVE = 0
  144. IF (I_PLAYER > 1 .AND. I_PLAYER < 10 .AND. J_PLAYER > 1 .AND. J_PLAYER < 10) THEN
  145. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER - 1, J_PLAYER - 1, I_PLAYER + 1, J_PLAYER + 1, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  146. ELSE IF (I_PLAYER == 1 .AND. J_PLAYER == 1) THEN
  147. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER, J_PLAYER, I_PLAYER + 1, J_PLAYER + 1, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  148. ELSE IF (I_PLAYER == 10 .AND. J_PLAYER == 10) THEN
  149. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER - 1, J_PLAYER - 1, I_PLAYER, J_PLAYER, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  150. ELSE IF (I_PLAYER == 1 .AND. J_PLAYER == 10) THEN
  151. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER, J_PLAYER - 1, I_PLAYER + 1, J_PLAYER, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  152. ELSE IF (I_PLAYER == 10 .AND. J_PLAYER == 1) THEN
  153. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER - 1, J_PLAYER, I_PLAYER, J_PLAYER + 1, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  154. ELSE IF (I_PLAYER > 1 .AND. I_PLAYER < 10 .AND. J_PLAYER == 1) THEN
  155. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER - 1, J_PLAYER, I_PLAYER + 1, J_PLAYER + 1, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  156. ELSE IF (I_PLAYER > 1 .AND. I_PLAYER < 10 .AND. J_PLAYER == 10) THEN
  157. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER - 1, J_PLAYER - 1, I_PLAYER + 1, J_PLAYER, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  158. ELSE IF (J_PLAYER > 1 .AND. J_PLAYER < 10 .AND. I_PLAYER == 1) THEN
  159. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER, J_PLAYER - 1, I_PLAYER + 1, J_PLAYER + 1, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  160. ELSE IF (J_PLAYER > 1 .AND. J_PLAYER < 10 .AND. I_PLAYER == 10) THEN
  161. CALL SEARCH_AREA(GAME_BOARD, I_PLAYER - 1, J_PLAYER - 1, I_PLAYER, J_PLAYER + 1, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  162. END IF
  163. RETURN
  164. END SUBROUTINE
  165.  
  166. SUBROUTINE FIND_PLAYER(INPUT, GAME_BOARD, I_PLAYER, J_PLAYER)
  167. CHARACTER(LEN=2) GAME_BOARD(10,10), INPUT
  168. INTEGER I_PLAYER, J_PLAYER
  169. DO I = 1, 10
  170. DO J = 1, 10
  171. IF (GAME_BOARD(I, J) == INPUT) THEN
  172. I_PLAYER = I
  173. J_PLAYER = J
  174. EXIT
  175. END IF
  176. END DO
  177. END DO
  178. RETURN
  179. END SUBROUTINE
  180.  
  181. SUBROUTINE FIND_TARGET(INPUT, I_TARGET, J_TARGET)
  182. CHARACTER(LEN=3) INPUT
  183. CHARACTER(LEN=2) CHECK_NUM(10)
  184. CHARACTER(LEN=1) CHECK(10)
  185. INTEGER I_TARGET, J_TARGET
  186. CHECK(1) = 'A'
  187. CHECK(2) = 'B'
  188. CHECK(3) = 'C'
  189. CHECK(4) = 'D'
  190. CHECK(5) = 'E'
  191. CHECK(6) = 'F'
  192. CHECK(7) = 'G'
  193. CHECK(8) = 'H'
  194. CHECK(9) = 'I'
  195. CHECK(10) = 'J'
  196. CHECK_NUM(1) = '1 '
  197. CHECK_NUM(2) = '2 '
  198. CHECK_NUM(3) = '3 '
  199. CHECK_NUM(4) = '4 '
  200. CHECK_NUM(5) = '5 '
  201. CHECK_NUM(6) = '6 '
  202. CHECK_NUM(7) = '7 '
  203. CHECK_NUM(8) = '8 '
  204. CHECK_NUM(9) = '9 '
  205. CHECK_NUM(10) = '10'
  206. DO I = 1 , 10
  207. IF (INPUT(1:1) == CHECK(I)) J_TARGET = I
  208. IF (INPUT(2:3) == CHECK_NUM(I)) I_TARGET = I
  209. END DO
  210. RETURN
  211. END SUBROUTINE
  212.  
  213. SUBROUTINE SET_FIRE(I_PLAYER, J_PLAYER, I_FIRE, J_FIRE, GAME_BOARD, LEGAL_MOVE)
  214. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  215. INTEGER I_PLAYER, J_PLAYER, I_FIRE, J_FIRE, LEGAL_MOVE
  216. CALL IS_MOVE_LEGAL(I_PLAYER, J_PLAYER, I_FIRE, J_FIRE, GAME_BOARD, LEGAL_MOVE)
  217. IF (LEGAL_MOVE == 1) GAME_BOARD(I_FIRE, J_FIRE) = '~~'
  218. RETURN
  219. END SUBROUTINE
  220.  
  221. SUBROUTINE END_GAME(GAME_BOARD, GAME_ENDED)
  222. CHARACTER(LEN=2) GAME_BOARD(10,10)
  223. INTEGER GAME_ENDED, POSSIBLE_MOVE1, POSSIBLE_MOVE2, POSSIBLE_MOVE3, POSSIBLE_MOVE4
  224. INTEGER POSSIBLE_MOVE5, POSSIBLE_MOVE6, POSSIBLE_MOVE7, POSSIBLE_MOVE8
  225. CALL FIND_PLAYER('W1', GAME_BOARD, I_PLAYER, J_PLAYER)
  226. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE1)
  227. CALL FIND_PLAYER('W2', GAME_BOARD, I_PLAYER, J_PLAYER)
  228. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE2)
  229. CALL FIND_PLAYER('W3', GAME_BOARD, I_PLAYER, J_PLAYER)
  230. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE3)
  231. CALL FIND_PLAYER('W4', GAME_BOARD, I_PLAYER, J_PLAYER)
  232. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE4)
  233. CALL FIND_PLAYER('B1', GAME_BOARD, I_PLAYER, J_PLAYER)
  234. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE5)
  235. CALL FIND_PLAYER('B2', GAME_BOARD, I_PLAYER, J_PLAYER)
  236. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE6)
  237. CALL FIND_PLAYER('B3', GAME_BOARD, I_PLAYER, J_PLAYER)
  238. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE7)
  239. CALL FIND_PLAYER('B4', GAME_BOARD, I_PLAYER, J_PLAYER)
  240. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE8)
  241. IF (POSSIBLE_MOVE1 == 0 .AND. POSSIBLE_MOVE2 == 0 .AND. POSSIBLE_MOVE3 == 0 .AND. POSSIBLE_MOVE4 == 0) THEN
  242. GAME_ENDED = 2
  243. ELSE IF (POSSIBLE_MOVE5 == 0 .AND. POSSIBLE_MOVE6 == 0 .AND. POSSIBLE_MOVE7 == 0 .AND. POSSIBLE_MOVE8 == 0) THEN
  244. GAME_ENDED = 1
  245. END IF
  246. RETURN
  247. END SUBROUTINE
  248.  
  249. SUBROUTINE PRINT_BOARD(GAME_BOARD)
  250. 1 FORMAT (A54)
  251. 2 FORMAT (I2, ' | ', 10(A2, ' | '))
  252. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  253. PRINT 1, '   +-------------------------------------------------+'
  254. DO I = 1, 10
  255. IF (I == 10) THEN
  256. PRINT 2, I, (GAME_BOARD(I, J), J = 1, 10)
  257. PRINT 1, '   +-------------------------------------------------+'
  258. ELSE IF (I /= 10) THEN
  259. PRINT 2, I, (GAME_BOARD(I, J), J = 1, 10)
  260. PRINT 1, '   |----+----+----+----+----+----+----+----+----+----|'
  261. END IF
  262. END DO
  263. PRINT 1, '      A    B    C    D    E    F    G    H    I    J  '
  264. RETURN
  265. END SUBROUTINE
  266.  
  267. SUBROUTINE SET_UP_BOARD(GAME_BOARD)
  268. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  269. GAME_BOARD = '  '
  270. GAME_BOARD(1, 4) = 'W1'
  271. GAME_BOARD(1, 7) = 'W2'
  272. GAME_BOARD(4, 1) = 'W3'
  273. GAME_BOARD(4, 10) = 'W4'
  274. GAME_BOARD(7, 1) = 'B1'
  275. GAME_BOARD(7, 10) = 'B2'
  276. GAME_BOARD(10, 4) = 'B3'
  277. GAME_BOARD(10, 7) = 'B4'
  278. RETURN
  279. END SUBROUTINE
  280.  
  281. SUBROUTINE CHECK_INPUT(INPUT, GAME_BOARD, INPUT_CORRECT, TURN_COUNT)
  282. INTEGER INPUT_CORRECT, POSSIBLE_FIRE, POSSIBLE_MOVE, TURN_COUNT
  283. CHARACTER(LEN=6) INPUT
  284. CHARACTER(LEN=2) GAME_BOARD(10,10), CHECK_NUM(10)
  285. CHARACTER(LEN=1) CHECK(10)
  286. CHECK(1) = 'A'
  287. CHECK(2) = 'B'
  288. CHECK(3) = 'C'
  289. CHECK(4) = 'D'
  290. CHECK(5) = 'E'
  291. CHECK(6) = 'F'
  292. CHECK(7) = 'G'
  293. CHECK(8) = 'H'
  294. CHECK(9) = 'I'
  295. CHECK(10) = 'J'
  296. CHECK_NUM(1) = '1 '
  297. CHECK_NUM(2) = '2 '
  298. CHECK_NUM(3) = '3 '
  299. CHECK_NUM(4) = '4 '
  300. CHECK_NUM(5) = '5 '
  301. CHECK_NUM(6) = '6 '
  302. CHECK_NUM(7) = '7 '
  303. CHECK_NUM(8) = '8 '
  304. CHECK_NUM(9) = '9 '
  305. CHECK_NUM(10) = '10'
  306. INPUT_CORRECT = 0
  307. IF (INPUT(1:1) == 'W' .AND. TURN_COUNT / 2 * 2 /= TURN_COUNT .OR. INPUT(1:1) == 'B' .AND. TURN_COUNT / 2 * 2 == TURN_COUNT) THEN
  308. IF (INPUT(2:2) == '1' .OR. INPUT(2:2) == '2' .OR. INPUT(2:2) == '3' .OR. INPUT(2:2) == '4') THEN
  309. IF (INPUT(3:3) == ' ') THEN
  310. DO I = 1 , 10
  311. IF (INPUT(4:4) == CHECK(I)) THEN
  312. DO J = 1, 10
  313. IF (INPUT(5:6) == CHECK_NUM(J)) THEN
  314. CALL FIND_PLAYER(INPUT(1:2), GAME_BOARD, I_PLAYER, J_PLAYER)
  315. CALL FIND_TARGET(INPUT(4:6), I_TARGET, J_TARGET)
  316. CALL HAS_PLAYER_MOVES(I_PLAYER, J_PLAYER, GAME_BOARD, POSSIBLE_MOVE)
  317. CALL HAS_PLAYER_MOVES(I_TARGET, J_TARGET, GAME_BOARD, POSSIBLE_FIRE)
  318. CALL IS_MOVE_LEGAL(I_PLAYER, J_PLAYER, I_TARGET, J_TARGET, GAME_BOARD, LEGAL_MOVE)
  319. IF (LEGAL_MOVE == 1 .AND. POSSIBLE_MOVE == 1) THEN
  320. INPUT_CORRECT = 1
  321. END IF
  322. EXIT
  323. END IF
  324. END DO
  325. END IF
  326. END DO
  327. END IF
  328. END IF
  329. END IF
  330. RETURN
  331. END SUBROUTINE
  332.  
  333. SUBROUTINE CHECK_FIRE_INPUT(INPUT, INPUT_CORRECT, I_PLAYER, J_PLAYER, GAME_BOARD)
  334. INTEGER INPUT_CORRECT, I_PLAYER, J_PLAYER
  335. CHARACTER(LEN=3) INPUT
  336. CHARACTER(LEN=2) GAME_BOARD(10,10),CHECK_NUM(10)
  337. CHARACTER(LEN=1) CHECK(10)
  338. CHECK(1) = 'A'
  339. CHECK(2) = 'B'
  340. CHECK(3) = 'C'
  341. CHECK(4) = 'D'
  342. CHECK(5) = 'E'
  343. CHECK(6) = 'F'
  344. CHECK(7) = 'G'
  345. CHECK(8) = 'H'
  346. CHECK(9) = 'I'
  347. CHECK(10) = 'J'
  348. CHECK_NUM(1) = '1 '
  349. CHECK_NUM(2) = '2 '
  350. CHECK_NUM(3) = '3 '
  351. CHECK_NUM(4) = '4 '
  352. CHECK_NUM(5) = '5 '
  353. CHECK_NUM(6) = '6 '
  354. CHECK_NUM(7) = '7 '
  355. CHECK_NUM(8) = '8 '
  356. CHECK_NUM(9) = '9 '
  357. CHECK_NUM(10) = '10'
  358. INPUT_CORRECT = 0
  359. DO I = 1 , 10
  360. IF (INPUT(1:1) == CHECK(I)) THEN
  361. DO J = 1, 10
  362. IF (INPUT(2:3) == CHECK_NUM(J)) THEN
  363. CALL FIND_TARGET(INPUT, I_TARGET, J_TARGET)
  364. CALL IS_MOVE_LEGAL(I_PLAYER, J_PLAYER, I_TARGET, J_TARGET, GAME_BOARD, INPUT_CORRECT)
  365. EXIT
  366. END IF
  367. END DO
  368. END IF
  369. END DO
  370. RETURN
  371. END SUBROUTINE
  372.  
  373. SUBROUTINE SEARCH_AREA(GAME_BOARD, I_MIN, J_MIN, I_MAX, J_MAX, I_PLAYER, J_PLAYER, POSSIBLE_MOVE)
  374. CHARACTER(LEN=2) GAME_BOARD(10, 10)
  375. INTEGER I_MIN, J_MIN, I_MAX, J_MAX, I_PLAYER, J_PLAYER, POSSIBLE_MOVE
  376. POSSIBLE_MOVE = 0
  377. DO I = I_MIN, I_MAX
  378. DO J = J_MIN, J_MAX
  379. IF (GAME_BOARD(I, J) == '  ' .AND. I /= I_PLAYER .AND. J /= J_PLAYER) THEN
  380. POSSIBLE_MOVE = 1
  381. EXIT
  382. END IF
  383. END DO
  384. END DO
  385. END SUBROUTINE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement