期刊投稿百科

基于c语言的俄罗斯方块毕业论文

发布时间:2024-07-20 02:15:13

基于c语言的俄罗斯方块毕业论文

这里把游戏的关键设计放在三个盒子和一个坐标上:大盒子:一个两维数组,记录着方块点阵的开与关(把游戏的舞台想像成一个点阵),在下面也把这个东西称为地图两个5*5小盒子:两维数组,一个盛放着正在下落的方块,一个盛放在下一个下落的方块(即next),当然这两个也必须想像成一个点阵:如长条的点阵为:0000000100001000010000100现在你只要有这么一个概念:一个不断定时下落的小盒子从大盒子顶部下降到底部,之后再将next盒子放在下落盒子,再进行下一轮的下落中间的控制等尚不要太着急现在面临着一个问题:下落的盒子和地图之间要怎么联系起来?一个好的方法是再定义一个坐标:x,y,保存着小盒子左上角在地图上对应的下标(位置),即当x=0,y=0时,小盒子处于地图的左上部如此,当小盒子需要移动时,即只须要改变x,y的值现在说说旋转小盒子保存着当前下落形状的点阵,那么旋转就只须要将这个点阵旋转90度:例如:0000000000001000000000100->0111100100000000010000000这一点实现起来还是不太难的判断碰撞通常这种情况只须要在有移动小盒或旋转盒子时发生:也即点阵非空是互斥的,当小盒要向下移(x++)时,如果小盒里的点阵与地图上的点阵(非空的地方)重叠,则不能下移,(卡住了),旋转则转换后的形状与地图有冲突则要放弃旋转到了这里,你应该有一个大概的了解了,至于怎样在屏幕上画出来,这个是比较简单的,下面的代码会慢慢与你解释*//*接下一贴*/

这里有个高手写了一个。

////////////////////////////////////////////// 程序名称:俄罗斯方块// 编译环境:Visual C++ 0,EasyX 2011惊蛰版// 程序编写:krissi <>// 最后更新:2010-12-18//#include #include #include /////////////////////////////////////////////// 定义常量、枚举量、结构体、全局变量/////////////////////////////////////////////#define WIDTH 10 // 游戏区宽度#define HEIGHT 22 // 游戏区高度#define SIZE 20 // 每个游戏区单位的实际像素// 定义操作类型enum CTRL{ CTRL_ROTATE, // 方块旋转 CTRL_LEFT, CTRL_RIGHT, CTRL_DOWN, // 方块左、右、下移动 CTRL_SINK, // 方块沉底 CTRL_QUIT // 退出游戏};// 定义绘制方块的方法enum DRAW{ SHOW, // 显示方块 HIDE, // 隐藏方块 FIX // 固定方块};// 定义七种俄罗斯方块struct BLOCK{ WORD dir[4]; // 方块的四个旋转状态 COLORREF color; // 方块的颜色} g_Blocks[7] = { {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I {0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口 {0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA}, // L {0x2260, 0x0E20, 0x0644, 0x0470, YELLOW}, // 反L {0x0C60, 0x2640, 0x0C60, 0x2640, CYAN}, // Z {0x0360, 0x4620, 0x0360, 0x4620, GREEN}, // 反Z {0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; // T// 定义当前方块、下一个方块的信息struct BLOCKINFO{ byte id; // 方块 ID char x, y; // 方块在游戏区中的坐标 byte dir:2; // 方向} g_CurBlock, g_NextBlock;// 定义游戏区BYTE g_World[WIDTH][HEIGHT] = {0}; /////////////////////////////////////////////// 函数声明/////////////////////////////////////////////void Init(); // 初始化游戏void Quit(); // 退出游戏void NewGame(); // 开始新游戏void GameOver(); // 结束游戏CTRL GetControl(bool _onlyresettimer = false); // 获取控制命令void DispatchControl(CTRL _ctrl); // 分发控制命令void NewBlock(); // 生成新的方块bool CheckBlock(BLOCKINFO _block); // 检测指定方块是否可以放下void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW); // 画方块void OnRotate(); // 旋转方块void OnLeft(); // 左移方块void OnRight(); // 右移方块void OnDown(); // 下移方块void OnSink(); // 沉底方块 /////////////////////////////////////////////// 函数定义/////////////////////////////////////////////// 主函数void main(){ Init(); CTRL c; while(true) { c = GetControl(); DispatchControl(c); // 按退出时,显示对话框咨询用户是否退出 if (c == CTRL_QUIT) { HWND wnd = GetHWnd(); if (MessageBox(wnd, "您要退出游戏吗?", "提醒", MB_OKCANCEL | MB_ICONQUESTION) == IDOK) Quit(); } }}// 初始化游戏void Init(){ initgraph(640, 480); srand((unsigned)time(NULL)); // 显示操作说明 setfont(14, 0, "宋体"); outtextxy(20, 330, "操作说明"); outtextxy(20, 350, "上:旋转"); outtextxy(20, 370, "左:左移"); outtextxy(20, 390, "右:右移"); outtextxy(20, 410, "下:下移"); outtextxy(20, 430, "空格:沉底"); outtextxy(20, 450, "ESC:退出"); // 设置坐标原点 setorigin(220, 20); // 绘制游戏区边界 rectangle(-1, -1, WIDTH * SIZE, HEIGHT * SIZE); rectangle((WIDTH + 1) * SIZE - 1, -1, (WIDTH + 5) * SIZE, 4 * SIZE); // 开始新游戏 NewGame();}// 退出游戏void Quit(){ closegraph(); exit(0);}// 开始新游戏void NewGame(){ // 清空游戏区 setfillstyle(BLACK); bar(0, 0, WIDTH * SIZE - 1, HEIGHT * SIZE - 1); ZeroMemory(g_World, WIDTH * HEIGHT); // 生成下一个方块 g_NextBid = rand() % 7; g_NextBdir = rand() % 4; g_NextBx = WIDTH + 1; g_NextBy = HEIGHT - 1; // 获取新方块 NewBlock();}// 结束游戏void GameOver(){ HWND wnd = GetHWnd(); if (MessageBox(wnd, "游戏结束。/n您想重新来一局吗?", "游戏结束", MB_YESNO | MB_ICONQUESTION) == IDYES) NewGame(); else Quit();}// 获取控制命令CTRL GetControl(bool _onlyresettimer){ static DWORD oldtime = GetTickCount(); // 重置计时器 if (_onlyresettimer) { oldtime = GetTickCount(); return CTRL_DOWN; // 仅仅为了重置计时器,随便返回一个值 } // 获取控制值 while(true) { // 如果超时,自动下落一格 DWORD newtime = GetTickCount(); if (newtime - oldtime >= 500) { oldtime = newtime; return CTRL_DOWN; } // 如果有按键,返回按键对应的功能 if (kbhit()) { switch(getch()) { case 'w': case 'W': return CTRL_ROTATE; case 'a': case 'A': return CTRL_LEFT; case 'd': case 'D': return CTRL_RIGHT; case 's': case 'S': return CTRL_DOWN; case 27: return CTRL_QUIT; case ' ': return CTRL_SINK; case 0: case 0xE0: switch(getch()) { case 72: return CTRL_ROTATE; case 75: return CTRL_LEFT; case 77: return CTRL_RIGHT; case 80: return CTRL_DOWN; } } } }}// 分发控制命令void DispatchControl(CTRL _ctrl){ switch(_ctrl) { case CTRL_ROTATE: OnRotate(); break; case CTRL_LEFT: OnLeft(); break; case CTRL_RIGHT: OnRight(); break; case CTRL_DOWN: OnDown(); break; case CTRL_SINK: OnSink(); break; case CTRL_QUIT: break; }}// 生成新的方块void NewBlock(){ g_CurBid = g_NextBid, g_NextBid = rand() % 7; g_CurBdir = g_NextBdir, g_NextBdir = rand() % 4; g_CurBx = (WIDTH - 4) / 2; g_CurBy = HEIGHT + 2; // 下移新方块直到有局部显示 WORD c = g_Blocks[g_CurBid]dir[g_CurBdir]; while((c & 0xF) == 0) { g_CurBy--; c >>= 4; } // 绘制新方块 DrawBlock(g_CurBlock); // 绘制下一个方块 setfillstyle(BLACK); bar((WIDTH + 1) * SIZE, 0, (WIDTH + 5) * SIZE - 1, 4 * SIZE - 1); DrawBlock(g_NextBlock);}// 画方块void DrawBlock(BLOCKINFO _block, DRAW _draw){ WORD b = g_Blocks[_id]dir[_dir]; int x, y; int color = BLACK; switch(_draw) { case SHOW: color = g_Blocks[_id]lor; break; case HIDE: color = BLACK; break; case FIX: color = g_Blocks[_id]lor / 3; break; } setfillstyle(color); for(int i=0; i<16; i++) { if (b & 0x8000) { x = _x + i % 4; y = _y - i / 4; if (y < HEIGHT) { if (_draw != HIDE) bar3d(x * SIZE + 2, (HEIGHT - y - 1) * SIZE + 2, (x + 1) * SIZE - 4, (HEIGHT - y) * SIZE - 4, 3, true); else bar(x * SIZE, (HEIGHT - y - 1) * SIZE, (x + 1) * SIZE - 1, (HEIGHT - y) * SIZE - 1); } } b <<= 1; }}// 检测指定方块是否可以放下bool CheckBlock(BLOCKINFO _block){ WORD b = g_Blocks[_id]dir[_dir]; int x, y; for(int i=0; i<16; i++) { if (b & 0x8000) { x = _x + i % 4; y = _y - i / 4; if ((x < 0) || (x >= WIDTH) || (y < 0)) return false; if ((y < HEIGHT) && (g_World[x][y])) return false; } b <<= 1; } return true;}// 旋转方块void OnRotate(){ // 获取可以旋转的 x 偏移量 int dx; BLOCKINFO tmp = g_CurBlock; dir++; if (CheckBlock(tmp)) { dx = 0; goto rotate; } x = g_CurBx - 1; if (CheckBlock(tmp)) { dx = -1; goto rotate; } x = g_CurBx + 1; if (CheckBlock(tmp)) { dx = 1; goto rotate; } x = g_CurBx - 2; if (CheckBlock(tmp)) { dx = -2; goto rotate; } x = g_CurBx + 2; if (CheckBlock(tmp)) { dx = 2; goto rotate; } return;rotate: // 旋转 DrawBlock(g_CurBlock, HIDE); g_CurBdir++; g_CurBx += dx; DrawBlock(g_CurBlock);}// 左移方块void OnLeft(){ BLOCKINFO tmp = g_CurBlock; x--; if (CheckBlock(tmp)) { DrawBlock(g_CurBlock, HIDE); g_CurBx--; DrawBlock(g_CurBlock); }}// 右移方块void OnRight(){ BLOCKINFO tmp = g_CurBlock; x++; if (CheckBlock(tmp)) { DrawBlock(g_CurBlock, HIDE); g_CurBx++; DrawBlock(g_CurBlock); }}// 下移方块void OnDown(){ BLOCKINFO tmp = g_CurBlock; y--; if (CheckBlock(tmp)) { DrawBlock(g_CurBlock, HIDE); g_CurBy--; DrawBlock(g_CurBlock); } else OnSink(); // 不可下移时,执行“沉底方块”操作}// 沉底方块void OnSink(){ int i, x, y; // 连续下移方块 DrawBlock(g_CurBlock, HIDE); BLOCKINFO tmp = g_CurBlock; y--; while (CheckBlock(tmp)) { g_CurBy--; y--; } DrawBlock(g_CurBlock, FIX); // 固定方块在游戏区 WORD b = g_Blocks[g_CurBid]dir[g_CurBdir]; for(i = 0; i < 16; i++) { if (b & 0x8000) { if (g_CurBy - i / 4 >= HEIGHT) { // 如果方块的固定位置超出高度,结束游戏 GameOver(); return; } else g_World[g_CurBx + i % 4][g_CurBy - i / 4] = 1; } b <<= 1; } // 检查是否需要消掉行,并标记 int row[4] = {0}; bool bRow = false; for(y = g_CurBy; y >= max(g_CurBy - 3, 0); y--) { i = 0; for(x = 0; x < WIDTH; x++) if (g_World[x][y] == 1) i++; if (i == WIDTH) { bRow = true; row[g_CurBy - y] = 1; setfillstyle(WHITE, DIAGCROSS2_FILL); bar(0, (HEIGHT - y - 1) * SIZE + SIZE / 2 - 2, WIDTH * SIZE - 1, (HEIGHT - y - 1) * SIZE + SIZE / 2 + 2); } } if (bRow) { // 延时 200 毫秒 Sleep(200); // 擦掉刚才标记的行 IMAGE img; for(i = 0; i < 4; i++) { if (row[i]) { for(y = g_CurBy - i + 1; y < HEIGHT; y++) for(x = 0; x < WIDTH; x++) { g_World[x][y - 1] = g_World[x][y]; g_World[x][y] = 0; } getimage(&img, 0, 0, WIDTH * SIZE, (HEIGHT - (g_CurBy - i + 1)) * SIZE); putimage(0, SIZE, &img); } } } // 产生新方块 NewBlock(); // 重新计算延时 GetControl(true);}

