PITON.PAS 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. Uses CRT,Graph,DOS;
  2. Type main = record
  3. n : integer;
  4. c : byte;
  5. end;
  6. Type Hiscore = record
  7. Name : array[1..10] of string[18];
  8. Score : array[1..10] of Word;
  9. Sp : byte;
  10. end;
  11. Var
  12. rcrd : boolean;
  13. s : SearchRec;
  14. Tbl : file of HiScore;
  15. MAX,col : HiScore;
  16. C : char;
  17. lt, rt : Byte;
  18. W, e : word;
  19. Dir, b,cl : byte;
  20. Num : integer;
  21. en : array [1..2] of byte;
  22. bg : array [1..2] of byte;
  23. a : array [20..80, 2..25] of main;
  24. i,j,k,l,r : byte;
  25. {-----------------======================-----------------}
  26. Procedure Setup; forward;
  27. Procedure Stat(bg1,bg2:byte); forward;
  28. Procedure Apple ; forward;
  29. Procedure Ext ; forward;
  30. Procedure StartUp; forward;
  31. Procedure DrawTable; forward;
  32. Procedure Game; forward;
  33. {---------------------------------------------------------}
  34. Procedure Recrd(i : byte);
  35. Var t : byte;
  36. Begin
  37. t := 0;
  38. if rcrd then begin
  39. ClrScr;
  40. GotoXY(30,10);
  41. if i = 10 then max.score[10] := col.score[1]
  42. else
  43. for t := 9 downto i do begin
  44. max.score[t+1] := max.score[t];
  45. max.name[t+1] := max.name[t]
  46. end;
  47. max.score[i] := col.score[1];
  48. TextColor(cyan);
  49. Write('П О З Д Р А В Л Я Ю');
  50. GotoXY(30,12);
  51. TextColor(Blue);
  52. Write('Вы поставили рекорд');
  53. GotoXY(12,17);
  54. TextColor(Yellow);
  55. Write('Введите свое имя до 20 символов ');
  56. TextColor(lightgreen);
  57. Readln(max.name[i]);
  58. TextColor(7);
  59. Seek(tbl,0);
  60. Write(tbl,max);
  61. Close(tbl);
  62. Reset(tbl);
  63. end;
  64. end;
  65. {-----------------------------------------------------------}
  66. Procedure SetCursorSize(size:word);
  67. var
  68. reg : registers;
  69. begin
  70. with reg do begin
  71. AH := $01;
  72. CH := hi(size);
  73. CL := lo(size);
  74. Intr($10,reg);
  75. end;
  76. end;
  77. {------------------------------------------------------------}
  78. Procedure Setup;
  79. begin
  80. CloseGraph;
  81. ClrScr;
  82. TextMode(CO80);
  83. SetCursorSize(16*256);
  84. GotoXY(10, 5);
  85. Write('1 : Скорость');
  86. {GotoXY(10, 10);
  87. Write('2 : Установить Клавиши');}
  88. GotoXY(10, 15);
  89. Write('3 : Завершить настроики');
  90. GotoXY(1,1);
  91. Case readkey of
  92. '1' : begin
  93. GotoXY(12,20);
  94. Write('Введите скорость 1..10 (5) ');
  95. repeat
  96. Readln(max.sp);
  97. until (max.sp > 0) and (max.sp < 11);
  98. end;
  99. '2' : begin
  100. end;
  101. end;
  102. end;
  103. {--------------------------------------------------------}
  104. Procedure Stat;
  105. Var n :byte;
  106. begin
  107. n := 0;
  108. TextColor(Yellow);
  109. GotoXY(2,3);
  110. Write(' ');
  111. GotoXY(2,3);
  112. Write('X : ',bg1-21);
  113. GotoXY(2,5);
  114. Write(' ');
  115. GotoXY(WhereX-18,WhereY);
  116. Write('Y : ',bg2-2);
  117. GotoXY(2,7);
  118. Write('Длина змея : ', col.score[1]);
  119. GotoXY(2,9);
  120. Write('Число ходов : ',num);
  121. GotoXY(7,12);
  122. TextColor(LightBlue);
  123. Write('Лучшие ');
  124. TextColor(LightGreen);
  125. for n := 1 to 10 do begin
  126. GotoXY(2,13 + n);
  127. TextColor(Random(15));
  128. Write(max.name[n], Max.score[n]:(17 - length(max.name[n])));
  129. end;
  130. GotoXY(bg1,bg2);
  131. TextColor(cl);
  132. end; {stat}
  133. {--------------------------------------------------------}
  134. Procedure Apple;
  135. Var i,j,k,b1,b2 : byte;
  136. begin
  137. randomize;
  138. repeat
  139. i := random(78);
  140. j := random(23);
  141. k := random(9);
  142. r := random(14);
  143. until (i > 20) and (i < 80) and (j > 2 ) and (j < 25)
  144. and (k <> 0) and (a[i,j].n = 0) and (r <> 0) and (r <> 7) and (r <> cl);
  145. b1 := WhereX;
  146. b2 := WhereY;
  147. GotoXY(i,j);
  148. TextColor(r);
  149. Write(k);
  150. TextColor(cl);
  151. a[i,j].n := - k;
  152. a[i,j].c := r;
  153. GotoXY(b1,b2);
  154. end;
  155. {-------------------------------------------------------}
  156. Procedure Ext;
  157. var
  158. Gd, Gm :integer;
  159. k : byte;
  160. begin
  161. Sound(100);
  162. Delay(2000);
  163. Nosound;
  164. Rcrd := true;
  165. For k := 1 to 10 do
  166. if col.score[1] > max.score[k] then begin
  167. Recrd(k);
  168. rcrd := false;
  169. end;
  170. Gd := Detect;
  171. InitGraph(Gd, Gm, '');
  172. if GraphResult <> grOk then Halt(1);
  173. ClearDevice;
  174. SetColor(Magenta);
  175. SetTextStyle(TriplexFont, HorizDir,10);
  176. OutTextXY(150,100,'Game');
  177. OutTextXY(170,200,'OveR');
  178. SetColor(Green);
  179. SetTextStyle(SmallFont, HorizDir,20);
  180. OutTextXY(180,430,'Another Game ? ');
  181. if (readkey = 'y') or (readkey = 'Y') then
  182. begin
  183. CloseGraph;
  184. Game;
  185. end;
  186. Close(Tbl);
  187. Halt;
  188. end; {Ext}
  189. {-------------------------------------------------------}
  190. Procedure StartUp;
  191. var
  192. Gd, Gm : Integer;
  193. begin
  194. Gd := Detect;
  195. InitGraph(Gd, Gm, '');
  196. if GraphResult <> grOk then Halt(1);
  197. ClearDevice;
  198. SetColor(Blue);
  199. SetTextStyle(3, HorizDir,8);
  200. OutTextXY(80,100,'Game Piton');
  201. SetTextStyle(2,HorizDir,5);
  202. SetColor(LightGreen);
  203. OutTextXY(230,460,'Game PITON written in 1998 by Kesha Enikeew AKA Ray');
  204. SetColor(White);
  205. SetTextStyle(1,HorizDir,2);
  206. OutTextXY(20,400,'Press "S" for Setup, "Q" to Quit, any other to continue');
  207. case ReadKey of
  208. 's','S' : setup;
  209. 'q','Q' : begin
  210. CloseGraph;
  211. halt;
  212. end;
  213. end;
  214. CloseGraph
  215. end; {StartUp}
  216. {------------------==================-------------------}
  217. Procedure DrawTable;
  218. var y:integer;
  219. begin
  220. clrscr;
  221. TextColor(blue);
  222. GotoXY(40,2);
  223. Write('Game PITON');
  224. TextColor(7);
  225. for y := 20 to 79 do
  226. begin
  227. GotoXY(y, 3);
  228. Write('═');
  229. GotoXY(y, 25);
  230. Write('═');
  231. end;
  232. Write('╝');
  233. GotoXY(80, 2);
  234. Write('╗');
  235. For y := 3 to 23 do
  236. begin
  237. GotoXY(20, y);
  238. Write ('║');
  239. GotoXY(WhereX-1, WhereY + 1);
  240. Write('╚');
  241. GotoXY(80, y);
  242. Write ('║')
  243. end;
  244. GotoXY(20,2);
  245. Write('╔');
  246. end; {DrawTable}
  247. {-------------------------------------------------------}
  248. Procedure Game;
  249. begin
  250. SetCursorSize(16*256);
  251. ClrScr;
  252. TextBackGround(0);
  253. DrawTable;
  254. assign(Tbl,'hiscore.dat');
  255. {$I-}
  256. Reset(Tbl);
  257. {$I+}
  258. if IOResult <> 0 then
  259. ReWrite(tbl);
  260. FindFirst('Hiscore.dat',AnyFile,s);
  261. if s.size = 0 then
  262. begin
  263. if max.sp = 0 then
  264. max.sp := 5 ;
  265. max.Score[1] := 9;
  266. max.name[1] := 'Coder';
  267. Seek(tbl,0);
  268. Write(tbl,max);
  269. Close(tbl);
  270. Reset(tbl);
  271. end;
  272. {$I-}
  273. Read(tbl,max);
  274. {$I+}
  275. If IOResult <> 0 then Halt;
  276. for i := 20 to 80 do
  277. for j := 2 to 25 do
  278. begin
  279. a[i,j].c := 7;
  280. a[i,j].n := 0;
  281. end;
  282. cl := 7;
  283. e := 1;
  284. en[1] := 39;
  285. en[2] := 13;
  286. Num := 1;
  287. Dir := 1;
  288. b := 10;
  289. col.score[1] := 9;
  290. a[39,13].n := 1;
  291. GotoXY(40,13);
  292. repeat
  293. l := 0;
  294. if keypressed then
  295. begin
  296. c := readkey;
  297. if c = #0 then
  298. Begin
  299. w := ord(readkey);
  300. if (w = 77) or (w = 75) then
  301. begin
  302. l := 1;
  303. case w of
  304. 77 : case dir of
  305. 1 : begin
  306. if WhereX > 79 then ext;
  307. if a[whereX,WhereY].n > 0 then ext;
  308. if a[WhereX,WhereY].n < 0 then
  309. begin
  310. b := b - a[WhereX,WhereY].n;
  311. inc(col.score[1],-a[whereX,WhereY].n);
  312. end;
  313. If a[WhereX,WhereY].c <> 7 then
  314. begin
  315. TextColor(a[WhereX,WhereY].c);
  316. cl := a[WhereX,WhereY].c;
  317. end;
  318. Write('╗');
  319. inc(num);
  320. a[WhereX-1,WhereY].n := Num;
  321. dir := 2
  322. end;
  323. 2 : begin
  324. if (WhereY + 1) > 24 then ext;
  325. if a[whereX-1,WhereY+1].n > 0 then ext;
  326. if a[WhereX-1,WhereY+1].n < 0 then
  327. begin
  328. b := b - a[WhereX-1,WhereY+1].n;
  329. inc(col.score[1], -a[WhereX-1,WhereY+1].n);
  330. end;
  331. If a[WhereX-1,WhereY+1].c <> 7 then
  332. begin
  333. TextColor(a[WhereX-1,WhereY+1].c);
  334. cl := a[WhereX-1,WhereY + 1].c;
  335. end;
  336. GotoXY(WhereX-1,WhereY+1);
  337. Write('╝');
  338. inc(num);
  339. a[WhereX-1,WhereY].n := Num;
  340. a[WhereX-1,WhereY].c := a[WhereX-1,WhereY-1].c;
  341. dir := 3;
  342. end;
  343. 3 : begin
  344. if (WhereX - 2) < 21 then ext;
  345. if a[whereX-2,WhereY].n > 0 then ext;
  346. if a[WhereX-2,WhereY].n < 0 then
  347. begin
  348. b := b - a[WhereX-2,WhereY].n;
  349. inc(col.score[1], -a[WhereX-2,WhereY].n);
  350. end;
  351. If a[WhereX-2,WhereY].c <> 7 then
  352. begin
  353. TextColor(a[WhereX-2,WhereY].c);
  354. cl := a[WhereX-2,WhereY].c;
  355. end;
  356. GotoXY(WhereX-2,WhereY);
  357. Write('╚');
  358. inc(num);
  359. a[WhereX-1,WhereY].n := num;
  360. a[WhereX-1,WhereY].c := a[WhereX,WhereY].c;
  361. Dir := 4
  362. end;
  363. 4 : begin
  364. if (WhereY - 1) < 3 then ext;
  365. if a[whereX-1,WhereY-1].n > 0 then ext;
  366. if a[WhereX-1,WhereY-1].n < 0 then
  367. begin
  368. b := b - a[WhereX-1,WhereY-1].n;
  369. inc(col.score[1], -a[WhereX-1,WhereY-1].n);
  370. end;
  371. If a[WhereX - 1,WhereY - 1].c <> 7 then
  372. begin
  373. TextColor(a[WhereX-1,WhereY-1].c);
  374. cl := a[WhereX-1,WhereY - 1].c;
  375. end;
  376. GotoXY(WhereX-1,WhereY-1);
  377. Write('╔');
  378. inc(num);
  379. a[WhereX-1,WhereY].n := Num;
  380. a[WhereX-1,WhereY].c := a[WhereX-1,WhereY+1].c;
  381. Dir := 1
  382. end;
  383. end;
  384. 75 : case dir of
  385. 1 : begin
  386. if WhereX > 79 then ext;
  387. if a[whereX,WhereY].n > 0 then ext;
  388. if a[WhereX,WhereY].n < 0 then
  389. begin
  390. b := b - a[WhereX,WhereY].n;
  391. inc(col.score[1], -a[WhereX,WhereY].n);
  392. end;
  393. If a[WhereX,WhereY].c <> 7 then
  394. begin
  395. TextColor(a[WhereX,WhereY].c);
  396. cl := a[WhereX,WhereY].c;
  397. end;
  398. Write('╝');
  399. inc(num);
  400. a[WhereX-1,WhereY].n := Num ;
  401. dir := 4
  402. end;
  403. 2 : begin
  404. if WhereY + 1 > 23 then ext;
  405. if a[whereX-1,WhereY+1].n > 0 then ext;
  406. if a[WhereX-1,WhereY+1].n < 0 then
  407. begin
  408. b := b - a[WhereX-1,WhereY+1].n;
  409. inc(col.score[1], -a[WhereX-1,WhereY+1].n);
  410. end;
  411. If a[WhereX-1,WhereY+1].c <> 7 then
  412. begin
  413. TextColor(a[WhereX-1,WhereY+1].c);
  414. cl := a[WhereX-1,WhereY + 1].c;
  415. end;
  416. GotoXY(WhereX-1,WhereY + 1);
  417. Write('╚');
  418. inc(num);
  419. a[WhereX-1,WhereY].c := a[WhereX-1,WhereY-1].c;
  420. a[WhereX-1,WhereY].n := Num;
  421. dir := 1;
  422. end;
  423. 3 : begin
  424. if WhereX - 2 < 21 then ext;
  425. if a[whereX-2,WhereY].n > 0 then ext;
  426. if a[WhereX-2,WhereY].n < 0 then
  427. begin
  428. b := b - a[WhereX-2,WhereY].n;
  429. inc(col.score[1], -a[WhereX-2,WhereY].n);
  430. end;
  431. If a[WhereX-2,WhereY].c <> 7 then
  432. begin
  433. TextColor(a[WhereX-2,WhereY].c);
  434. cl := a[WhereX-2,WhereY].c;
  435. end;
  436. GotoXY(WhereX-2,WhereY);
  437. Write('╔');
  438. inc(num);
  439. a[WhereX-1,WhereY].n := num;
  440. a[WhereX-1,WhereY].c := a[WhereX,WhereY].c;
  441. Dir := 2
  442. end;
  443. 4 : begin
  444. if WhereY - 1 < 3 then ext;
  445. if a[whereX-1,WhereY-1].n > 0 then ext;
  446. if a[WhereX-1,WhereY-1].n < 0 then
  447. begin
  448. b := b - a[WhereX-1,WhereY-1].n;
  449. inc(col.score[1], -a[WhereX-1,WhereY-1].n);
  450. end;
  451. If a[WhereX-1,WhereY-1].c <> 7 then
  452. begin
  453. TextColor(a[WhereX-1,WhereY-1].c);
  454. cl := a[WhereX-1,WhereY - 1].c;
  455. end;
  456. GotoXY(WhereX-1,WhereY - 1);
  457. Write('╗');
  458. inc(num);
  459. a[WhereX-1,WhereY].n := num ;
  460. a[WhereX-1,WhereY].c := a[WhereX-1,WhereY+1].c;
  461. Dir := 3
  462. end;
  463. end;
  464. end;
  465. end;
  466. end
  467. else if c = #27 then Ext;
  468. end;
  469. begin
  470. if l = 0 then
  471. begin
  472. case dir of
  473. 1 : if WhereX > 79 then ext
  474. else
  475. if a[WhereX,WhereY].n > 0 then ext
  476. else
  477. begin
  478. if a[WhereX,WhereY].n < 0 then
  479. begin
  480. b:=b-a[WhereX,WhereY].n;
  481. inc(col.score[1],-a[whereX,WhereY].n);
  482. end;
  483. If a[WhereX,WhereY].c <> 7 then
  484. begin
  485. TextColor(a[WhereX,WhereY].c);
  486. cl := a[WhereX,WhereY].c;
  487. end;
  488. Write('═');
  489. inc(num);
  490. a[WhereX-1,WhereY].n := Num;
  491. a[WhereX-1,WhereY].c := a[WhereX-2,WhereY].c;
  492. if b > 0 then b := b - 1;
  493. end;
  494. 2: if (WhereY + 1) > 23 then ext
  495. else
  496. if a[WhereX-1,WhereY+1].n > 0 then ext
  497. else
  498. begin
  499. if a[WhereX-1,WhereY+1].n < 0 then
  500. begin
  501. b := b-a[WhereX-1,WhereY+1].n;
  502. inc(col.score[1], -a[WhereX-1,WhereY+1].n);
  503. end;
  504. If a[WhereX-1,WhereY+1].c <> 7 then
  505. begin
  506. TextColor(a[WhereX-1,WhereY+1].c);
  507. cl := a[WhereX-1,WhereY + 1].c;
  508. end;
  509. GotoXY(WhereX-1,WhereY+1);
  510. Write('║');
  511. inc(num);
  512. a[WhereX-1,WhereY].n := Num;
  513. a[WhereX-1,WhereY].c := a[WhereX-1,WhereY-1].c;
  514. if b > 0 then b := b - 1;
  515. end;
  516. 3 : if (WhereX-2) < 21 then ext
  517. else
  518. if a[WhereX-2,WhereY].n > 0 then ext
  519. else
  520. begin
  521. if a[WhereX-2,WhereY].n < 0 then
  522. begin
  523. b:=b-a[WhereX-2,WhereY].n;
  524. inc(col.score[1], -a[WhereX-2,WhereY].n);
  525. end;
  526. If a[WhereX-2,WhereY].c <> 7 then
  527. begin
  528. TextColor(a[WhereX-2,WhereY].c);
  529. cl := a[WhereX-2,WhereY].c;
  530. end;
  531. GotoXY(Wherex-2,WhereY);
  532. Write('═');
  533. inc(Num);
  534. a[WhereX-1,WhereY].n := Num ;
  535. a[WhereX-1,WhereY].c := a[WhereX,WhereY].c;
  536. if b > 0 then b := b - 1;
  537. end;
  538. 4 : if (WhereY - 1) < 3 then ext
  539. else
  540. if a[WhereX-1,WhereY-1].n > 0 then ext
  541. else
  542. begin
  543. if a[WhereX-1,WhereY-1].n < 0 then
  544. begin
  545. b := b - a[WhereX-1,WhereY-1].n;
  546. inc(col.score[1], -a[WhereX-1,WhereY-1].n);
  547. end;
  548. If a[WhereX-1,WhereY-1].c <> 7 then
  549. begin
  550. TextColor(a[WhereX-1,WhereY-1].c);
  551. cl := a[WhereX-1,WhereY - 1].c;
  552. end;
  553. GotoXY(WhereX-1,WhereY-1);
  554. Write('║');
  555. inc(Num);
  556. a[WhereX-1,WhereY].n := Num ;
  557. a[WhereX-1,WhereY].c := a[WhereX-1,WhereY+1].c;
  558. if b > 0 then b := b - 1;
  559. end;
  560. end;
  561. end;
  562. end;
  563. Stat(WhereX,WhereY);
  564. if b = 0 then
  565. begin
  566. bg[1] := WhereX;
  567. bg[2] := WhereY;
  568. GotoXY(en[1],en[2]);
  569. Write(' ');
  570. a[WhereX-1,WhereY].n := 0;
  571. a[WhereX-1,WhereY].c := 7;
  572. if a[WhereX,WhereY].n = e + 1 then
  573. begin
  574. en[1] := WhereX;
  575. en[2] := WhereY;
  576. inc(e);
  577. end;
  578. if a[WhereX-2,WhereY].n = e + 1 then
  579. begin
  580. en[1] := WhereX-2;
  581. en[2] := WhereY;
  582. inc(e);
  583. end;
  584. if a[WhereX-1,WhereY+1].n = e + 1 then
  585. begin
  586. en[1] := WhereX-1;
  587. en[2] := WhereY+1;
  588. inc(e);
  589. end;
  590. if a[WhereX-1,WhereY-1].n = e + 1 then
  591. begin
  592. en[1] := WhereX-1;
  593. en[2] := WhereY-1;
  594. inc(e)
  595. end;
  596. GotoXY(bg[1],bg[2]);
  597. end;
  598. Delay(1000 + max.sp * 100);
  599. k := 0;
  600. for i := 21 to 79 do
  601. for j := 3 to 24 do
  602. if a[i,j].n < 0 then k := 1;
  603. if k = 0 then apple;
  604. until false;
  605. end;
  606. Begin
  607. StartUp;
  608. Game;
  609. end.