Board logo

标题: 俄罗斯方块核心代码 [打印本页]

作者: 紫色流星    时间: 2005-11-26 21:48     标题: 俄罗斯方块核心代码

为了方便大家阅读代码,特意对正式版源程序进行了精简优化,整理出基本的核心代码,现发布如下:

说明:

1.Flash最低版本:Flash MX 2004 Profassional(ActionScript 2.0),推荐使用Flash 8 Profassional(ActionScript 2.0)

2.本代码属于完全公开版本,大家可以随意修改使用,并且殷切希望大家能修改完善之。

3.本代码可直接复制到动作内使用,无须修改。

4.特此感谢工程家园会员:风中落叶对程序的测试和报告BUG。
作者: 紫色流星    时间: 2005-11-26 21:49

  1. Stage.scaleMode = "noScale";
  2. _root.createEmptyMovieClip("rootmc", 0);
  3. _root.createEmptyMovieClip("movemc", 1);
  4. rootmc._x = 10;
  5. rootmc._y = 10;
  6. movemc._x = 10;
  7. movemc._y = 10;
  8. _global.zl = 0;
  9. _global.mcx = 3;
  10. _global.mcy = 0;
  11. _global.zl = 0;
  12. _global.stack = new Array(9);
  13. _global.m = new Array(16);
  14. _global.er = 0;
  15. _global.score = 0;
  16. _global.hard = 500;
  17. _global.cl = new Array(0xFFFFFF, 0xFF0000, 0xFF8000, 0xFFFF00, 0x00FF00, 0x0000FF, 0x8000FF, 0xFF00FF,0xFFFFFF);
  18. //定义底层方块数组。(10*20)
  19. var roots = new Array(10);
  20. for (var i = 0; i<10; i++) {
  21.         roots[i] = new Array(20);
  22. }
  23. //定义活动方块数组。(4*4)
  24. var moves = new Array(4);
  25. for (var i = 0; i<4; i++) {
  26.         moves[i] = new Array(4);
  27. }
  28. //定义画方块函数1。
  29. squaredraw = function (mc, x, y) {
  30.         x = 30*x;
  31.         y = 30*y;
  32.         var x1 = x+4;
  33.         var x2 = x+27;
  34.         var y1 = y+4;
  35.         var y2 = y+27;
  36.         with (mc) {
  37.                 lineStyle(4, cl[zl+1], 100);
  38.                 moveTo(x1, y1);
  39.                 lineTo(x1, y2);
  40.                 lineTo(x2, y2);
  41.                 lineTo(x2, y1);
  42.                 lineTo(x1, y1);
  43.         }
  44. };
  45. //定义画方块函数2。
  46. squaredraw2 = function (mc, x, y) {
  47.         var m = x;
  48.         var n = y;
  49.         x = 30*x;
  50.         y = 30*y;
  51.         var x1 = x+4;
  52.         var x2 = x+27;
  53.         var y1 = y+4;
  54.         var y2 = y+27;
  55.         with (mc) {
  56.                 lineStyle(4, cl[roots[m][n]], 100);
  57.                 moveTo(x1, y1);
  58.                 lineTo(x1, y2);
  59.                 lineTo(x2, y2);
  60.                 lineTo(x2, y1);
  61.                 lineTo(x1, y1);
  62.         }
  63. };
  64. //定义底层画方块的函数。
  65. rtmcdr = function () {
  66.         rootmc.clear();
  67.         for (var i = 0; i<10; i++) {
  68.                 for (var j = 0; j<20; j++) {
  69.                         if (roots[i][j]>0) {
  70.                                 squaredraw2(rootmc, i, j);
  71.                         }
  72.                 }
  73.         }
  74. };
  75. //产生随机方块的函数。
  76. movmcrand = function () {
  77.         for (var i = 0; i<4; i++) {
  78.                 for (var j = 0; j<4; j++) {
  79.                         moves[i][j] = 0;
  80.                 }
  81.         }
  82.         zl = random(7);
  83.         switch (zl) {
  84.         case 0 :
  85.                 // 棒子
  86.                 moves[0][1] = 1;
  87.                 moves[1][1] = 1;
  88.                 moves[2][1] = 1;
  89.                 moves[3][1] = 1;
  90.                 break;
  91.         case 1 :
  92.                 // 左L
  93.                 moves[0][1] = 2;
  94.                 moves[1][1] = 2;
  95.                 moves[2][1] = 2;
  96.                 moves[0][0] = 2;
  97.                 break;
  98.         case 2 :
  99.                 // 右L
  100.                 moves[0][1] = 3;
  101.                 moves[1][1] = 3;
  102.                 moves[2][1] = 3;
  103.                 moves[2][0] = 3;
  104.                 break;
  105.         case 3 :
  106.                 // 左之
  107.                 moves[0][0] = 4;
  108.                 moves[1][0] = 4;
  109.                 moves[1][1] = 4;
  110.                 moves[2][1] = 4;
  111.                 break;
  112.         case 4 :
  113.                 // 右之
  114.                 moves[0][1] = 5;
  115.                 moves[1][1] = 5;
  116.                 moves[1][0] = 5;
  117.                 moves[2][0] = 5;
  118.                 break;
  119.         case 5 :
  120.                 // T
  121.                 moves[0][1] = 6;
  122.                 moves[1][1] = 6;
  123.                 moves[2][1] = 6;
  124.                 moves[1][0] = 6;
  125.                 break;
  126.         case 6 :
  127.                 // 方块
  128.                 moves[0][0] = 7;
  129.                 moves[0][1] = 7;
  130.                 moves[1][1] = 7;
  131.                 moves[1][0] = 7;
  132.                 break;
  133.         default :
  134.                 trace("Error!!!"+"        "+zl);
  135.                 break;
  136.         }
  137.         if (movebl() == false && er == 4) {
  138.                 gmo();
  139.         }
  140. };
  141. //定义画移动方块的方法。
  142. movmcdr = function () {
  143.         movemc.clear();
  144.         for (var i = 0; i<4; i++) {
  145.                 for (var j = 0; j<4; j++) {
  146.                         if (moves[i][j]>0) {
  147.                                 squaredraw(movemc, i+mcx, j+mcy);
  148.                         }
  149.                 }
  150.         }
  151. };
  152. //定义下落的函数。
  153. xl = function () {
  154.         mcy++;
  155.         if (movebl() == false) {
  156.                 mcy--;
  157.                 for (var i = 0; i<4; i++) {
  158.                         for (var j = 0; j<4; j++) {
  159.                                 if (moves[i][j]>0) {
  160.                                         roots[i+mcx][j+mcy] = moves[i][j];
  161.                                 }
  162.                         }
  163.                 }
  164.                 mcclean();
  165.                 rtmcdr();
  166.                 mcx = 3;
  167.                 mcy = 0;
  168.                 movmcrand();
  169.         }
  170.         movmcdr();
  171. };
  172. //定义判断方块是否能移动的函数。
  173. movebl = function () {
  174.         var ebl = true;
  175.         er = 0;
  176.         for (var i = 0; i<4; i++) {
  177.                 for (var j = 0; j<4; j++) {
  178.                         if (moves[i][j]>0) {
  179.                                 var x = i+mcx;
  180.                                 var y = j+mcy;
  181.                                 if (y>19) {
  182.                                         ebl = false;
  183.                                         er = 8;
  184.                                 }
  185.                                 if (x<0) {
  186.                                         ebl = false;
  187.                                         er = 1;
  188.                                 }
  189.                                 if (x>9) {
  190.                                         ebl = false;
  191.                                         er = 2;
  192.                                 }
  193.                                 if (roots[x][y]>0) {
  194.                                         ebl = false;
  195.                                         er = 4;
  196.                                 }
  197.                         }
  198.                 }
  199.         }
  200.         return (ebl);
  201. };
  202. //定义方块旋转的函数。
  203. movmcrot = function () {
  204.         var p = mcx;
  205.         var q = mcy;
  206.         for (var i = 0; i<4; i++) {
  207.                 for (var j = 0; j<4; j++) {
  208.                         m[i*4+j] = moves[i][j];
  209.                 }
  210.         }
  211.         if (zl == 0) {
  212.                 for (var i = 0; i<4; i++) {
  213.                         for (var j = i; j<4; j++) {
  214.                                 var z = moves[i][j];
  215.                                 moves[i][j] = moves[j][i];
  216.                                 moves[j][i] = z;
  217.                         }
  218.                 }
  219.         }
  220.         if (zl>0 && zl<6) {
  221.                 for (var i = 0; i<3; i++) {
  222.                         for (var j = 0; j<3; j++) {
  223.                                 stack.push(moves[j][i]);
  224.                         }
  225.                 }
  226.                 for (var i = 0; i<3; i++) {
  227.                         for (var j = 2; j>=0; j--) {
  228.                                 moves[i][j] = stack.pop();
  229.                         }
  230.                 }
  231.         }
  232.         while (not (movebl())) {
  233.                 // trace(er);
  234.                 switch (er) {
  235.                 case 1 :
  236.                         mcx++;
  237.                         break;
  238.                 case 2 :
  239.                         mcx--;
  240.                         break;
  241.                 default :
  242.                         mcx = p;
  243.                         mcy = q;
  244.                         for (var i = 0; i<4; i++) {
  245.                                 for (var j = 0; j<4; j++) {
  246.                                         moves[i][j] = m[i*4+j];
  247.                                 }
  248.                         }
  249.                         break;
  250.                 }
  251.         }
  252. };
  253. //定义判断消方块的函数。
  254. mcclean = function () {
  255.         for (var j = mcy; j<mcy+4; j++) {
  256.                 var mcf = true;
  257.                 for (var i = 0; i<10; i++) {
  258.                         if (not (roots[i][j]>0)) {
  259.                                 mcf = false;
  260.                                 continue;
  261.                         }
  262.                 }
  263.                 // trace(j+"  "+mcy+"  "+mcf);
  264.                 if (mcf) {
  265.                         for (var l = j; l>0; l--) {
  266.                                 for (var k = 0; k<10; k++) {
  267.                                         roots[k][l] = roots[k][l-1];
  268.                                 }
  269.                         }
  270.                 }
  271.         }
  272. };
  273. //定义判断游戏结束的函数。
  274. gmo = function () {
  275.         clearInterval(timer);
  276.         zt = -1;
  277.         for (var i = 0; i<4; i++) {
  278.                 for (var j = 0; j<4; j++) {
  279.                         moves[i][j] = 0;
  280.                 }
  281.         }
  282.         my_cm.customItems[2].enabled = true;
  283.         // trace("Game Over!");
  284. };
  285. //定义按键函数。
  286. keys = new Object();
  287. keys.onKeyDown = function() {
  288.         //trace(Key.getCode())
  289.         if (Key.isDown(Key.RIGHT) && zt>=0) {
  290.                 mcx++;
  291.                 if (movebl() == false) {
  292.                         mcx--;
  293.                 }
  294.                 movmcdr();
  295.         }
  296.         if (Key.isDown(Key.LEFT) && zt>=0) {
  297.                 mcx--;
  298.                 if (movebl() == false) {
  299.                         mcx++;
  300.                 }
  301.                 movmcdr();
  302.         }
  303.         if (Key.isDown(Key.DOWN) && zt>=0) {
  304.                 mcy++;
  305.                 if (movebl() == false) {
  306.                         mcy--;
  307.                 }
  308.                 movmcdr();
  309.         }
  310.         if (Key.isDown(Key.SPACE) && zt>=0) {
  311.                 while (movebl()) {
  312.                         mcy++;
  313.                 }
  314.                 mcy--;
  315.                 movmcdr();
  316.         }
  317.         if (Key.isDown(Key.UP) && zt>=0) {
  318.                 movmcrot();
  319.                 movmcdr();
  320.         }
  321.         if (Key.isDown(Key.CONTROL)) {
  322.                 if (zt>=0) {
  323.                         clearInterval(timer);
  324.                         info.txt = "Pause";
  325.                         zt = -1;
  326.                 } else {
  327.                         timer = setInterval(xl, lv[level]);
  328.                         info.txt = score;
  329.                         zt = 0;
  330.                 }
  331.         }
  332. };
  333. //产生N行随机方块的函数。
  334. rtran = function (n) {
  335.         for (var j = 19; j>=(20-n); j--) {
  336.                 var m = random(7)+3;
  337.                 for (var i = 0; i<m; i++) {
  338.                         do {
  339.                                 k = random(10);
  340.                         } while (roots[k][j]>0);
  341.                         roots[k][j] = 8;
  342.                 }
  343.         }
  344. };
  345. //定义右键菜单。
  346. my_cm = new ContextMenu();
  347. my_cm.customItems.push(new ContextMenuItem("作者主站——流星Flash", opensite));
  348. my_cm.customItems.push(new ContextMenuItem("关于作者——紫色流星", aboutme, false));
  349. my_cm.customItems.push(new ContextMenuItem("重新开始", reset, true));
  350. function opensite() {
  351.         _root.getURL("http://ilovelassie.tengyi.cn/index.htm");
  352. }
  353. function aboutme() {
  354.         _root.getURL("http://ilovelassie.tengyi.cn/about.htm");
  355. }
  356. function reset() {
  357.         my_cm.customItems[2].enabled = false;
  358.         zl = random(7);
  359.         mcx = 3;
  360.         mcy = 0;
  361.         er = 0;
  362.         zt = 0;
  363.         for (var i = 0; i<10; i++) {
  364.                 for (var j = 0; j<20; j++) {
  365.                         roots[i][j] = 0;
  366.                 }
  367.         }
  368.         timer = setInterval(xl, 1000);
  369.         rtran(12);
  370.         rtmcdr();
  371.         movmcrand();
  372. }
  373. my_cm.customItems[2].enabled = false;
  374. my_cm.hideBuiltInItems();
  375. _root.menu = my_cm;
  376. Key.addListener(keys);
  377. timer = setInterval(xl, 1000);
  378. rtran(12);
  379. rtmcdr();
  380. movmcrand();
复制代码

作者: 风中落叶    时间: 2005-11-26 21:59

来祝贺一下先:handshake:handshake
作者: 紫色流星    时间: 2005-11-26 22:03

Originally posted by 风中落叶 at 2005-11-26 21:59:
来祝贺一下先:handshake:handshake

这几天心情乱,编写的代码也乱,所以正式版就懒得再更新了。

连连看的代码也只是编写了一点就停手了,等待我心情好了再恢复工作吧,呵呵




欢迎光临 工程家园 (http://heubbs.cn/) Powered by Discuz! 7.2