俄罗斯方块C源代码#include #include #include #include #define  ZL  4     //坐标增量, 不使游戏窗口靠边#define WID  36    //游戏窗口的宽度#define HEI  20    //游戏窗口的高度int i,j,Ta,Tb,Tc;      // Ta,Tb,Tc用于记住和转换方块变量的值int a[60][60]={0};    //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框int b[4];        //标记4个"口"方块:1有,0无,类似开关int x,y, level,score,speed;    //方块中心位置的x,y坐标,游戏等级、得分和游戏速度int flag,next;   //当前要操作的方块类型序号,下一个方块类型序号void gtxy(int m, int n);   //以下声明要用到的自编函数void gflag( );  //获得下一方块序号void csh( );  //初始化界面void start( );  //开始部分void prfk ( );  //打印方块void clfk( );  //清除方块void mkfk( );  //制作方块void keyD( );  //按键操作int  ifmov( );  //判断方块能否移动或变体void clHA( );  //清除满行的方块void clNEXT( );  //清除边框外的NEXT方块int main( ){ csh( );      while(1)     {start( );  //开始部分       while(1)       { prfk( );           Sleep(speed);  //延时          clfk( );          Tb=x;Tc=flag;  //临存当前x坐标和序号,以备撤销操作          keyD( );            y++;     //方块向下移动         if (ifmov( )==0) { y--; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环       }      for(i=y-2;iZL ){ gtxy(i,j); printf("□"); } } } gtxy(ZL+WID+3,ZL+1);   printf("level : %d",level);  //以下打印菜单信息 gtxy(ZL+WID+3,ZL+3);  printf("score : %d",score); gtxy(ZL+WID+3,ZL+5);  printf("speed : %d",speed);}void clfk( )  //清除俄罗斯方块{ for(i=0;i<4;i++) { b[i]=0; }  //数组b[4]每个元素的值都为0  mkfk ( );  //制作俄罗斯方块 for( i=x-2; i<=x+4; i+=2 )  //清除方块  { for(j=y-2;j<=y+1;j++){ if( a[i][j]==0 && j>ZL ){ gtxy(i,j); printf("  "); } } }}void mkfk( )  //制作俄罗斯方块{ a[x][ y]=b[0];  //方块中心位置状态: 1-有,0-无 switch(flag)   //共6大类,19种小类型 { case 1: { a[x][y-1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //田字方块  case 2: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x+4][y]=b[3]; break; }  //直线方块:----  case 3: { a[x][y-1]=b[1]; a[x][y-2]=b[2]; a[x][y+1]=b[3]; break; }  //直线方块: |  case 4: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x][y+1]=b[3]; break; }  //T字方块  case 5: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y]=b[3]; break; }  //T字顺时针转90度  case 6: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转180度  case 7: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转270度  case 8: { a[x][y+1]=b[1]; a[x-2][y]=b[2]; a[x+2][y+1]=b[3]; break; } //Z字方块  case 9: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x-2][y+1]=b[3]; break; }  //Z字顺转90度  case 10: { a[x][y-1]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //Z字顺转180度  case 11: { a[x][y+1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][ y]=b[3]; break; } //Z字顺转270度  case 12: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y-1]=b[3]; break; }  //7字方块  case 13: {a[x-2][y]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转90度  case 14: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y+1]=b[3]; break; }  //7字顺转180度  case 15: { a[x-2][y]=b[1]; a[x-2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转270度  case 16: { a[x][y+1]=b[1]; a[x][y-1]=b[2]; a[x+2][y-1]=b[3]; break; }  //倒7字方块 case 17: { a[x-2][y]=b[1]; a[x+2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转90度 case 18: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y+1]=b[3]; break; }  //倒7字顺转180度  case 19: { a[x-2][y]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转270度 }}void keyD( )  //按键操作{ if (kbhit( ))          { int key;     key=getch();     if (key==224)       { key=getch();         if (key==75) { x-=2; }  //按下左方向键,中心横坐标减2         if (key==77) { x+=2; }  //按下右方向键,中心横坐标加2        if (key==72)     //按下向上方向键,方块变体          { if (flag>=2 && flag<=3 ) { flag++; flag%=2; flag+=2; }           if ( flag>=4 && flag<=7 ) { flag++; flag%=4; flag+=4; }           if (flag>=8 && flag<=11 ) { flag++; flag%=4; flag+=8; }           if (flag>=12 && flag<=15 ) { flag++; flag%=4; flag+=12; }           if ( flag>=16 && flag<=19 ) { flag++; flag%=4; flag+=16; } }         }      if (key==32)     //按空格键,暂停        { prfk( ); while(1) { if (getch( )==32) { clfk( );break;} } }  //再按空格键,继续游戏      if (ifmov( )==0) { x=Tb; flag=Tc; }   //如果不可动,撤销上面操作      else { prfk( ); Sleep(speed); clfk( ); Tb=x;Tc=flag;}   //如果可动,执行操作   }}int ifmov( )   //判断能否移动{ if (a[x][y]!=0) { return 0; }  //方块中心处有图案返回0,不可移动 else{ if ( (flag==1 && ( a[x][ y-1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||           (flag==2 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x+4][y]==0 ) ) ||          (flag==3 && ( a[x][y-1]==0 && a[x][y-2]==0 && a[x][y+1]==0 ) ) ||         (flag==4 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x][y+1]==0 ) ) ||         (flag==5 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y]==0 ) ) ||         (flag==6 && ( a[x][ y-1]==0 && a[x-2][y]==0 && a[x+2][y]==0 ) ) ||         (flag==7 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y]==0 ) ) ||         (flag==8 && ( a[x][y+1]==0 && a[x-2][y]==0 && a[x+2][y+1]==0 ) ) ||         (flag==9 && ( a[x][y-1]==0 && a[x-2][y]==0 && a[x-2][y+1]==0 ) ) ||         (flag==10 && ( a[x][y-1]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) ||         (flag==11 && ( a[x][y+1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||         (flag==12 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y-1]==0 ) ) ||        ( flag==13 && ( a[x-2][y]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||        ( flag==14 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y+1]==0 ) ) ||        (flag==15 && ( a[x-2][y]==0 && a[x-2][y+1]==0 && a[x+2][y]==0 ) ) ||        (flag==16 && ( a[x][y+1]==0 && a[x][y-1]==0 && a[x+2][y-1]==0 ) ) ||        ( flag==17 && ( a[x-2][y]==0 && a[x+2][y+1]==0 && a[x+2][y]==0 ) ) ||        (flag==18 && ( a[x][y-1]==0 &&a[x][y+1]==0 && a[x-2][y+1]==0 ) ) ||        (flag==19 && ( a[x-2][y]==0 && a[x-2][y-1]==0              && a[x+2][y]==0 ) ) ) { return 1; }    }  return 0;   //其它情况返回0}void clNEXT( )   //清除框外的NEXT方块{ flag = next;  x=ZL+WID+6;  y=ZL+10;  clfk( ); }void clHA( )   //清除满行的方块{ int k, Hang=0;    //k是某行方块个数, Hang是删除的方块行数  for(j=ZL+HEI-1;j>=ZL+1;j--)  //当某行有WID/2-2个方块时,则为满行   { k=0; for(i=ZL+2;iZL;k--)          { for(i=ZL+2;i0 && (score%500==0 || score/500> level-1 ) )  //得分满500速度加快升一级    { speed-=20; level++; if(speed<200)speed+=20; } }

