FTF.C
上传用户:tbison
上传日期:2007-01-08
资源大小:6k
文件大小:18k
源码类别:

游戏

开发平台:

C/C++

  1. /*
  2. 名称: 俄罗斯方块 源程 For Turbo C 2.0
  3. 软件编写:
  4. 中国 北京 幻想空间软件创作群
  5. Illusion Space Software Design Groups.
  6. BBS: 1601118 Ext (Illusion Space)
  7. Email: ILLUSION@peony.ioa.ac.cn
  8. W.G. & Lee.k.
  9. BP: (010) 2561155 Call 1615
  10.           8271188 Call 89161
  11. 请同我们联系, 或许我们还可以交个朋友.
  12. 另外, 欢迎各位编程高手加入幻想空间软件创作群 - 程序员们的乐园
  13. */
  14. /*  text mode  */
  15. /*   Turbo C   */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <dos.h>
  19. #include <conio.h>
  20. #include <time.h>
  21. #define L  1
  22. #define R  2
  23. #define RX 47
  24. #define RY  4
  25. #define LX 15
  26. #define LY  4
  27. static struct BLOCK{
  28. int x0;
  29. int y0;
  30. int x1;
  31. int y1;
  32. int x2;
  33. int y2;
  34. int x3;
  35. int y3;
  36. int color;
  37. int next;
  38. }b[23] = { { 0, 1, 1, 1, 2, 1, 3, 1,  4,  1 },
  39. { 1, 0, 1, 3, 1, 2, 1, 1,  4,  0  },
  40. { 1, 1, 2, 2, 1, 2, 2, 1,  1,  2  },
  41. { 0, 1, 1, 1, 1, 0, 2, 0,  2,  4  },
  42. { 1, 0, 1, 1, 2, 2, 2, 1,  2,  5  },
  43. { 0, 2, 1, 2, 1, 1, 2, 1,  2,  6  },
  44. { 0, 0, 0, 1, 1, 2, 1, 1,  2,  3  },
  45. { 0, 0, 1, 0, 1, 1, 2, 1,  3,  8  },
  46. { 0, 1, 0, 2, 1, 1, 1, 0,  3,  9  },
  47. { 0, 1, 1, 1, 1, 2, 2, 2,  3, 10  },
  48. { 1, 1, 1, 2, 2, 1, 2, 0,  3,  7  },
  49. { 1, 0, 1, 1, 1, 2, 2, 2,  7, 12  },
  50. { 0, 1, 1, 1, 2, 1, 2, 0,  7, 13  },
  51. { 0, 0, 1, 2, 1, 1, 1, 0,  7, 14  },
  52. { 0, 1, 0, 2, 1, 1, 2, 1,  7, 11  },
  53. { 0, 2, 1, 2, 1, 1, 1, 0,  5, 16  },
  54. { 0, 1, 1, 1, 2, 2, 2, 1,  5, 17  },
  55. { 1, 0, 1, 1, 1, 2, 2, 0,  5, 18  },
  56. { 0, 0, 0, 1, 1, 1, 2, 1,  5, 15  },
  57. { 0, 1, 1, 1, 1, 0, 2, 1,  6, 20  },
  58. { 0, 1, 1, 2, 1, 1, 1, 0,  6, 21  },
  59. { 0, 1, 1, 2, 1, 1, 2, 1,  6, 22  },
  60. { 1, 0, 1, 1, 1, 2, 2, 1,  6, 19  } };
  61. static int d[10]={ 1500,3000,1600,1200,900,800,600,400,300,200 };
  62. int Llevel, Lcurrent, Lnext, Lable, lx, ly, Lsum;
  63. int Rlevel, Rcurrent, Rnext, Rable, rx, ry, Rsum;
  64. unsigned Lpoint, Rpoint;
  65. int La[19][10], Ra[19][10], FLAG, bell, sum;
  66. unsigned ldelay, rdelay;
  67. void scrinit( ),datainit( ),dispb( ), eraseb( );
  68. void throw( ), judge( ), delayp( ), move( ), note( ), show( );
  69. int Ldrop( ), Rdrop( ), Ljudge( ), Rjudge( ), nextb( ), routejudge( );
  70. main( )
  71. {
  72. char c;
  73. do{
  74. scrinit( );
  75. datainit( );
  76. // note( );
  77. while( nextb(R) == 0 && nextb(L) == 0 && FLAG == 0){
  78. while( FLAG == 0 ){
  79. Lable = Ldrop( );
  80. Rable = Rdrop( );
  81. while( 1 ){
  82. delayp( );
  83. if( Lable != 0 ){
  84. Ljudge( );
  85. Lable = nextb( L );
  86. }
  87. if( Rable != 0 ){
  88. Rjudge( );
  89. Rable = nextb( R );
  90. }
  91. ldelay--;
  92. rdelay--;
  93. if( ldelay == 0 ){
  94. Lable = Ldrop( );
  95. ldelay = d[0];
  96. }
  97. if( rdelay == 0 ){
  98. Rable = Rdrop( );
  99. rdelay = d[0];
  100. }
  101. if( FLAG != 0 )
  102. break;
  103. }
  104. if( FLAG != 0 )
  105. break;
  106. }
  107. if( FLAG != 0 )
  108. break;
  109. }
  110. show( FLAG );
  111. c = getch( );
  112. }while( c!='n' && c!='N' ); 
  113. clrscr( );
  114. _setcursortype( _SOLIDCURSOR );
  115. }
  116. int nextb( LRflag )
  117. int LRflag;
  118. {
  119. if( LRflag == R ){
  120. if( Ra[(b[Rnext].y0)][(3+b[Rnext].x0)] != 0 ||
  121. Ra[(b[Rnext].y1)][(3+b[Rnext].x1)] != 0 ||
  122. Ra[(b[Rnext].y2)][(3+b[Rnext].x2)] != 0 ||
  123. Ra[(b[Rnext].y3)][(3+b[Rnext].x3)] != 0  ){
  124. FLAG = R;
  125. return( -1 );
  126. }
  127. eraseb( 0, 71, 5, Rnext );
  128. Rcurrent = Rnext;
  129. rx = 3;
  130. ry = 0;
  131. Rable = 0;
  132. rdelay = d[0];
  133. Rsum ++;
  134. Rpoint += 1;
  135. Rnext = random( 26 );
  136. if( Rnext==23 ) Rnext = 0;
  137. if( Rnext==24 || Rnext==25 ) Rnext = 2;
  138. dispb( 0, 71, 5, Rnext );
  139. }else{
  140. if( La[(b[Lnext].y0)][(3+b[Lnext].x0)] != 0 ||
  141. La[(b[Lnext].y1)][(3+b[Lnext].x1)] != 0 ||
  142. La[(b[Lnext].y2)][(3+b[Lnext].x2)] != 0 ||
  143. La[(b[Lnext].y3)][(3+b[Lnext].x3)] != 0  ){
  144. FLAG = L;
  145. return( -1 );
  146. }
  147. eraseb( 0, 3, 5, Lnext );
  148. Lcurrent = Lnext;
  149. lx = 3;
  150. ly = 0;
  151. Lable = 0;
  152. ldelay = d[0];
  153. Lsum ++;
  154. Lpoint += 1;
  155. Lnext = random( 26 );
  156. if( Lnext==23 ) Lnext = 0;
  157. if( Lnext==24 || Lnext==25 ) Lnext = 2;
  158. dispb( 0, 3, 5, Lnext );
  159. }
  160. textcolor( 7 );
  161. gotoxy( 3, 14 ); cprintf( "%#5d", Lsum );
  162. gotoxy( 3, 17 ); cprintf( "%#5d", Lpoint );
  163. gotoxy( 72, 14 ); cprintf( "%#5d", Rsum );
  164. gotoxy( 72, 17 ); cprintf( "%#5d", Rpoint );
  165. return( 0 );
  166. }
  167. void delayp( )
  168. {
  169. char key;
  170. if( kbhit( ) != 0 ){
  171. key = getch( );
  172.   move( key );
  173.   if( key== '\' )
  174.   getch( );
  175.   if( key== 'b' )
  176.   bell ^= 1;
  177.   }
  178. }
  179. void move( funckey )
  180. char funckey;
  181. {
  182. int tempcode;
  183. switch( funckey ){
  184. case '4':
  185. case 'p': if( rx+b[Rcurrent].x0 > 0 )
  186. if( Ra[ry+(b[Rcurrent].y0)][rx-1+(b[Rcurrent].x0)]==0 &&
  187. Ra[ry+(b[Rcurrent].y1)][rx-1+(b[Rcurrent].x1)]==0 &&
  188. Ra[ry+(b[Rcurrent].y2)][rx-1+(b[Rcurrent].x2)]==0 &&
  189. Ra[ry+(b[Rcurrent].y3)][rx-1+(b[Rcurrent].x3)]==0 ){
  190.   eraseb( R, rx, ry, Rcurrent );
  191.   rx --;
  192.   dispb( R, rx, ry, Rcurrent );
  193. }
  194.   break;
  195. case '5':
  196. case '@': tempcode = b[Rcurrent].next;
  197.   if( rx+b[tempcode].x0 >= 0 && rx+b[tempcode].x3 <= 9 &&
  198.      ry+b[tempcode].y1 <=19 && ry+b[tempcode].y2 <= 19 )
  199.    if( routejudge( R ) != -1 )
  200. if( Ra[ry+(b[tempcode].y0)][rx+(b[tempcode].x0)]==0 &&
  201. Ra[ry+(b[tempcode].y1)][rx+(b[tempcode].x1)]==0 &&
  202. Ra[ry+(b[tempcode].y2)][rx+(b[tempcode].x2)]==0 &&
  203. Ra[ry+(b[tempcode].y3)][rx+(b[tempcode].x3)]==0 ){
  204.   eraseb( R, rx, ry, Rcurrent );
  205.   Rcurrent = tempcode;
  206.   dispb( R, rx, ry, Rcurrent );
  207. }
  208.   break;
  209. case '6':
  210. case '[': if( rx+b[Rcurrent].x3 < 9 )
  211. if( Ra[ry+(b[Rcurrent].y0)][rx+1+(b[Rcurrent].x0)]==0 &&
  212. Ra[ry+(b[Rcurrent].y1)][rx+1+(b[Rcurrent].x1)]==0 &&
  213. Ra[ry+(b[Rcurrent].y2)][rx+1+(b[Rcurrent].x2)]==0 &&
  214. Ra[ry+(b[Rcurrent].y3)][rx+1+(b[Rcurrent].x3)]==0 ){
  215.   eraseb( R, rx, ry, Rcurrent );
  216.   rx ++;
  217.   dispb( R, rx, ry, Rcurrent );
  218. }
  219.   break;
  220. case '0':
  221. case ',': throw( R );
  222.   break;
  223. case '