俄罗斯方块毕业论文

5月15日 16:34 游戏起源、历史、简介  俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。  究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。  ★★ 一些和俄罗斯方块有关的故事  俄罗斯方块操作简单,难度却不低。作为家喻户晓老少皆宜的大众游戏,时至今日玩游戏的人(以及许多不怎么玩游戏的人)中谁要是不知道的话可真所谓是火星上的熊猫了。但是,谁知道这么优秀的娱乐工具,出自哪位神人之手呢?  顾名思义,俄罗斯方块自然是俄罗斯人发明的。这位伟人叫做阿列克谢·帕基特诺夫(Alexey Pazhitnov) 。  然而,很少有人知道,这个著名的游戏在80年代曾经在法律界掀起轩然大波,那就是著名的俄罗斯方块产权之争。这次产权争夺,几家欢喜,几家哀愁,几家公司倒闭,几家公司赚钱,其中的是是非非,一言难尽。  1985年6月  工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,并且在莫斯科的电脑界传播。帕基特诺夫因此开始小有名气。  1986年7月  PC版俄罗斯方块在匈牙利的布达佩斯被当地的一群电脑专家移植到了Apple II 和 Commodore 64 上,这些版本的软件引起了当时英国一个叫Andromeda的游戏公司经理罗伯特·斯坦恩(Robert Stein)的注意,他向帕基特诺夫以及匈牙利的电脑专家们收购了俄罗斯方块的版权,并且在买到版权之前把它们倒手卖给了英国的Mirrorsoft (注意不是Microsoft!) 以及美国的Spectrum Holobyte。  1986年11月  斯坦恩和帕基特诺夫经过谈判,就版权收购问题未取得成果。斯坦恩甚至直接飞到莫斯科和帕基特诺夫面谈,但是空手而归。由于俄罗斯人对于已经在西方兴起的电子游戏产业知道不多,斯坦恩决定窃取Tetris的版权,于是他放出谣言说这是匈牙利人开发的游戏。  与此同时,PC版的俄罗斯方块已经由英国的Mirrorsoft出品并且在欧洲销售,受到当时人们的极大关注。不仅仅因为这个游戏好玩,而且这是“第一个来自铁幕国家的游戏。”当时的游戏宣传海报上有浓郁的冷战色彩,比如战争画面,加加林太空飞行等。而斯坦恩仍然没有正式合法的版权。  1987年6月  斯坦恩最终取得了在IBM-PC及其兼容机上的Tetris的版权,版权机种包括“其他任何电脑系统”。但是,他没有和苏联方面签署协议,也就是说,这个版权是不完全的。(注: 这个“其他任何电脑系统”在原文中的描述是any other computer system,这种说法在当时看来也很不严密,从而为后来的产权之争埋下了伏笔)  1988年1月  Tetris在电脑平台的热销,一时造成“洛阳纸贵”(伦敦磁盘贵??)的局面。而当CBS晚报采访了俄罗斯方块之父帕基特诺夫之后,斯坦恩盗窃版权的计划彻底泡汤了。一个新的公司ELORG(Electronorgtechinca,苏联一家软件公司)开始和斯坦恩就游戏程序问题进行协商。ELORG的负责人亚历山大·阿列欣科( Alexander Alexinko)知道斯坦恩虽然没有版权,但是会以手中的游戏开发程序为筹码威胁中断谈判。  1988年5月  经过几个月的争吵之后,筋疲力尽的斯坦恩终于和ELORG签定了PC俄罗斯方块版权的合约。当时的合约禁止开发街机版和掌机版的方块游戏,而电脑版的Tetris则成为当时最畅销的游戏。  1988年7月  斯坦恩与阿列欣科商谈开发街机版俄罗斯方块的问题。阿列欣科当时尚未从斯坦恩那里拿到一分钱的版权费,但是同时的Spectrum 和 Mirrorsoft已经开始向电子游戏商出售了俄罗斯方块的版权。Spectrum 将Tetris的游戏机和PC在日本的版权卖给了Bullet-Proof Software (FC和GB版俄罗斯方块的制作商),而Mirrorsoft则把它在日本和北美的版权卖给了美国的Atari。这样一来两家公司的矛盾就开始了。1988年11月,BPS在FC上发行的俄罗斯方块(大家不很熟悉的俄罗斯方块1)在日本发售,销量达200万份。  1988年11月  随着GB的开发,NOA(任天堂美国分公司)的经理荒川实(任天堂山内溥老爷子的女婿)希望将Tetris做成GB上的游戏。于是他联系了BPS的总裁亨克·罗杰斯(Henk Rogers),罗杰斯再与斯坦恩联系的时候却吃了闭门羹。于是他直接去莫斯科购买版权。而斯坦恩觉察出风头,也乘飞机前往莫斯科;与此同时,Spectrum的负责人罗伯特·麦克斯韦(Robert Maxwell)的儿子凯文·麦克斯韦(Kevin Maxwell) 也在向莫斯科进发。就这样,三路人马几乎在同时赶到了冰天雪地的红色都市。  1989年2月21日  罗杰斯首先会见了ELORG的代表叶甫盖尼·别里科夫(Evgeni Belikov,和那个“装在套子里的人”同名)。他给帕基特诺夫等苏联人留下了深刻印象,并且签了手掌机方块游戏的版权。之后他向俄国人展示了FC版Tetris,这使别里科夫极为震惊。因为他并没有授予罗杰斯家用机的版权!罗杰斯则向他们说这是向TENGEN购买的版权,但是别里科夫也从来听说过TENGEN这个公司的名字。罗杰斯为了缓和尴尬的局面,将斯坦恩隐瞒的事实如数告诉了别里科夫,并且答应付给苏联方面更多支票作为已经卖出的FC版俄罗斯方块的版权费用。这时罗杰斯发现自己有机会买到Tetris全部机种的版权(但是当时还没买),虽然Atari会对他虎视耽耽,但是别忘了,他和BPS的背后还有任天堂这个大靠山给自己撑腰。  注意:罗伯特·斯坦恩原先所签的协议只是电脑版Tetris的版权,其他的版权并不是他的。  后来,斯坦恩和ELORG重新签署了协议。别里科夫强迫他重签的合约中修改的内容是:“电脑的定义:包含有中央处理器,监视器,磁盘驱动器,键盘和操作系统的机器”。而斯坦恩当时却没有仔细看这些定义。(这回轮到他犯混了……)后来他才意识到这是罗杰斯从自己手中抢走版权而耍的花招。但是为时已晚。第二天他被告知虽然签署的文件已经不能改过来,但是他还可以得到街机版Tetris的开发权。三天之后,他签下了街机版的协议。  1989年2月22日  凯文·麦克斯韦访问了ELORG。别里科夫拿出罗杰斯给他的FC游戏卡向他询问这件事情。麦克斯韦在卡带上看到了Mirrorsoft的名字后才想起他的公司已经把部分版权倒卖给了Atari。(糊涂人办糊涂事……)当他想继续谈街机和手掌机版权的问题的时候,却发现他自己能够签的,就只有除电脑,街机,家用机和掌机以外的协议了。(其实等于没有协议可签,除非他发明一种新的娱乐系统,比方说俄罗斯方块积木……)在糊涂之余这家伙灵机一动,告诉别里科夫说此卡带为盗版(汗……),然后也要签家用机的协议。  最后的结果是:凯文·麦克斯韦只带走一张白纸,罗伯特·斯坦恩带走了街机协议书。由于麦克斯韦声称所有的FC卡都是盗版,ELORG保留了家用机的版权,没卖给任何人。假如麦克斯韦想获得家用机版权的话,就必须出价比任天堂高才行。亨克·罗杰斯买到了掌机的版权,并且通知了荒川实。BPS就制作GB版Tetris向任天堂达成交易:这笔交易额高大500万-1000万美元。  1989年3月15日  亨克·罗杰斯回到莫斯科,并且代表任天堂出巨资收购家用机版Tetris的版权。版权费的价格虽然没有向外界透露,但是这个数字将是Mirrorsoft永远拿不出来的。连荒川实和NOA的首席执行官霍华德·林肯(Howard Lincoln)都亲自前往苏联助阵。  1989年3月22日  ELORG和任天堂的家用机协议终于达成。任天堂方面坚持加入一款声明,在协议签定之后,如果和其他出现法律纠纷,苏联方面必须派人去美国的法庭上做证。实际上,这种法律上的争端将是不可避免的。据说ELORG仅仅得到的定金有300-500万美元之多。别里科夫向Mirrorsoft通知,说Mirrorsoft, Andromeda和Tengen都没有家用机的版权,现在版权都归任天堂所有。当天晚上任天堂和BPS的头目们在莫斯科酒店里举行了庆祝party。  (各位看明白了,现在家用机和掌机的版权已经被任天堂和BPS分别掌握在手中。无论是Atari还是Tengen都没有权利制作FC版的俄罗斯方块。)  1989年3月31日  霍华德·林肯愉快(幸灾乐祸?)地向Atari发去最后通牒(传真),告诉他们立刻停止FC(NES)版的俄罗斯方块游戏。这使得Atari和麦克斯韦都十分震怒。他们以Tengen的名义回信说在4月7日那天他们就已经享有家用机俄罗斯方块的版权了。  1989年4月13日  Tengen撰写了一份申请书,要求拥有Tetris的“影音作品,源程序和游戏音乐”版权。但是申请书中并没有提及阿列克谢·帕基特诺夫和任天堂的游戏版权问题。(忽视了阿列克谢·帕基特诺夫真是个大错误!)  与此同时,麦克斯韦利用自己掌握的媒体势力,企图夺回Tetris的阵地。甚至搬出了苏联与英国政府,对俄罗斯方块版权问题进行干预。(好大的面子啊!)结果挑起了苏共与ELORG之间的矛盾。甚至连戈尔巴乔夫都向麦克斯韦保证“以后不用担心日本公司的问题”。(汗……这位麦克斯韦果然不是善主……伟大的苏联政府都对俄罗斯方块关注起来了……)  在4月晚些时候,霍华德·林肯回到莫斯科的时候,发现ELORG已经在苏联政府的打压下抬不起头来,而就在那天半夜,NOA方面给他打电话,说Tengen已经起诉了任天堂。(山雨欲来风满楼啊……)  第二天,他面会了别里科夫,帕基特诺夫和其他几位ELORG的成员,以确保他们能够为任天堂的官司佐证。(这回合同里的条款可生效了)随后NOA立刻反诉Tengen,并且开始收集证据。  1989年5月17日  Tengen在USA Today上登载了大幅Tertis广告,虽然法庭大战已经迫在眉睫。  1989年6月  Tengen与任天堂的案子终于开庭审理。  论战主要围绕一个议题展开:NES(FC)究竟是电脑,还是电子游戏机。(大家不许笑,在法庭上这可是很严肃的话题)Atari认为NES是电脑系统,因为它拥有扩展机能,而且日本的Famicom也有网络功能存在。而任天堂的证据则更加切题:ELORG中的苏联人从来没有意向出售Tetris的家用机版权,而所谓的“电脑”的概念则早在和斯坦恩的协议中提到了。  1989年6月15日  法庭召开听证会,讨论关于任天堂和Tengen互相命令对方终止生产和销售各自的Tetris软件的行为。法官福恩·史密斯(Fern Smith)宣布Mirrorsoft 与 Spectrum Holobyte均没有家用机版权,因此他们提供给Tengen的权利也不能生效。任天堂的请求最后得到了许可。  1989年6月21日  Tengen版的俄罗斯方块全部撤下了货架,该游戏卡带的生产也被迫中止。数十万份软件留在包装盒里,封存在仓库中。  1989年7月  任天堂NES版Tetris在美国发售。全美销量大约300万。与此同时,和GB版Tetris捆绑销售的Game Boy席卷美国,美利坚大地上刮起一阵方块旋风。  关于Tetris的混战此时已经告一段落。而任天堂和Tengen之间的法庭纠纷则一直持续到1993年。  尾声  Atari Games仍然开发了街机版的Tetris,共卖出约2万台机器。近来Atari Games 被 Williams/WMS收购,而那些封存在仓库里的NES版Tetris的命运则没人知道。Tengen不能从其他途径把它们处理掉,所以估计这些软件都被销毁了。但是据说仍然有约10万份Tengen版的Tetris流入了市场。  我们今天在64合一等游戏D版卡里玩到的所谓“俄罗斯方块2”其实就是当年的Tengen版,平心而论,这一版的方块比BPS的版本要好玩许多。首先,这版的操作感和按键设定十分到位,AB分别是正转和反转,而BPS版是用十字键的下来转动,只支持一个方向,按A就直接“啪”地落下来,手感十分不爽;其次,它支持的二人对战,与电脑竞争和合作的模式也让人耳目一新。还有,音乐也是没的说。  罗伯特·斯坦恩,这个版权问题的始作俑者,在Tetris上总共只赚了25万美元。本来他可以挣多点钱的,但是Atari和Mirrorsoft在付他版税的时候没有给足。(应得的报应……)  Spectrum Holobyte 则需要和ELORG重新协商,以确保电脑版Tetris的版权。  罗伯特·麦克斯韦的媒体堡垒在混战中逐渐分崩离析,老麦克斯韦在做生意时做幕后黑手的事实也在调查中,而他却突然暴病身亡。(气死的……)Mirrorsoft 英国公司也惨淡地退出了历史舞台。  真正的大赢家是BPS的总裁亨克·罗杰斯,还有幕后的任天堂。俄罗斯方块究竟为任天堂赚了多少银子呢?答案恐怕永远说不清了。想一想吧,在美国GB都是和Tetris捆绑销售,以增加GB的出货量……然后因为Tetris买了GB的人还会买其他的GB卡……要是这么算起来的话,那利润简直就像滚雪球一样了。现在GB版的Tetris(Z版)总共生产了3000万张。(后来GB的俄罗斯方块又在SFC上出了复刻版,和《马里奥医生》一起出现在屏幕上,成为不朽之作。)  至于苏联方面,除了苏联政府,谁也没有从Tetris那里得到多少好处。苏联解体之后,原ELORG的人员都四散到了全国乃至世界各地,许多人继续开发游戏(比方说帕基特诺夫)。  阿列克谢·帕基特诺夫几乎没有从Tetris上赚到一分钱。ELORG本来打算给他Tetris的销售权,但是旋即取消了这笔交易。不过帕基特诺夫仍然为自己能够制作出这么一个世界闻名的优秀游戏而欣慰。他从科学院里得到一台286(当时在苏联可是了不起的电脑)作为奖励。而且分到了比同事们家宽敞明亮的房子。在1996年,亨克·罗杰斯支付给他一笔报酬(还算是个知恩图报的人),帕基特诺夫组建了Tetris Company LLC 公司,终于能够自己创作游戏,并且收取版权费了。  注:当年俄罗斯方块红遍世界的各个角落,一个本来是吃大锅饭的人在消极怠工的时候发明的娱乐工具成了造福全人类的宝贝,它的价值远远超越了开发这个软件时候的预想。Atari虽然在法庭上惨败,但是拜亚洲盗版商人所赐,Tengen版的俄罗斯方块已经在中国玩家心目中生根发芽,长叶开花,任天堂的正统Tetris在中国反而没人玩了。其实说了那么多,归根到底,平平淡淡才是真。有机会的话,下载一个FC的模拟器和一个64合一的经典ROM,回家体会一下俄罗斯方块的魅力吧……  附上Alex Pajitnov照片一张。  该回答在5月15日 19:30由回答者修改过

前 言 visual basic继承了basic语言易学易用的特点,特别适合于初学者学习windows系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。于是我们小组着手设计开始一个这样的游戏软件。通过这学期来Visual Basic的学习,我初步掌握了Visual Basic语言的最基本的知识,于是在牛荣和李鹏等老师的指导下动手用Visual Basic编写俄罗斯方块游戏。 我们之所以选择开发俄罗斯方块游戏,无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。 在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。谁能说清楚,迄今为止人们究竟花了多少万个小时在这个游戏上?也许这些时间本来可以被花在更具生产力的活动上。某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。 为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。 工程概况 1 项目名称 俄罗斯方块游戏 2 设计平台 VB 全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。 Vb是microsoft公司于1991年退出的windows应用程序开发工具visual意思是“可视化的”。在它刚推出来时,自身还存在一些缺陷,功能也相对少一些。但是经过多年的开发研究。最近microsoft公司又推出了VB0版本 VB0运行环境:硬件,要求486以上的处理器、16MB以上内存,50MB 以上的硬盘,cd-rom驱动器,鼠标。软件:要求windows 95以上版本。 3程序设计思想 游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个欲览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。 俄罗斯方块游戏设计的主要步骤为以下10个方面: (1)游戏界面的设计。 (2)俄罗斯方块的造型。 (3)俄罗斯方块的旋转。 (4)俄罗斯方块的运动情况(包括向左,向右和向下)。 (5)俄罗斯方块的自动消行功能。 (6)游戏级别的自由选择。 (7)游戏速度的自由选择。 (8)游戏得分的计算。 (9)游戏菜单选项的设计及功能实现。 (10)游戏的背景音乐及特效。 4运用的控件和主要对象 我们在设计过程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,windows media player控件等等。 5主要实现的功能 我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 可以灵活控制方块在图形框中运动。 游戏过程中方块可以自由旋转。 当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。 游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。 游戏的得分支持积分,并且按照公式: 得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1) 这样,你同一时间消除的行数越多,你的得分也就越高,当游戏积分到了一定时可以自动升级,这个升级指速度升级。 游戏中提供了一个漂亮的场景和动听的音乐,给你带来无限激情。 6开发人员 由于这次课程设计所选的题目太复杂,而时间又比较紧张,指导老师建议和同学分工完成。我们小组成员包括组长孙磊周,副组长邹海星,此游戏由我们两个人共同开发而成。 正文 1游戏设计的具体实现 在我们两个人共同努力下,此次设计,终于能够圆满完成。由于时间的紧促,在设计中,也许会有一些考虑不周之处,但其功能已经能够满足大多用户的需求,相信假以时日,一定能做出一个更经典,更完美的俄罗斯方块游戏,下面我们将对每一步的具体如何实现展示给大家。 1游戏界面的设计和背景音乐及特效的实现 俄罗斯方块游戏主要由两个界面构成,登陆界面和开始游戏界面,在登陆界面中我们可以首先看到圣诞节的晚上飘梅花的场景,梅花从窗体顶部做函数曲线的下落运动,在窗体中定义一个Image控件组,在通用中定义梅花X坐标变量动态数组,Y坐标变量动态数组,步距X的变量动态数组,步距Y的变量动态数组,以及振幅变量动态数组。然后在窗体form_load中可以定义梅花的数量,利用随机函数产生随机的梅花坐标,步距和振幅,Image控件在运行时候就调用梅花图片,Image控件就可以由时钟控件控制下落速度,可以自由调节,梅花按snow(i)Left = xp(i) + am(i) * Sin(dx(i))函数在做纵向的正玄函数轨迹运动,竖直方向上为自由下落运动,,有am(i)来控制梅花的左右移动振幅。因此,我们就可以看到一个梅花在空中自由飘舞的画面了。 背景画面是用photoshop软件处理的漂亮图案,原本画面中的动画效果都是由Image控件制作的,还有点击进入游戏的按钮是由Label控件实现的,因为Image控件没有置前置后功能,不能将下雪的场景体现完整性,所以将这些图案全部放在背景上,不影响雪花飘落的效果,当点击画面的时候一样可以进入游戏界面。 游戏的背景音乐是由一段代码调用系统播放器Windows Player播放背景音乐,由于本次设计主要是针对游戏如何设计的,所以在这里就不对播放背景音乐的功能做介绍了。 2俄罗斯方块的造型 相信朋友们都玩过俄罗斯方块,对这个游戏的玩法和方块形状都比较熟悉。我们这个游戏只选择了最基本的7中造型,包括长条型,正方型,正S型,反S型,正7型,反7型,T型。如果需要我们可以添加更多的造型。将游戏界面的游戏区图片框分割成10*20的小块,每个小块放置一个command控件,预览区图片框按同样比例分割成4*4的小块,同样有command控件构成,我们可以把预览区图片框看作是从游戏区图片框中选取的一个部分,游戏区的小方块编号和欲览区编号如下图: 0 1 2 3 4 5 6 7 8 9 … … … … … … … … … … … … … … … … … … … … 90 91 92 93 94 95 96 97 98 99 3 4 5 6 13 14 15 16 23 24 25 26 33 34 35 36 游戏区编号 欲览区编号 利用Select将方块的7中造型列出,比如长条型的设计,在欲览区中分别有6和35四个方块构成两中形态,用数组为: m(0) = 3: m(1) = 4: m(2) = 5: m(3) = 6: situation2 = 0 m(0) = 5: m(1) = 15: m(2) = 25: m(3) = 35: situation2 = 1 将它的形状编号为0和1,在后面方便调用,其他的方块造型同样的方法。 3俄罗斯方块的旋转 俄罗斯方块的旋转主要将方块的位置加以变换得到的,例如上述范例,长条型有两中样式,根据小方块的编号变动来实现整个造型的旋转,比如: If n(0) - 18 >= 2 And n(3) + 9 <= 198 Then If cmdfang(n(0) - 18)Visible = False And _ cmdfang(n(1) - 9)Visible = False And _ cmdfang(n(3) + 9)Visible = False Then hidefang 0 n(0) = n(0) - 18 n(1) = n(1) - 9 n(3) = n(3) + 9 showfang 0 situation = 1 End If End If 方块的造型在旋转的时候存在一个公式,当然首先要判断是否满足旋转的要求,以上是一个长条型由横着变成竖立状态的旋转,我们以它的造型中的第三个小方块n(3)为中心旋转,这样,在开始运动的时候,长条形要发生旋转最少要运动到第三行,才能由横着变成竖立状态,游戏区图形框中第三行的第一个方块的编号为20,所以长条造型的第一个小方块的编号n(0)必须要大于20。同样,长条型方块在下落到底部的时候也有限制。如果长条下落到最后一行也将无法由横着变成竖立状态。 4如何实现方块的运动和自动消除满行的方块 我们的这个俄罗斯方块游戏主要是利用command控件的visible属性完成效果的,其实在游戏区图形框可以看成是由许多的command小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制visible属性改变的速度,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。 方块在下落的过程中会自动判断每一行方块的visible属性,如果全部为true时,就会将这一行小方块的visible属性全部变成false,在将上面的小方块向下移动,利用for语句进行循环判断,将所有这样情况的行改变小方块visible属性。当有多行同时出现这样情况时使用递归调用,实现连续消行。具体程序代码如下: For i = 190 To 10 Step -10 If cmdfang(i)Visible = True And _ cmdfang(i + 1)Visible = True And _ cmdfang(i + 2)Visible = True And _ cmdfang(i + 3)Visible = True And _ cmdfang(i + 4)Visible = True And _ cmdfang(i + 5)Visible = True And _ cmdfang(i + 6)Visible = True And _ cmdfang(i + 7)Visible = True And _ cmdfang(i + 8)Visible = True And _ cmdfang(i + 9)Visible = True Then For j = i + 4 To i Step -1 t = 1 cmdfang(j)Visible = False cmdfang(2 * i + 9 - j)Visible = False For k = 1 To 4000 DoEvents Next t = 0 Next linenum = linenum + 1 For j = i - 1 To 0 Step -1 If cmdfang(j)Visible = True Then cmdfang(j)Visible = False cmdfang(j + 10)Visible = True End If Next clearline '为了实现连消数行,这里使用递归调用 End If Next 5游戏速度和游戏级别自由选择 游戏速度的自由选择无非就是改变时钟控件的频率,我们在菜单中添加了选择速度的功能,还有添加了考验功能,将欲览窗中的方块造型隐藏,给玩家提高了难度,如果你不愿意接受考验也可以点击显示还原成原来状态。 游戏级别的自由选择是让用户选择游戏开始时候,游戏区底部出现一定行数的随机方块,同样给玩家增加了难度,功能代码如下: For i = 19 To 20 - Val(Text) Step -1 For j = i * 10 To i * 10 + 9 If Rnd >= 5 Then cmdfang(j)Visible = True Next Next 可以根据你选择的难度系数在底层的每一行随机产生超过半数(即5个以上)以上的小方块,这样适合喜欢高难度的玩家。 6游戏得分的计算和游戏菜单的编辑 游戏得分的计算主要是根据消除的行数来决定的,当然每一次同时消除的行数不一样,每一行的得分也不一样,如果你每次消除的行数为1,则最后得分是100分,如果同时消除2行,则最后得分是300分,同时消除3行,得分为700分,同时消除4行,得分为1500分,这由公式:得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1)。 游戏的编辑,读者可以参照下面的功能介绍。 2 游戏功能的介绍 文件-------开始:开始游戏。 继续:继续游戏。 暂停:暂时停止游戏,点击继续的时候可以继续游戏。 退出:退出游戏。 设置-------选择游戏级别。 选择游戏速度。 考验-------显示:显示欲览去方块。 隐藏:隐藏欲览去方块。 帮助-------操作提示以及版本信息和作者资料。 用户界面具体如图: 图—登陆界面 图—游戏界面 图—菜单编辑界面 图—游戏帮助界面 有关说明 经过两个多星期的设计和开发,俄罗斯方块游戏已经成功。其功能基本符合用户需求,能够完成游戏的控制,方块的变换以及消层等功能。并提供游戏设置,对于一些技术性比较过硬的玩家,可以调游戏级别、以及游戏速度,使得玩家能够充分的发挥竞技游戏的特色,可以不断的挑战自我,挑战极限。 1游戏设计中的不足之处 但是由于课程设计时间较短,所以该游戏还有许多不尽如人意的地方,比如方块类型太少,退出游戏不能存储进度等多方面问题。这些都有待进一步改善,我们在游戏中还可以更换背景音乐,以适合不同的玩家,在每通过一关可以给玩家播放一段flash,吸引玩家去挑战极限,不断提高玩家的兴趣,相信在以后的制作过程中我们将给大家带来一个更新功能更全面的游戏。 2VB与C语言之间的不同之处 我们这个小游戏也可以用C语言来实现,在程序的编程上没有VB语言方便实用,C语言和VB语言之间存在很多的共同点,虽然语法方面有点差异,但是在编程思路上完全一样,VB能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢。我们一起来探究一下。 21局部静态变量 VB支持用Static关键字声明局部变量,这样在过程结束的时候可以保持变量的数值: Public Sub Test1() Static i As Integer i += 1 '实现一个过程调用计数器 End Sub 我们实现了一个简单的过程计数器。每调用一次Test,计数器的数值就增加1。其实还有很多情况我们希望保持变量的数值。而C#的static是不能用在过程内部的。因此要实现过程计数器,我们必须声明一个类级别的变量。这样做明显不如VB好。因为无法防止其他过程修改计数器变量。这就和对象封装一个道理,本来应该是一个方法的局部变量,现在我要被迫把它独立出来,显然是不好的设计。那么VB是怎么生成局部静态变量的呢?将上述代码返汇编,我们可以清楚地看到在VB生成的CIL中,i不是作为局部变量,而是作为类的Field出现的: field private specialname int32 $STATIC$Test1$2001$i 也就是说,i被改名作为一个类的字段,但被冠以specialname。在代码中试图访问$STATIC$Test1$2001$i是不可能的,因为它不是一个有效的标识符。但是在IL中,将这个变量加一的代码却与一般的类字段完全一样,是通过ldfld加载的。我觉得这个方法十分聪明,把静态变量变成生命周期一样的类字段,但是又由编译器来控制访问的权限,让它成为一个局部变量。同时也解释了VB为什么要用两个不同的关键字来声明静态变量——Static和Shared。由于局部静态变量的实质是类的字段,所以它和真正的局部变量还是有所不同的。比如在多线程条件下,对局部静态变量的访问就和访问字段相同。 2Handles和WithEvents VB除了可以用C#那样的方法来处理事件响应以外,还有从VB5继承下来的独特的事件处理方式——WithEvents。 我喜欢称这种事件处理方式为静态的事件处理,书写响应事件的方法时就已经决定该方法响应的是哪一个事件,而C#则是在代码中绑定事件的。VB中WithEvents静态方法是非常有用的,它可以显著增强代码可读性,同时也让VB中的事件处理非常方便,不像C#那样离开了窗体设计器就必须手工绑定事件。 3类型转换运算符 在Visual Basic 2005中将加入一个新的运算符——TryCast,相当于C#的as运算符。我一直希望VB有这样一个运算符。VB目前的类型转换运算符主要有CType和DirectCast。他们的用法几乎一样。我详细比较了一下这两个运算符,得出以下结论: 在转换成引用类型时,两者没有什么区别,都是直接调用castclass指令,除非重载了类型转换运算符CType。DirectCast运算符是不能重载的。 转换成值类型时,CType会调用VB指定的类型转换函数(如果有的话),比如将String转换为Int32时,就会自动调用。 4默认属性和属性参数 在原先的VB6里,有一项奇特的功能——默认属性。在VB6中,对象的名称可以直接表示该对象的默认属性。 5可选参数和按名传递 VB从0开始支持“可选参数”这一特性。就是说,函数或子程序的参数有些是可选的,调用的时候可以不输入。其实VB从0开始就有一些函数带有可选参数,只不过到了0才让用户自己开发这样的过程。在VB4里,可选参数可以不带默认值,而在VB里,如果使用可选参数,则必须带有默认值。在调用的时候,VB若发现参数被省略,则自动读取param部分的默认值,并显式传递给过程。这一部分完全由编译器处理,而且没有任何性能损失,和手工传递所有参数是完全一样的。至于按名传递,VB会自动调整参数的顺序,其结果与传统方式的传递也没有任何的不同。这说明我们可以放心地使用这项便利。而且带有可选参数的过程拿到C#中,顶多变成不可选参数,也不会造成什么其他的麻烦。 PS很多COM组件都使用了默认参数,而且有些过程的参数列表非常长,在VB里可以轻松地处理它们,而在C#中经常让开发者传参数传到吐血。 6在经过对比之后可得以下一个结论: 目前的主流编程语言没有简单的,如果你想学精通的话。 VB的门槛比较低,编程思想较容易接受。 学习C不能短期内见到成效。 据用户调查69%的考生觉得VB更容易接受 致谢 在本次课程设计中,我从指导老师牛荣和李鹏身上学到了很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。 另外,在游戏开发过程中化希耀老师和杜义君老师也给于我们很大的帮助,帮助解决了不少的难点,使得游戏能及时开发完成,还有所有的同学同样给与我不少帮助,这里一并表示感。 参考文献: [1]Vsual Basic 程序设计教程 作者:龚沛曾,陆慰民,杨志强 高等教育出版社出版 [2]Vsual Basic 0程序设计 作者:刘新民,蔡琼,白糠生 清华大学出版社出版 [3]80例上手 VB6 编程 作者:唐凯军,汤惠莉 山东电子音像出版社 [4]Vsual Basic 实例教程 作者:卢毅 科学出版社出版 [5]Vsual Basic 经典范例50讲 作者:赵欣胜,亢慧娟,刘晟宏 科学出版社出版

关于俄罗斯方块的论文

设计:不会 应用价值:玩

估计是程序开发吧!摘要就是综述全文内容。 比如:本文以C语言为开发环境,通过。。。方法,什么结构,实现俄罗斯方块小游戏编写。 求采纳

俄罗斯方块游戏毕业论文

估计是程序开发吧!摘要就是综述全文内容。 比如:本文以C语言为开发环境,通过。。。方法,什么结构,实现俄罗斯方块小游戏编写。 求采纳

对于JSP来说,相信不少毕业生应该是不陌生的,对,我想介绍就是它,希望通过介绍完它之后,对你们毕业设计有所帮助一、JSP的基本简介:全名为Java Server Pages,JSP技术有点类似ASP技术,它使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑,是在传统的网页HTML文件(*htm,*html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*jsp)。 用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 二、JSP的优点:对于用户界面的更新,其实就是由 Web Server进行的,所以给人的感觉更新很快。多样化和功能强大的开发工具支持;这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且大多数可以免费得到,并且许多已经可以顺利的运行于多种平台之下。客户端的接口不是很繁琐,对于各种应用易于部署、维护和修改;一次编写,到处运行;在这一点上Java比PHP更出色,除了系统之外,代码不用做任何更改。 三、JSP的缺点:java的高效率运行需要占用大量的内存和硬盘空间, 一方面,java的高速运行是通过lass文件常驻内存来实现的另一方面,还需要硬盘空间来存储一系列的java 文件和lass文件以及对应的版本文件(对于硬件的要求较高)。JSP程序调试困难;JSP页面执行时, 首先被转换为java文件(Servlet),然后将java文件编译为字节码文件;这样,出错信息实际上指向的是转换后的那个java文件(Servlet), 而不是JSP本身(调试有难度)。 这是我用JSP做出来的一些成果

5月15日 16:34 游戏起源、历史、简介  俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。  究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。  ★★ 一些和俄罗斯方块有关的故事  俄罗斯方块操作简单,难度却不低。作为家喻户晓老少皆宜的大众游戏,时至今日玩游戏的人(以及许多不怎么玩游戏的人)中谁要是不知道的话可真所谓是火星上的熊猫了。但是,谁知道这么优秀的娱乐工具,出自哪位神人之手呢?  顾名思义,俄罗斯方块自然是俄罗斯人发明的。这位伟人叫做阿列克谢·帕基特诺夫(Alexey Pazhitnov) 。  然而,很少有人知道,这个著名的游戏在80年代曾经在法律界掀起轩然大波,那就是著名的俄罗斯方块产权之争。这次产权争夺,几家欢喜,几家哀愁,几家公司倒闭,几家公司赚钱,其中的是是非非,一言难尽。  1985年6月  工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,并且在莫斯科的电脑界传播。帕基特诺夫因此开始小有名气。  1986年7月  PC版俄罗斯方块在匈牙利的布达佩斯被当地的一群电脑专家移植到了Apple II 和 Commodore 64 上,这些版本的软件引起了当时英国一个叫Andromeda的游戏公司经理罗伯特·斯坦恩(Robert Stein)的注意,他向帕基特诺夫以及匈牙利的电脑专家们收购了俄罗斯方块的版权,并且在买到版权之前把它们倒手卖给了英国的Mirrorsoft (注意不是Microsoft!) 以及美国的Spectrum Holobyte。  1986年11月  斯坦恩和帕基特诺夫经过谈判,就版权收购问题未取得成果。斯坦恩甚至直接飞到莫斯科和帕基特诺夫面谈,但是空手而归。由于俄罗斯人对于已经在西方兴起的电子游戏产业知道不多,斯坦恩决定窃取Tetris的版权,于是他放出谣言说这是匈牙利人开发的游戏。  与此同时,PC版的俄罗斯方块已经由英国的Mirrorsoft出品并且在欧洲销售,受到当时人们的极大关注。不仅仅因为这个游戏好玩,而且这是“第一个来自铁幕国家的游戏。”当时的游戏宣传海报上有浓郁的冷战色彩,比如战争画面,加加林太空飞行等。而斯坦恩仍然没有正式合法的版权。  1987年6月  斯坦恩最终取得了在IBM-PC及其兼容机上的Tetris的版权,版权机种包括“其他任何电脑系统”。但是,他没有和苏联方面签署协议,也就是说,这个版权是不完全的。(注: 这个“其他任何电脑系统”在原文中的描述是any other computer system,这种说法在当时看来也很不严密,从而为后来的产权之争埋下了伏笔)  1988年1月  Tetris在电脑平台的热销,一时造成“洛阳纸贵”(伦敦磁盘贵??)的局面。而当CBS晚报采访了俄罗斯方块之父帕基特诺夫之后,斯坦恩盗窃版权的计划彻底泡汤了。一个新的公司ELORG(Electronorgtechinca,苏联一家软件公司)开始和斯坦恩就游戏程序问题进行协商。ELORG的负责人亚历山大·阿列欣科( Alexander Alexinko)知道斯坦恩虽然没有版权,但是会以手中的游戏开发程序为筹码威胁中断谈判。  1988年5月  经过几个月的争吵之后,筋疲力尽的斯坦恩终于和ELORG签定了PC俄罗斯方块版权的合约。当时的合约禁止开发街机版和掌机版的方块游戏,而电脑版的Tetris则成为当时最畅销的游戏。  1988年7月  斯坦恩与阿列欣科商谈开发街机版俄罗斯方块的问题。阿列欣科当时尚未从斯坦恩那里拿到一分钱的版权费,但是同时的Spectrum 和 Mirrorsoft已经开始向电子游戏商出售了俄罗斯方块的版权。Spectrum 将Tetris的游戏机和PC在日本的版权卖给了Bullet-Proof Software (FC和GB版俄罗斯方块的制作商),而Mirrorsoft则把它在日本和北美的版权卖给了美国的Atari。这样一来两家公司的矛盾就开始了。1988年11月,BPS在FC上发行的俄罗斯方块(大家不很熟悉的俄罗斯方块1)在日本发售,销量达200万份。  1988年11月  随着GB的开发,NOA(任天堂美国分公司)的经理荒川实(任天堂山内溥老爷子的女婿)希望将Tetris做成GB上的游戏。于是他联系了BPS的总裁亨克·罗杰斯(Henk Rogers),罗杰斯再与斯坦恩联系的时候却吃了闭门羹。于是他直接去莫斯科购买版权。而斯坦恩觉察出风头,也乘飞机前往莫斯科;与此同时,Spectrum的负责人罗伯特·麦克斯韦(Robert Maxwell)的儿子凯文·麦克斯韦(Kevin Maxwell) 也在向莫斯科进发。就这样,三路人马几乎在同时赶到了冰天雪地的红色都市。  1989年2月21日  罗杰斯首先会见了ELORG的代表叶甫盖尼·别里科夫(Evgeni Belikov,和那个“装在套子里的人”同名)。他给帕基特诺夫等苏联人留下了深刻印象,并且签了手掌机方块游戏的版权。之后他向俄国人展示了FC版Tetris,这使别里科夫极为震惊。因为他并没有授予罗杰斯家用机的版权!罗杰斯则向他们说这是向TENGEN购买的版权,但是别里科夫也从来听说过TENGEN这个公司的名字。罗杰斯为了缓和尴尬的局面,将斯坦恩隐瞒的事实如数告诉了别里科夫,并且答应付给苏联方面更多支票作为已经卖出的FC版俄罗斯方块的版权费用。这时罗杰斯发现自己有机会买到Tetris全部机种的版权(但是当时还没买),虽然Atari会对他虎视耽耽,但是别忘了,他和BPS的背后还有任天堂这个大靠山给自己撑腰。  注意:罗伯特·斯坦恩原先所签的协议只是电脑版Tetris的版权,其他的版权并不是他的。  后来,斯坦恩和ELORG重新签署了协议。别里科夫强迫他重签的合约中修改的内容是:“电脑的定义:包含有中央处理器,监视器,磁盘驱动器,键盘和操作系统的机器”。而斯坦恩当时却没有仔细看这些定义。(这回轮到他犯混了……)后来他才意识到这是罗杰斯从自己手中抢走版权而耍的花招。但是为时已晚。第二天他被告知虽然签署的文件已经不能改过来,但是他还可以得到街机版Tetris的开发权。三天之后,他签下了街机版的协议。  1989年2月22日  凯文·麦克斯韦访问了ELORG。别里科夫拿出罗杰斯给他的FC游戏卡向他询问这件事情。麦克斯韦在卡带上看到了Mirrorsoft的名字后才想起他的公司已经把部分版权倒卖给了Atari。(糊涂人办糊涂事……)当他想继续谈街机和手掌机版权的问题的时候,却发现他自己能够签的,就只有除电脑,街机,家用机和掌机以外的协议了。(其实等于没有协议可签,除非他发明一种新的娱乐系统,比方说俄罗斯方块积木……)在糊涂之余这家伙灵机一动,告诉别里科夫说此卡带为盗版(汗……),然后也要签家用机的协议。  最后的结果是:凯文·麦克斯韦只带走一张白纸,罗伯特·斯坦恩带走了街机协议书。由于麦克斯韦声称所有的FC卡都是盗版,ELORG保留了家用机的版权,没卖给任何人。假如麦克斯韦想获得家用机版权的话,就必须出价比任天堂高才行。亨克·罗杰斯买到了掌机的版权,并且通知了荒川实。BPS就制作GB版Tetris向任天堂达成交易:这笔交易额高大500万-1000万美元。  1989年3月15日  亨克·罗杰斯回到莫斯科,并且代表任天堂出巨资收购家用机版Tetris的版权。版权费的价格虽然没有向外界透露,但是这个数字将是Mirrorsoft永远拿不出来的。连荒川实和NOA的首席执行官霍华德·林肯(Howard Lincoln)都亲自前往苏联助阵。  1989年3月22日  ELORG和任天堂的家用机协议终于达成。任天堂方面坚持加入一款声明,在协议签定之后,如果和其他出现法律纠纷,苏联方面必须派人去美国的法庭上做证。实际上,这种法律上的争端将是不可避免的。据说ELORG仅仅得到的定金有300-500万美元之多。别里科夫向Mirrorsoft通知,说Mirrorsoft, Andromeda和Tengen都没有家用机的版权,现在版权都归任天堂所有。当天晚上任天堂和BPS的头目们在莫斯科酒店里举行了庆祝party。  (各位看明白了,现在家用机和掌机的版权已经被任天堂和BPS分别掌握在手中。无论是Atari还是Tengen都没有权利制作FC版的俄罗斯方块。)  1989年3月31日  霍华德·林肯愉快(幸灾乐祸?)地向Atari发去最后通牒(传真),告诉他们立刻停止FC(NES)版的俄罗斯方块游戏。这使得Atari和麦克斯韦都十分震怒。他们以Tengen的名义回信说在4月7日那天他们就已经享有家用机俄罗斯方块的版权了。  1989年4月13日  Tengen撰写了一份申请书,要求拥有Tetris的“影音作品,源程序和游戏音乐”版权。但是申请书中并没有提及阿列克谢·帕基特诺夫和任天堂的游戏版权问题。(忽视了阿列克谢·帕基特诺夫真是个大错误!)  与此同时,麦克斯韦利用自己掌握的媒体势力,企图夺回Tetris的阵地。甚至搬出了苏联与英国政府,对俄罗斯方块版权问题进行干预。(好大的面子啊!)结果挑起了苏共与ELORG之间的矛盾。甚至连戈尔巴乔夫都向麦克斯韦保证“以后不用担心日本公司的问题”。(汗……这位麦克斯韦果然不是善主……伟大的苏联政府都对俄罗斯方块关注起来了……)  在4月晚些时候,霍华德·林肯回到莫斯科的时候,发现ELORG已经在苏联政府的打压下抬不起头来,而就在那天半夜,NOA方面给他打电话,说Tengen已经起诉了任天堂。(山雨欲来风满楼啊……)  第二天,他面会了别里科夫,帕基特诺夫和其他几位ELORG的成员,以确保他们能够为任天堂的官司佐证。(这回合同里的条款可生效了)随后NOA立刻反诉Tengen,并且开始收集证据。  1989年5月17日  Tengen在USA Today上登载了大幅Tertis广告,虽然法庭大战已经迫在眉睫。  1989年6月  Tengen与任天堂的案子终于开庭审理。  论战主要围绕一个议题展开:NES(FC)究竟是电脑,还是电子游戏机。(大家不许笑,在法庭上这可是很严肃的话题)Atari认为NES是电脑系统,因为它拥有扩展机能,而且日本的Famicom也有网络功能存在。而任天堂的证据则更加切题:ELORG中的苏联人从来没有意向出售Tetris的家用机版权,而所谓的“电脑”的概念则早在和斯坦恩的协议中提到了。  1989年6月15日  法庭召开听证会,讨论关于任天堂和Tengen互相命令对方终止生产和销售各自的Tetris软件的行为。法官福恩·史密斯(Fern Smith)宣布Mirrorsoft 与 Spectrum Holobyte均没有家用机版权,因此他们提供给Tengen的权利也不能生效。任天堂的请求最后得到了许可。  1989年6月21日  Tengen版的俄罗斯方块全部撤下了货架,该游戏卡带的生产也被迫中止。数十万份软件留在包装盒里,封存在仓库中。  1989年7月  任天堂NES版Tetris在美国发售。全美销量大约300万。与此同时,和GB版Tetris捆绑销售的Game Boy席卷美国,美利坚大地上刮起一阵方块旋风。  关于Tetris的混战此时已经告一段落。而任天堂和Tengen之间的法庭纠纷则一直持续到1993年。  尾声  Atari Games仍然开发了街机版的Tetris,共卖出约2万台机器。近来Atari Games 被 Williams/WMS收购,而那些封存在仓库里的NES版Tetris的命运则没人知道。Tengen不能从其他途径把它们处理掉,所以估计这些软件都被销毁了。但是据说仍然有约10万份Tengen版的Tetris流入了市场。  我们今天在64合一等游戏D版卡里玩到的所谓“俄罗斯方块2”其实就是当年的Tengen版,平心而论,这一版的方块比BPS的版本要好玩许多。首先,这版的操作感和按键设定十分到位,AB分别是正转和反转,而BPS版是用十字键的下来转动,只支持一个方向,按A就直接“啪”地落下来,手感十分不爽;其次,它支持的二人对战,与电脑竞争和合作的模式也让人耳目一新。还有,音乐也是没的说。  罗伯特·斯坦恩,这个版权问题的始作俑者,在Tetris上总共只赚了25万美元。本来他可以挣多点钱的,但是Atari和Mirrorsoft在付他版税的时候没有给足。(应得的报应……)  Spectrum Holobyte 则需要和ELORG重新协商,以确保电脑版Tetris的版权。  罗伯特·麦克斯韦的媒体堡垒在混战中逐渐分崩离析,老麦克斯韦在做生意时做幕后黑手的事实也在调查中,而他却突然暴病身亡。(气死的……)Mirrorsoft 英国公司也惨淡地退出了历史舞台。  真正的大赢家是BPS的总裁亨克·罗杰斯,还有幕后的任天堂。俄罗斯方块究竟为任天堂赚了多少银子呢?答案恐怕永远说不清了。想一想吧,在美国GB都是和Tetris捆绑销售,以增加GB的出货量……然后因为Tetris买了GB的人还会买其他的GB卡……要是这么算起来的话,那利润简直就像滚雪球一样了。现在GB版的Tetris(Z版)总共生产了3000万张。(后来GB的俄罗斯方块又在SFC上出了复刻版,和《马里奥医生》一起出现在屏幕上,成为不朽之作。)  至于苏联方面,除了苏联政府,谁也没有从Tetris那里得到多少好处。苏联解体之后,原ELORG的人员都四散到了全国乃至世界各地,许多人继续开发游戏(比方说帕基特诺夫)。  阿列克谢·帕基特诺夫几乎没有从Tetris上赚到一分钱。ELORG本来打算给他Tetris的销售权,但是旋即取消了这笔交易。不过帕基特诺夫仍然为自己能够制作出这么一个世界闻名的优秀游戏而欣慰。他从科学院里得到一台286(当时在苏联可是了不起的电脑)作为奖励。而且分到了比同事们家宽敞明亮的房子。在1996年,亨克·罗杰斯支付给他一笔报酬(还算是个知恩图报的人),帕基特诺夫组建了Tetris Company LLC 公司,终于能够自己创作游戏,并且收取版权费了。  注:当年俄罗斯方块红遍世界的各个角落,一个本来是吃大锅饭的人在消极怠工的时候发明的娱乐工具成了造福全人类的宝贝,它的价值远远超越了开发这个软件时候的预想。Atari虽然在法庭上惨败,但是拜亚洲盗版商人所赐,Tengen版的俄罗斯方块已经在中国玩家心目中生根发芽,长叶开花,任天堂的正统Tetris在中国反而没人玩了。其实说了那么多,归根到底,平平淡淡才是真。有机会的话,下载一个FC的模拟器和一个64合一的经典ROM,回家体会一下俄罗斯方块的魅力吧……  附上Alex Pajitnov照片一张。  该回答在5月15日 19:30由回答者修改过

关于俄罗斯方块的论文摘要

估计是程序开发吧!摘要就是综述全文内容。 比如:本文以C语言为开发环境,通过。。。方法,什么结构,实现俄罗斯方块小游戏编写。 求采纳

"必有重谢"??????多少钱~?

相关百科
热门百科
首页
发表服务