超简单的俄罗斯方块源码(HTML, JScript)

合集下载

俄罗斯方块小游戏(HTML游戏使用JavaScript开发)

俄罗斯方块小游戏(HTML游戏使用JavaScript开发)

俄罗斯方块小游戏(HTML游戏使用JavaScript开发)俄罗斯方块是一款风靡全球的经典游戏,现在我们将使用JavaScript语言开发一个基于HTML的俄罗斯方块小游戏。

在这篇文章中,我将介绍游戏的设计思路、实现过程以及一些技术细节。

一、游戏设计思路打开游戏页面后,玩家将看到一个空白的游戏区域,该区域由10列和20行方格构成。

方块将从游戏区域的顶部下落,玩家需要控制方块的方向和位置,使其在下落过程中填满一行或多行。

当一行被完全填满时,该行将被消除,并且玩家得到相应的分数。

游戏的难度会逐渐增加,方块下落的速度会逐渐加快,挑战玩家的反应和操作能力。

当方块堆积到游戏区域的顶部时,游戏结束。

玩家可以选择重新开始游戏或退出游戏。

二、游戏实现过程1. 创建HTML结构首先,我们需要创建一个HTML结构,包含游戏区域以及一些控制按钮。

游戏区域可以使用一个div元素进行表示,每个方格可以使用一个span元素表示。

同时,添加开始按钮和重新开始按钮,用于控制游戏的开始和重新开始。

2. CSS样式设计为了使游戏界面美观,我们需要设计一些CSS样式。

通过设置游戏区域的背景颜色、方格的颜色及边框效果,可以使游戏界面更加具有吸引力。

3. 实现游戏逻辑使用JavaScript语言实现游戏的逻辑部分。

我们需要为方块设计一个类,定义方块的形状、位置以及移动的方法。

在游戏的运行过程中,我们需要检测按键事件,根据玩家的操作移动方块的位置。

同时,需要实现方块的下落、旋转和消除行等功能。

4. 添加事件监听为了使玩家能够操作游戏,我们需要为游戏界面添加键盘事件监听。

通过监听键盘的上、下、左、右方向键,可以控制方块的移动和旋转。

5. 计分和游戏结束在游戏进行过程中,我们需要实时更新玩家的分数,并判断游戏是否结束。

当方块堆积到游戏区域的顶部时,游戏结束,弹出游戏结束的提示框,并显示玩家的最终得分。

三、技术细节在实现俄罗斯方块小游戏的过程中,我们使用了以下技术:1. HTML:用于创建游戏界面的结构,包括游戏区域和按钮等元素。

俄罗斯方块源代码

俄罗斯方块源代码

001第一个Cpp002#include <conio.h>003#include <stdlib.h>004#include<stdio.h>005#include <windows.h>006#include <mmsystem.h>007#pragma comment(lib,"winmm.lib") //播放背景音乐的头文件008#include "colorConsole.h"009#include<time.h>010#define SQUARE_COLOR BACKGROUD_BLUE|BACKGROUD_RED| BACKGROUD_INTENSITY //背景颜色011#define SQUARE_COLOR FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY //方块的颜色012#define up 72013#define down 80014#define left 75015#define right 77016#define esc 27017#define MAPW 15 //地图的宽度018#define MAPH 25 //地图的高度019020void initiate1();021int* build(); //创建方块 //初始化工作022BOOL isavailable(int a[],int x,int y,int w,int h); //判定是否能放下023void drawblocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors); 024void delete_cache(); //清除键盘缓冲区025void revolve(int a[][4],int w,int h,int*x,int y); //转动方块026void pro();027void end();028void delete_blocks(int*a,int w,int h,int x,int y);029void gameover();030void deletefull_line(int m[][MAPW],int row,int w,int h); //消除一行031032int dx=30,dy=5; //屏幕上的偏移量033int score=0,level=0;034int map[MAPH][MAPW];035int a1[4][4]={{1},{1,1,1}};036int a2[4][4]={{0,1},{1,1,1}};037int a3[4][4]={{1,1},{0,1,1}};038int a4[4][4]={{0,0,1},{1,1,1}};039int a5[4][4]={{0,1,1},{1,1}};040int a6[4][4]={{1,1,1,1}};041int a7[4][4]={{1,1},{1,1}};042int a[4][4];043044int main()045{046 HANDLE handle;047 handle=initiate();048 WORD wColors[1]={FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY }; 049 while(1)050 {051 sndPlaySound("Resource\\Just Dance.wav",SND_LOOP|SND_ASYNC);//用异步方式播放音乐,PlaySound函数在开始播放后立即返回052 system("CLS");053 int n=0;054 printf("目录\n1.开始游戏\n2.退出游戏\n\n\n");055 scanf("%d",&n);056 switch(n)057 {058 case1:059 system("CLS");060 textout(handle,22,6,wColors+2,1,"请选择游戏等级:");061 textout(handle,32,8,wColors+2,1,"1.初级");062 textout(handle,32,10,wColors+2,1,"2.中级");063 textout(handle,32,12,wColors+2,1,"3.高级");064 while(1)065 {066 char choice;067 choice=_getch();068 if(choice=='1')069 {070 textout(handle,22,6,wColors+2,1,"开始游戏,初级");071 textout(handle,32,8,wColors+2,1," "); 072 textout(handle,32,10,wColors+2,1," "); 073 textout(handle,32,12,wColors+2,1," "); 074 level=0,score=0;075 Sleep(2000);076 textout(handle,22,6,wColors+2,1," "); 077 break;078 }079 else if(choice=='2')080 {081 textout(handle,22,6,wColors+2,1,"开始游戏,中级"); 082 textout(handle,32,8,wColors+2,1," "); 083 textout(handle,32,10,wColors+2,1," "); 084 textout(handle,32,12,wColors+2,1," "); 085 level=2,score=20;086 Sleep(2000);087 textout(handle,22,6,wColors+2,1," "); 088 break;089 }090 else if(choice=='3')091 {092 textout(handle,22,6,wColors+2,1,"开始游戏,高级"); 093 textout(handle,32,8,wColors+2,1," "); 094 textout(handle,32,10,wColors+2,1," "); 095 textout(handle,32,12,wColors+2,1," "); 096 level=4,score=40;097 Sleep(2000);098 textout(handle,22,6,wColors+2,1," "); 099 break;100 }101 else if(choice!='1'&&choice!='2'&&choice!='3')102 continue;103 }104 pro();105 break;106 case2:107 return0;108 default:109 printf("错误,按键继续");110 while(!_kbhit());111 }112 }}113114115116void pro() //游戏主题117{118 initiate1();119 int*b=NULL;120 b=build(); //创建方块121 int sign,blank,x,y;122 while(1)123 {124 for(int i=0;i<4;i++) //复制方块125 for(int j=0;j<4;j++)126 if(a[i][j]=*(b+i*4+j)) blank=i;127 y=1-blank;x=4;128 delete_blocks(&a[0][0],4,4,16,10);129130 b=build();131 HANDLE handle;132 handle=initiate();133 WORD wColors[1]={FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY }; 134 drawblocks(b,4,4,16,10,wColors,1);135136 wColors[0]=SQUARE_COLOR;137 drawblocks(&a[0][0],4,4,x,y,wColors,1);138139 delete_cache();140141 char string[5];142 wColors[0]=FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY; 143 textout(handle,dx-10,8+dy,wColors,1,itoa(score,string,10));144 textout(handle,dx-10,14+dy,wColors,1,itoa(level,string,10));145146 sign=1;147 while(sign)148 {149 int delay=0,max_delay=100-10*level; //延迟量150 while(delay<max_delay)151 {152 if(_kbhit()) //用if避免按住键使方块卡住153 {154 int draw=0;155 int key=_getch();156 switch(key)157 {158 case up:159 delete_blocks(&a[0][0],4,4,x,y);160 revolve(a,4,4,&x,y);161 draw=1;162 break;163 case down:164 delay=max_delay;165 break;166 case left:167 if(isavailable(&a[0][0],x-1,y,4,4))168 {169 delete_blocks(&a[0][0],4,4,x,y);170 x--;171 draw=1;172 }173 break ;174 case right:175 if(isavailable(&a[0][0],x+1,y,4,4)) 176 {177 delete_blocks(&a[0][0],4,4,x,y);178 x++;179 draw=1;180 }181 break;182 case32://32 是空格键的ASCII码,按空格键暂停183 while(1)184 {185 textout(handle,dx,-2+dy,wColors,1,"Press any key to continue"); 186 Sleep(200);18 7 textout(handle,dx,-2+dy,wColors,1," ");188 Sleep(200);189 if(_kbhit())190 {191 draw=1;192 break;193 }194 }195 break;196 case esc://按键退出游戏197 exit(EXIT_SUCCESS);198 }199 if(draw)200 {201 HANDLE handle;202 handle=initiate();203 WORD wColors[1]={SQUARE_COLOR};204 drawblocks(&a[0][0],4,4,x,y,wColors,1); 205 draw=0;206 }207 }208 _sleep(5);delay++;209 }210 if(isavailable(&a[0][0],x,y+1,4,4)) //是否能下移211 {212 delete_blocks(&a[0][0],4,4,x,y);213 y++;214 HANDLE handle;215 handle=initiate();216 WORD wColors[1]={SQUARE_COLOR};217 drawblocks(&a[0][0],4,4,x,y,wColors,1);218 }219 else220 {221 sign=0; //标记,使跳出 while(sign) 循环,产生新方块222 if(y<=1)223 {224 system("CLS");225 HANDLE handle;226 handle=initiate();227 WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN};228 textout(handle,4+dx,6+dy,wColors,1,"GAME OVER!!!");229 textout(handle,4+dx,8+dy,wColors,1,"分数:");230 textout(handle,10+dx,8+dy,wColors,1,itoa(score,string,10)); 231 textout(handle,4+dx,10+dy,wColors,1,"制作者:***");232 delete_cache();233 exit(EXIT_SUCCESS);234 } //是否结束235 for(int i=0;i<4;i++) //放下方块236 for(int j=0;j<4;j++)237 if(a[i][j]&&((i+y)<MAPH-1)&&((j+x)<MAPW-1))238 map[i+y][j+x]=a[i][j];239 int full,k=0;240 for( i=y;i<min(y+4,MAPH-1);i++)241 {242 full=1;243 for(int j=1;j<14;j++)244 if(!map[i][j]) full=0;245 if(full) //消掉一行246 {247 deletefull_line(map,i,MAPW,MAPH);248 k++;249 score=score+k;250 level=min(score/10,9);251 }252 }253 }254 }255256 }257}258void initiate1() //初始化259{260 int i;261 for(i=0;i<25;i++)262 {263 map[i][0]=-2;264 map[i][14]=-2;265 }266 for(i=0;i<15;i++)267 {268 map[0][i]=-1;269 map[24][i]=-1;270 }271 map[0][0]=-3;272 map[0][14]=-3;273 map[24][0]=-3;274 map[24][14]=-3;275276 HANDLE handle;277 handle=initiate();278 WORD wColors[1]={FOREGROUND_GREEN| FOREGROUND_BLUE|FOREGROUND_INTENSITY}; 279 textout(handle,dx-10,6+dy,wColors,1,"SCORE");280 textout(handle,dx-10,12+dy,wColors,1,"LEVEL");281 textout(handle,32+dx,8+dy,wColors,1,"NEXT");282 wColors[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY;283 drawblocks(&map[0][0],15,25,0,0,wColors,1);284textout(handle,dx,dy,wColors,1,"◎═════════════◎"); 285 wColors[0]=FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY; 286 textout(handle,dx+8,dy+5,wColors,1,"按任意键开始");287 wColors[0]=FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY ; 288 textout(handle,dx+7,dy-3,wColors,1,"制作者:***");289290 int x=_getch();291 srand(time(NULL));292 textout(handle,dx+8,dy+5,wColors,1," ");}293294295int* build() //创建方块296{297 int* a=NULL;298 int c=rand()%7;299 switch(c)300 {301 case0:302 a=&a1[0][0];break;303 case1:304 a=&a2[0][0];break;305 case2:306 a=&a3[0][0];break;307 case3:308 a=&a4[0][0];break;309 case4:310 a=&a5[0][0];break;311 case5:312 a=&a6[0][0];break;313 case6:314 a=&a7[0][0];break;315 }316 return a;317}318319void drawblocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors) //画出方块320{321 HANDLE handle;322 handle = initiate();323 int temp;324325 for(int i=0;i<h;i++)326 for(int j=0;j<w;j++)327 if((temp=a[i*w+j])&&y+i>0)328 {329 if(temp==-3)330 {331textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"◎");332 _sleep(30);333 }334 else if(temp==-2)335 {336textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"║");337 _sleep(30);338 }339340 else if(temp==1)341 textout(handle,2*(x+j)+dx,y+i+dy,wCol ors,nColors,"◎");342 else if(temp==-1)343 {344textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"═");345 _sleep(30);346 }347 }348}349350void delete_cache() //清除缓冲区351{352 while(_kbhit())353 {354 _getch();355 }356}357358void delete_blocks(int*a,int w,int h,int x,int y) //覆盖方块359{360 HANDLE handle;361 handle=initiate();362 WORD wColors[1]={SQUARE_COLOR};363 for(int i=0;i<h;i++)364 for(int j=0;j<w;j++)365 if(a[i*w+j]&&i+y>0)366 textout(handle,2*(x+j)+dx,y+i+dy,wColors,1," ");}367368369370void revolve(int a[][4],int w,int h,int*x,int y) //转动方块371{372 int b[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};373 int sign=0,line=0;374 for(int i=h-1;i>=0;i--)375 {376 for(int j=0;j<w;j++)377 if(a[i][j])378 {379 b[j][line]=a[i][j];380 sign=1;381 }382 if(sign)383 {384 line++;385 sign=0;386 }387 }388 for(i=0;i<4;i++)389 if(isavailable(&b[0][0],*x-i,y,w,h))390 {391 *x-=i;392 for(int k=0;k<h;k++)393 for(int j=0;j<w;j++)394 a[k][j]=b[k][j];395 break;396 }}397398399void deletefull_line(int m[][MAPW],int row,int w,int h) //消除满行的方块400{401 HANDLE handle;402 handle=initiate();403 WORD wColors[1]={SQUARE_COLOR};404 textout(handle,2+dx,row+dy,wColors,1,"﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌");405 _sleep(100);406407 int i;408 for(i=row;i>1;i--)409 {410 delete_blocks(&m[i][1],MAPW-2,1,1,i);411 for(int j=1;j<MAPW-1;j++)412 m[i][j]=m[i-1][j];413 drawblocks(&m[i][1],MAPW-2,1,1,i,wColors,1);414 }415 for(i=1;i<MAPW-1;i++)416 m[1][i]=0;}417418419BOOL isavailable(int a[],int x,int y,int w,int h)420{421 for(int i=max(y,1);i<y+h;i++)422 for(int j=x;j<x+w;j++)423 if(map[i][j]&&a[w*(i-y)+j-x])424 return0;425 return1;426}427428第二个cpp:429#include "colorConsole.h"430431432HANDLE initiate()433{434 HANDLE hOutput;435 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);436 return hOutput;437}438BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString) 439{440 DWORD cWritten;441 BOOL fSuccess;442 COORD coord;443444 coord.X = x; // start at first cell445 coord.Y = y; // of first row446 fSuccess = WriteConsoleOutputCharacter(447 hOutput, // screen buffer handle448 lpszString, // pointer to source string449 lstrlen(lpszString), // length of string450 coord, // first cell to write to451 &cWritten); // actual number written452 if(! fSuccess)453 cout<<"error:WriteConsoleOutputCharacter"<<endl;454455456 for(;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors)457 {458 fSuccess = WriteConsoleOutputAttribute(459 hOutput, // screen buffer handle460 wColors, // pointer to source string 461 nColors, // length of string 462 coord, // first cell to write to 463 &cWritten); // actual number written 464 }465 if(! fSuccess)466 cout<<"error:WriteConsoleOutputAttribute"<<endl; 467468 return0;469}。

简单俄罗斯方块程序代码

简单俄罗斯方块程序代码

简单俄罗斯方块程序代码俄罗斯方块是一款非常经典的游戏,它需要玩家通过操作方块来消除行,随着游戏的深入,难度越来越大。

我们可以用Python语言来编写俄罗斯方块程序,它可以让我们体验到这个经典游戏的乐趣。

首先,我们需要导入相关的模块:```pythonimport pygameimport random```其中,pygame模块可以让我们创建图形化界面,random模块可以用于生成随机数,方便我们随机生成方块。

接下来,我们需要定义一些常量和变量:```python# 定义常量WIDTH = 480HEIGHT = 640CELL_SIZE = 30# 定义变量board = [[0] * 10 for i in range(20)]score = 0ticks = 0fall_speed = 60next_block = random.randint(0, 6)block_pos = (0, 3)current_block = None```这里定义了几个常量:游戏窗口的宽度和高度,单元格的大小。

同时,我们还需要一个二维数组board来表示游戏画面上的格子状态,score来表示当前得分,ticks表示已经落下的方块数量,fall_speed表示方块下落的速度,next_block表示下一个方块的类型,block_pos表示当前方块的位置,current_block则表示当前正在下落的方块。

接下来,我们需要定义一些函数来实现游戏的各种功能。

首先是绘制游戏画面的函数:```pythondef draw_game():screen.fill((0, 0, 0))# 绘制已经落下的方块for i in range(20):for j in range(10):if board[i][j] != 0:pygame.draw.rect(screen, (255, 255, 255),(j * CELL_SIZE, i * CELL_SIZE, CELL_SIZE, CELL_SIZE))# 绘制正在下落的方块if current_block:for i in range(4):for j in range(4):if current_block[i][j] != 0:pygame.draw.rect(screen, (255, 255, 255),((block_pos[1] + j) * CELL_SIZE, (block_pos[0] + i) * CELL_SIZE, CELL_SIZE, CELL_SIZE))# 绘制下一个方块draw_next_block()# 绘制得分font = pygame.font.SysFont('SimHei', 20)text = font.render('得分:%d' % score, True, (255, 255, 255))screen.blit(text, (10, 10))pygame.display.flip()```这个函数会首先清空画面,然后遍历board数组,绘制已经落下的方块。

JS版《俄罗斯方块》游戏原创代码

JS版《俄罗斯方块》游戏原创代码
window.BGCOLOR = "#FFFFFF"; // 单元格背景色
window.BORDER_COLOR = "#000000"; // 单元格边框颜色
window.GAME = null; // 游戏对象
// 方块组合产生的矩阵(共7种组合)
window.TYPE = [
[[0, 0], [0, 1], [0, 2], [0, 3]], // ━
window.CELL = 20; // 每个单元格像素大小
window.BORDER = 1; // 单元格边框大小
window.ROWS = 20; // 最多有几行单元格
window.COLS = 12; // 最多有几列单元格
window.INTERVAL = 500; // 间隔时间
[[0, 0], [0, 1], [1, 1], [1, 2]], // ┏┛
[[1, 0], [1, 1], [0, 1], [0, 2]] // ┗┓
];
// 获取浏览器类型
window.getBrowser = function (){
var browserName = erAgent.toLowerCase();
var right_width = this.span * 4 + 60;
var top = (document.documentElement.clientHeight - height) / 2;
var divs = this.getChildByTag(this.container, "div");
this.container.style.marginTop = top + "px";

俄罗斯方块c语言源代码

俄罗斯方块c语言源代码

俄罗斯方块c语言源代码俄罗斯方块游戏是一款非常受欢迎的游戏,使用C语言编写源代码实现其功能。

下面是俄罗斯方块游戏的C语言源代码:1. 创建窗口函数: // 创建窗口函数 void CreateWindow(int width, int height) { // 使用SDL库创建窗口 SDL_Init(SDL_INIT_EVERYTHING); SDL_Window *window = SDL_CreateWindow("Tetris",SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,width, height, 0); // 设置刷新时间SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1"); }2. 创建游戏函数: // 创建游戏函数 void CreateGame() { // 设置随机数种子srand((unsigned int)time(NULL)); // 加载游戏资源 LoadResources(); // 初始化游戏数据InitGameData(); // 初始化游戏界面InitGameUI(); // 开始游戏循环 GameLoop(); // 清理游戏资源 CleanupGame(); }3. 绘图函数: // 绘图函数 void Draw(int x, inty, Color color) { // 使用SDL库在指定位置绘制指定颜色的矩形 SDL_Rect rect; rect.x = x;rect.y = y; rect.w = BLOCK_SIZE; rect.h = BLOCK_SIZE; SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a);SDL_RenderFillRect(renderer, &rect); }。

俄罗斯方块源代码

俄罗斯方块源代码

2**************************************************************************** ***/3/* Define to prevent recursive inclusion-------------------------------------*/4#ifndef _HEAD_H_5#define _HEAD_H_67/* Includes------------------------------------------------------------------*/8#include <graphics.h>9#include <stdio.h>10#include <conio.h>11#include <stdlib.h>12#include <time.h>1314/* Macro---------------------------------------------------------------------*/15#define TRUE 116#define FALSE 01718//GUI游戏界面相关的参数19#define GUI_WALL_SQUARE_WIDTH 10 //外围围墙小方格的宽度(单位:像素)20#define GUI_xWALL_SQUARE_NUM 30 //横向(x轴方向)围墙小方格的数量(必须是偶数)21#define GUI_yWALL_SQUARE_NUM 46 //纵向(y轴方向)围墙小方格的数量(必须是偶数)22#define GUI_WALL_WIDTH_PIX (GUI_WALL_SQUARE_WIDTH*GUI_xWALL_SQUARE_NUM) 23#define GUI_WALL_HIGH_PIX (GUI_WALL_SQUARE_WIDTH*GUI_yWALL_SQUARE_NUM) 2425#define WINDOW_WIDTH 480 //窗口的宽度26#define WINDOW_HIGH GUI_WALL_HIGH_PIX //窗口高度2728//俄罗斯方块相关的参数29//移动的方向30#define DIRECT_UP 331#define DIRECT_DOWN 232#define DIRECT_LEFT -133#define DIRECT_RIGHT 13435//每一个小方块的大小(是围墙小方格宽度的2倍)36#define ROCK_SQUARE_WIDTH (2*GUI_WALL_SQUARE_WIDTH)37//横向能容纳小方格的数量38#define X_ROCK_SQUARE_NUM ((GUI_xWALL_SQUARE_NUM-2)/2)39//纵向能容纳小方格的数量40#define Y_ROCK_SQUARE_NUM ((GUI_yWALL_SQUARE_NUM-2)/2)42/* Exported types------------------------------------------------------------*/43typedef int BOOL ; //布尔值类型4445/*数据结构-线性表(结构体数组)*/46typedef struct ROCK47{48//用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)49 unsigned int rockShapeBits ;50int nextRockIndex ; //下一个方块,在数组中的下标51} RockType ;5253//方块在图形窗口中的位置(即定位4*4大块的左上角坐标)54typedef struct LOCATE55{56int left ;57int top ;58} RockLocation_t ;5960/* Function prototypes-------------------------------------------------------*/61//源文件play.c中62void PlayGame(void) ;6364//源文件init.c中65int InitProcParameters(void) ;6667//源文件GUI.c中68void DrawRock(int, const struct LOCATE *, BOOL) ;69void DrawGameGUI(void) ;70void UpdataScore(void) ;71void UpdataGrade(int) ;7273#endif /* _HEAD_H_ */7475/*********************** (C) COPYRIGHT 2013 yang_yulei *********END OF FILE****/下面是源文件main.cpp[cpp]view plain copyprint?76/************************ (C) COPYRIGHT 2013 yang_yulei************************77* File Name : main.cpp78* Author : yang_yulei79* Date First Issued : 1/16/201280* Description : 开发环境 VC++ 6.0 含EasyX图形库() 81* 俄罗斯方块82*83*84**************************************************************************** ****85* History:86* 1/16/2012 : V0.187* 12/18/2013 : V0.288**************************************************************************** ****89*90**************************************************************************** ***/91/* Includes------------------------------------------------------------------*/92#include "head.h"93#include <windows.h>94#include <dos.h>9596/* Typedef-------------------------------------------------------------------*/97/* Variables-----------------------------------------------------------------*/98//全局变量-游戏板的状态描述(即表示当前界面哪些位置有方块)99//0表示没有,1表示有(多加了两行和两列,形成一个围墙,便于判断方块是否能够移动)100char g_gameBoard[Y_ROCK_SQUARE_NUM+2][X_ROCK_SQUARE_NUM+2] = {0} ;101//统计分数102int g_score = 0 ;103//等级104int g_grade = 0 ;105106int g_rockTypeNum = 0 ; //共有多少种俄罗斯方块107RockType rockArray[50] = {(0,0)} ;108109/*************************************************************************** ****110* Function Name : main111* Description : Main program112* Input : None113* Output : None114* Return : None115**************************************************************************** ***/116int117main(void)118{119//画出游戏界面120 initgraph(WINDOW_WIDTH, WINDOW_HIGH) ; //初始化图形窗口121 cleardevice() ;122 DrawGameGUI() ;123124//使用 API 函数修改窗口名称125HWND hWnd = GetHWnd();126 SetWindowText(hWnd, "俄罗斯方块");127128//初始化参数129 InitProcParameters() ;130131//游戏过程132 PlayGame() ;133134 closegraph() ;135return 0 ;136}下面是源文件init.cpp---游戏运行前初始化的一些方法[cpp]view plain copyprint?137/************************ (C) COPYRIGHT 2013 yang_yulei************************138* File Name : init.cpp139* Author : yang_yulei140* Date First Issued : 12/18/2013141* Description :142*143**************************************************************************** ****144*145****************************************************************************146/* Includes------------------------------------------------------------------*/147#include "head.h"148149/* Variables-----------------------------------------------------------------*/150extern char g_gameBoard[][X_ROCK_SQUARE_NUM+2] ;151extern int g_rockTypeNum ;152extern RockType rockArray[] ;153154/* Function prototypes-------------------------------------------------------*/155static int ReadRockShape(void) ;156static unsigned int ShapeStr2uInt(char* const);157158/*************************************************************************** ****159* Function Name : InitProcParameters160* Description : 在正式开始运行游戏前,初始化一些参数:g_gameBoard161从配置文件中读取系统中俄罗斯方块的形状162* Be called : main163* Input : None164* Output : g_gameBoard rockArray165* Return : None166**************************************************************************** ***/167//初始化程序参数168int169InitProcParameters(void)170{171int i ;172173//初始化游戏板(把这个二维数组的四周置1,当作围墙,用于判断边界)174for (i = 0; i < X_ROCK_SQUARE_NUM+2; i++)175 {176 g_gameBoard[0][i] = 1 ;177 g_gameBoard[Y_ROCK_SQUARE_NUM+1][i]= 1 ;178 }179for (i = 0; i < Y_ROCK_SQUARE_NUM+2; i++)180 {181 g_gameBoard[i][0] = 1 ;182 g_gameBoard[i][X_ROCK_SQUARE_NUM+1]= 1 ;183 }185//从配置文件中读取游戏中所有方块的形状点阵186 ReadRockShape() ;187188return 0 ;189}190191/*************************************************************************** ****192* Function Name : ReadRockShape193* Description : 从配置文件中读取系统中俄罗斯方块的形状把它记录在rockArray中194* Be called : InitProcParameters195* Input : rockshape.ini196* Output : rockArray197* Return : 成功返回0 失败返回1198**************************************************************************** ***/199int200ReadRockShape(void)201{202FILE* fp ;203int i = 0 ;204int len = 0 ;205int rockArrayIdx = 0 ;206int shapeNumPerRock = 0 ; //一种方块的形态数目(用于计算方块的nextRockIndex) 207208char rdBuf[128] ;209char rockShapeBitsStr[128] = {0};210211 unsigned int shapeBits = 0 ;212213 g_rockTypeNum = 0 ;214215//打开配置文件从中读取方块的形状216 fp = fopen(".\\rockshape.ini", "r") ;217if (fp == NULL)218 {219 perror("open file error!\n") ;220return 1 ;221 }222223while (fgets(rdBuf, 128, fp) != NULL)224 {225 len = strlen(rdBuf) ;226 rdBuf[len-1] = '\0' ;227228switch (rdBuf[0])229 {230case'@': case'#':231 strcat(rockShapeBitsStr, rdBuf) ;232break ;233234case 0 : //一个方块读取结束235 shapeBits = ShapeStr2uInt(rockShapeBitsStr) ;236 rockShapeBitsStr[0] = 0 ;237 shapeNumPerRock++ ;238 rockArray[rockArrayIdx].rockShapeBits = shapeBits ;239 rockArray[rockArrayIdx].nextRockIndex = rockArrayIdx + 1 ;240 rockArrayIdx++ ;241 g_rockTypeNum++ ; //记录方块数量的全局变量+1242break ;243244case'-'://一种方块读取结束(更新其nextRockIndex值)245 rockArray[rockArrayIdx-1].nextRockIndex = rockArrayIdx - shapeNumPerRock ;246 shapeNumPerRock = 0 ;247break ;248249default :250break ;251 }252 }//while()253254return 0 ;255}256257/*************************************************************************** ****258* Function Name : ShapeStr2uInt259* Description : 把配置文件中的描述方块形状的字符串转化为 unsigned int型260* Be called :261* Input : shapeStr 描述方块形状的字符串(从文件中读取的)262* Output : None263* Return : unsigned int型的方块形状点阵(用其低16位表示)264**************************************************************************** ***/265unsigned int266ShapeStr2uInt(char* const shapeStr)268 unsigned int shapeBitsRet = 0 ;269char* p = shapeStr ;270271for (p += 15; p >= shapeStr; p--)272 {273if (*p == '@')274 {275 shapeBitsRet |= ((unsigned int)1 << (&shapeStr[15]-p)) ;276 }277 }278279return shapeBitsRet ;280}下面是源文件GUI.cpp---一些关于在界面上画出界面的一些方法[cpp]view plain copyprint?281/************************ (C) COPYRIGHT 2013 yang_yulei************************282* File Name : GUI.cpp283* Author : yang_yulei284* Date First Issued : 12/18/2013285* Description :286*287**************************************************************************** ****288*289**************************************************************************** ***/290/* Includes------------------------------------------------------------------*/291#include "head.h"292293/* Variables-----------------------------------------------------------------*/294//预览区位置295RockLocation_t previewLocation ={GUI_WALL_SQUARE_WIDTH*GUI_xWALL_SQUARE_NUM+70, 50} ;296297extern RockType rockArray[] ;299/*******************************************************************************300* Function Name : DrawRock301* Description : 在游戏区画出编号为rockIndex的方块302* Be called : PlayGame()303* Input : rockIndex :304 currentLocatePtr: 此方块的位置305 displayed : 此方块是否显示306* Output : None307* Return : None308*******************************************************************************/309void310DrawRock(int rockIndex, const struct LOCATE * currentLocatePtr, BOOL displayed) 311{312int i ;313int mask ;314int rockX ; //俄罗斯方块的4*4模型的左上角点x轴的坐标315int rockY ; //俄罗斯方块的4*4模型的左上角点y轴的坐标316int spaceFlag ; //占位标记(用于g_gameBoard,1表示某处有方块 0表示此处无方块) 317int color ; //画出的方块的颜色318319//若此方块是用于显示的,则设置其颜色为白色,其占位标记设为1320//否则设置其颜色为黑色(背景色),占位标记设为0321 displayed ? (color = WHITE,spaceFlag = 1)322 : (color = BLACK,spaceFlag = 0) ;323324 setcolor(color) ; //设置画笔颜色325 setlinestyle(PS_SOLID, NULL, 2) ; //设置线形为1像素的实线326 rockX = currentLocatePtr->left ;327 rockY = currentLocatePtr->top ;328329//逐位扫描由unsigned int的低2字节330//16个位组成的俄罗斯方块形状点阵(其代表4*4的方块形状)331 mask = (unsigned int)1 << 15 ;332for (i=1; i<=16; i++)333 {334//与掩码相与为1的即为方块上的点335if ((rockArray[rockIndex].rockShapeBits & mask) != 0)336 {337//在屏幕上画出此方块338 rectangle(rockX+2,339 rockY+2,340 rockX+ROCK_SQUARE_WIDTH-2,341 rockY+ROCK_SQUARE_WIDTH-2) ;342 }343344//每4次换行转到下一行继续画345 i%4 == 0 ? (rockY += ROCK_SQUARE_WIDTH, rockX = currentLocatePtr->left) 346 : rockX += ROCK_SQUARE_WIDTH ;347348 mask >>= 1 ;349 }350}351352/*******************************************************************************353* Function Name : DrawGameGUI354* Description : 画出游戏界面355* Be called : main()356* Input : None357* Output : None358* Return : None359*******************************************************************************/360void361DrawGameGUI(void)362{363int i = 0 ;364int wallHigh = GUI_yWALL_SQUARE_NUM * GUI_WALL_SQUARE_WIDTH ;//围墙的高度(像素)365366 setcolor(RED) ; //设置围墙的颜色367 setlinestyle(PS_SOLID, NULL, 0) ; //设置围墙方格的线形(1像素的实线)368369//画出围墙(画矩形是先确定左上顶点的坐标,再确定右下顶点坐标)370//先画出上下墙371for (i = GUI_WALL_SQUARE_WIDTH;372 i <= GUI_WALL_WIDTH_PIX;373 i += GUI_WALL_SQUARE_WIDTH)374 {375 rectangle(i-GUI_WALL_SQUARE_WIDTH,376 0,377 i,378 GUI_WALL_SQUARE_WIDTH) ; //上墙379380 rectangle(i-GUI_WALL_SQUARE_WIDTH,381 wallHigh-GUI_WALL_SQUARE_WIDTH,382 i,383 wallHigh) ; //下墙384 }385386//再画出左右墙387for (i = 2*GUI_WALL_SQUARE_WIDTH;388 i <= wallHigh-GUI_WALL_SQUARE_WIDTH;389 i += GUI_WALL_SQUARE_WIDTH)390 {391 rectangle(0,392 i-GUI_WALL_SQUARE_WIDTH,393 GUI_WALL_SQUARE_WIDTH,394 i) ; //左墙395396 rectangle(GUI_WALL_WIDTH_PIX-GUI_WALL_SQUARE_WIDTH,397 i-GUI_WALL_SQUARE_WIDTH,398 GUI_WALL_WIDTH_PIX,399 i) ; //右墙400 }401402//画分隔线403 setcolor(WHITE) ; //设置画笔颜色404 setlinestyle(PS_DASH, NULL, 2) ; //设置线形为2像素的虚线405 line(GUI_WALL_WIDTH_PIX+20,0,GUI_WALL_WIDTH_PIX+20,wallHigh) ; //在偏移右围墙的20处画线406407//画右边统计分数及版权信息栏408//先设置字体409 LOGFONT f ; //定义字体属性结构体410 getfont(&f) ; //获得当前字体411 f.lfHeight = 18 ; //设置字体高度为 38(包含行距)412 strcpy(f.lfFaceName, "黑体") ; //设置字体为“黑体”413 f.lfQuality = ANTIALIASED_QUALITY ; //设置输出效果为抗锯齿414 setfont(&f) ; //设置字体样式415416//1,显示预览417 outtextxy(GUI_WALL_WIDTH_PIX+80 , 20 , "预览") ;418//2,显示等级栏419 outtextxy(GUI_WALL_WIDTH_PIX+80 , 140 , "等级") ;420//3,显示得分栏421 outtextxy(GUI_WALL_WIDTH_PIX+80 , 190 , "得分") ;422423//4,显示操作说明424 outtextxy(GUI_WALL_WIDTH_PIX+65 , 255 , "操作说明") ;425 getfont(&f) ;426 strcpy(f.lfFaceName, "宋体") ;427 f.lfHeight = 15 ;428 setfont(&f) ;429 outtextxy(GUI_WALL_WIDTH_PIX+45 , 290 , "w.a.s.d控制方向") ;430 outtextxy(GUI_WALL_WIDTH_PIX+45 , 313 , "回车键暂停") ;431 outtextxy(GUI_WALL_WIDTH_PIX+45 , 336 , "空格键快速下落") ;432433//5.版权信息434 line(GUI_WALL_WIDTH_PIX+20 , wallHigh-65 , WINDOW_WIDTH , wallHigh-65) ; 435 outtextxy(GUI_WALL_WIDTH_PIX+40 , wallHigh-50 , " 杨溢之作品") ;436 outtextxy(GUI_WALL_WIDTH_PIX+40 , wallHigh-30 , " QQ:702080167") ;437438//显示等级,得分信息439 setcolor(RED) ;440 outtextxy(GUI_WALL_WIDTH_PIX+90 , 163 , "1") ;441 outtextxy(GUI_WALL_WIDTH_PIX+90 , 223 , "0") ;442}443444/*************************************************************************** ****445* Function Name : UpdataScore446* Description : 增加一次得分,并把游戏界面的得分区显示更新447* Be called : ProcessFullRow()448* Input : None449* Output : None450* Return : None451**************************************************************************** ***/452void453UpdataScore(void)454{455char scoreStr[5] ; //用字符串的形式存储得分456extern int g_score ;457extern int g_grade ;458459//分数的增长的单位是10460 g_score += 10 ;461//得分是100的倍数,则等级加1 (等级在5级以上的就保持不变)462if (g_score == (g_score/100)*100 && g_grade < 5)463 UpdataGrade(++g_grade) ;464465//删除原先信息466 setfillstyle(BLACK) ;467 bar(GUI_WALL_WIDTH_PIX+90,220,GUI_WALL_WIDTH_PIX+99,229) ;468469//显示信息470 setcolor(RED) ;471 sprintf(scoreStr , "%d" , g_score) ;472 outtextxy(GUI_WALL_WIDTH_PIX+90 , 223 , scoreStr) ;473}474475/*************************************************************************** ****476* Function Name : UpdataGrade477* Description : 增加一次等级,并把游戏界面的等级区显示更新478* Be called :479* Input : grade :新的等级值480* Output : None481* Return : None482**************************************************************************** ***/483void484UpdataGrade(int grade)485{486char gradeStr[5] ;487488//删除原先信息489 setfillstyle(BLACK) ;490 bar(GUI_WALL_WIDTH_PIX+90,160,GUI_WALL_WIDTH_PIX+99,169) ;491492//显示信息493 setcolor(RED) ;494 sprintf(gradeStr , "%d" , grade) ;495 outtextxy(GUI_WALL_WIDTH_PIX+90 , 163 , gradeStr) ;496}下面是源文件play.cpp---控制游戏的重要方法[cpp]view plain copyprint?497/************************ (C) COPYRIGHT 2013 yang_yulei************************498* File Name : play.cpp499* Author : yang_yulei500* Date First Issued : 12/18/2013501* Description :502*503**************************************************************************** ****504*505**************************************************************************** ***/506/* Includes------------------------------------------------------------------*/507#include "head.h"508509/* Variables-----------------------------------------------------------------*/510extern char g_gameBoard[][X_ROCK_SQUARE_NUM+2] ;511extern int g_rockTypeNum ;512extern RockType rockArray[] ;513514/* Function prototypes-------------------------------------------------------*/515static BOOL MoveAble(int, const struct LOCATE *, int) ;516static void SetOccupyFlag(int, const struct LOCATE *) ;517static void ProcessFullRow(void) ;518static BOOL isGameOver() ;519static void ProccessUserHit(int, int*, struct LOCATE*) ;520static void FastFall(int, struct LOCATE *, struct LOCATE *) ;521static void DelFullRow(int f_row) ;522523/*************************************************************************** ****524* Function Name : PlayGame525* Description : 此程序的主要设计逻辑526* Be called : main527* Input : None528* Output : None529* Return : None530**************************************************************************** ***/531void532PlayGame(void)533{534int userHitChar ; //用户敲击键盘的字符535int currentRockIndex ; //当前方块在rockArray数组中下标536int nextRockIndex ; //准备的下个方块的下标537BOOL moveAbled = FALSE ;//记录方块能否落下538DWORD oldtime = 0;539extern int g_grade ;540541//当前方块位置542 RockLocation_t currentRockLocation ;543//初始方块位置(由当中开始下落)544 RockLocation_t initRockLocation ={(GUI_xWALL_SQUARE_NUM/2-4)*GUI_WALL_SQUARE_WIDTH,545 GUI_WALL_SQUARE_WIDTH};546//预览区位置547extern RockLocation_t previewLocation ;548549//为第一次下落,初始化参数550//随机选择当前的俄罗斯方块形状和下一个俄罗斯方块形状551 srand(time(NULL)) ;552 currentRockIndex = rand()%g_rockTypeNum ;553 nextRockIndex = rand()%g_rockTypeNum ;554 currentRockLocation.left = initRockLocation.left ;555 currentRockLocation.top = initRockLocation.top ;556557while(1)558 {559 DrawRock(currentRockIndex, ¤tRockLocation, TRUE) ;560 FlushBatchDraw(); //用批绘图功能,可以消除闪烁561562//判断能否下落563 moveAbled = MoveAble(currentRockIndex, ¤tRockLocation, DIRECT_DOWN) ; 564565//如果不能下落则生成新的方块566if (!moveAbled)567 {568//设置占位符(此时方块已落定)569 SetOccupyFlag(currentRockIndex, ¤tRockLocation) ;570//擦除预览571 DrawRock( nextRockIndex, &previewLocation, FALSE) ;572//生成新的方块573 currentRockIndex = nextRockIndex ;574 nextRockIndex = rand()%g_rockTypeNum ;575 currentRockLocation.left = initRockLocation.left ;576 currentRockLocation.top = initRockLocation.top ;577 }578579//显示预览580 DrawRock(nextRockIndex, &previewLocation, TRUE) ;581582//如果超时(且能下落),自动下落一格583// 这个超时时间400-80*g_grade 是本人根据实验自己得出的584// 一个速度比较适中的一个公式(g_grade不会大于等于5)585DWORD newtime = GetTickCount();586if (newtime - oldtime >= (unsigned int)(400-80*g_grade) && moveAbled == TRUE)587 {588 oldtime = newtime ;589 DrawRock(currentRockIndex, ¤tRockLocation, FALSE) ; //擦除原先位置590 currentRockLocation.top += ROCK_SQUARE_WIDTH ; //下落一格591 }592593//根据当前游戏板的状况判断是否满行,并进行满行处理594 ProcessFullRow() ;595596//判断是否游戏结束597if (isGameOver())598 {599 MessageBox( NULL,"游戏结束", "GAME OVER", MB_OK ) ;600 exit(0) ;601 }602603//测试键盘是否被敲击604if (kbhit())605 {606 userHitChar = getch() ;607 ProccessUserHit(userHitChar, ¤tRockIndex, ¤tRockLocation) ;608 }609610 Sleep(20) ; //降低CPU使用率611 }//结束外层while(1)612613}614615/*************************************************************************** ****616* Function Name : ProccessUserHit617* Description : 处理用户敲击键盘618* Be called : PlayGame()619* Input : userHitChar 用户敲击键盘的ASCII码620 rockIndexPtr 当前俄罗斯方块在rockArray中的下标621 rockLocationPtr 当前方块在游戏界面中的位置622623* Output : rockIndexPtr 响应用户敲击后新方块的下标624 rockLocationPtr 响应用户敲击后新方块的位置625* Return : None626**************************************************************************** ***/627void628ProccessUserHit(int userHitChar, int* rockIndexPtr, struct LOCATE* rockLocationPtr)629{630switch (userHitChar)631 {632case'w' : case'W' : //“上”键633//检查是否能改变方块形状634if (MoveAble(rockArray[*rockIndexPtr].nextRockIndex, rockLocationPtr, DIRECT_UP))635 {636 DrawRock(*rockIndexPtr, rockLocationPtr, FALSE) ;637 *rockIndexPtr = rockArray[*rockIndexPtr].nextRockIndex ;638 }639break ;640641case's' : case'S' : //“下”键642 DrawRock(*rockIndexPtr, rockLocationPtr, FALSE) ; //擦除原先位置643 rockLocationPtr->top += ROCK_SQUARE_WIDTH ;644break ;645646case'a' : case'A' : //“左”键647if (MoveAble(*rockIndexPtr, rockLocationPtr, DIRECT_LEFT))648 {649 DrawRock(*rockIndexPtr, rockLocationPtr, FALSE) ;650 rockLocationPtr->left -= ROCK_SQUARE_WIDTH ;651 }652break ;653654case'd' : case'D' : //“右”键655if (MoveAble(*rockIndexPtr, rockLocationPtr, DIRECT_RIGHT))656 {657 DrawRock(*rockIndexPtr, rockLocationPtr, FALSE) ;658 rockLocationPtr->left += ROCK_SQUARE_WIDTH ;659 }660break ;661662case' ' : //空格(快速下落)663 DrawRock(*rockIndexPtr, rockLocationPtr, FALSE) ;664 FastFall(*rockIndexPtr, rockLocationPtr, rockLocationPtr) ;665break ;666667case 13 : //回车键(暂停)668while(1)669 { userHitChar = getch() ;670if (userHitChar==13)671break ;672 }673break ;674675default :676break ;677 }678679}680681/*******************************************************************************682* Function Name : MoveAble683* Description : 判断编号为rockIndex 在位置currentLocatePtr的方块684能否向direction移动685* Be called :686* Input : None687* Output : None688* Return : TRUE 可以移动689 FALSE 不可以移动690*******************************************************************************/691BOOL692MoveAble(int rockIndex, const struct LOCATE* currentLocatePtr, int f_direction) 693{694int i ;695int mask ;696int rockX ;697int rockY ;698699 rockX = currentLocatePtr->left ;700 rockY = currentLocatePtr->top ;701702 mask = (unsigned int)1 << 15 ;703for (i=1; i<=16; i++)704 {705//与掩码相与为1的即为方块上的点706if ((rockArray[rockIndex].rockShapeBits & mask) != 0)707 {708//判断能否移动(即扫描即将移动的位置是否与设置的围墙有重叠)709//若是向上(即翻滚变形)710if( f_direction == DIRECT_UP )711 {712//因为此情况下传入的是下一个方块的形状,故我们直接判断此方块的位置是否已经被占713if(g_gameBoard[(rockY-GUI_WALL_SQUARE_WIDTH)/ROCK_SQUARE_WIDTH+1]714[(rockX-GUI_WALL_SQUARE_WIDTH)/ROCK_SQUARE_WIDTH+1] == 1)715return FALSE ;716 }717//如果是向下方向移动718else if( f_direction == DIRECT_DOWN )719 {720if(g_gameBoard[(rockY-GUI_WALL_SQUARE_WIDTH)/ROCK_SQUARE_WIDTH+2]721[(rockX-GUI_WALL_SQUARE_WIDTH)/ROCK_SQUARE_WIDTH+1] ==1)722return FALSE ;723 }724else//如果是左右方向移动725 { //f_direction的DIRECT_LEFT为-1,DIRECT_RIGHT为1,故直接加f_direction即可判断。

俄罗斯方块源代码自用可运行

俄罗斯方块源代码自用可运行

#include<easyx.h>#include<conio.h>#include<time.h>/////////////////////////////////////////////// 定义常量、枚举量、结构体、全局变量/////////////////////////////////////////////#define WIDTH 10// 游戏区宽度#define HEIGHT 22// 游戏区高度#define UNIT 20// 每个游戏区单位的实际像素// 定义操作类型enum CMD{CMD_ROTATE,// 方块旋转CMD_LEFT, CMD_RIGHT, CMD_DOWN,// 方块左、右、下移动CMD_SINK,// 方块沉底CMD_QUIT // 退出游戏};// 定义绘制方块的方法enum DRAW{SHOW,// 显示方块CLEAR,// 擦除方块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;// 方块 IDchar x, y;// 方块在游戏区中的坐标byte dir :2;// 方向} g_CurBlock, g_NextBlock;// 定义游戏区BYTE g_World[WIDTH][HEIGHT]={0};/////////////////////////////////////////////// 函数声明/////////////////////////////////////////////void Init();// 初始化游戏void Quit();// 退出游戏void NewGame();// 开始新游戏void GameOver();// 结束游戏CMD GetCmd();// 获取控制命令void DispatchCmd(CMD _cmd);// 分发控制命令void NewBlock();// 生成新的方块bool CheckBlock(BLOCKINFO _block);// 检测指定方块是否可以放下void DrawUnit(int x,int y, COLORREF c, DRAW _draw);// 画单元方块void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW);// 画方块void OnRotate();// 旋转方块void OnLeft();// 左移方块void OnRight();// 右移方块void OnDown();// 下移方块void OnSink();// 沉底方块/////////////////////////////////////////////// 函数定义/////////////////////////////////////////////// 主函数void main(){Init();CMD c;while(true){c = GetCmd();DispatchCmd(c);// 按退出时,显示对话框咨询用户是否退出if(c == CMD_QUIT){HWND wnd = GetHWnd();if(MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION)== IDOK)Quit();}}}// 初始化游戏void Init(){initgraph(640,480);srand((unsigned)time(NULL));setbkmode(TRANSPARENT);// 设置图案填充的背景色为透明// 显示操作说明settextstyle(14,0, _T("宋体"));outtextxy(20,330, _T("操作说明"));outtextxy(20,350, _T("上:旋转"));outtextxy(20,370, _T("左:左移"));outtextxy(20,390, _T("右:右移"));outtextxy(20,410, _T("下:下移"));outtextxy(20,430, _T("空格:沉底"));outtextxy(20,450, _T("ESC:退出"));// 设置坐标原点setorigin(220,20);// 绘制游戏区边界rectangle(-1,-1, WIDTH * UNIT, HEIGHT * UNIT);rectangle((WIDTH +1)* UNIT -1,-1,(WIDTH +5)* UNIT,4* UNIT);// 开始新游戏NewGame();}// 退出游戏void Quit(){closegraph();exit(0);}// 开始新游戏void NewGame(){// 清空游戏区setfillcolor(BLACK);solidrectangle(0,0, WIDTH * UNIT -1, HEIGHT * UNIT -1);ZeroMemory(g_World, WIDTH * HEIGHT);// 生成下一个方块g_NextBlock.id = rand()%7;g_NextBlock.dir = rand()%4;g_NextBlock.x = WIDTH +1;g_NextBlock.y = HEIGHT -1;// 获取新方块NewBlock();}// 结束游戏void GameOver(){HWND wnd = GetHWnd();if(MessageBox(wnd, _T("游戏结束。

俄罗斯方块游戏(HTML游戏使用JavaScript开发)

俄罗斯方块游戏(HTML游戏使用JavaScript开发)

俄罗斯方块游戏(HTML游戏使用JavaScript开发)俄罗斯方块是一款经典的益智类游戏,深受广大玩家的喜爱。

本文将介绍一种使用JavaScript开发的网页版俄罗斯方块游戏。

1. 游戏概述俄罗斯方块游戏是由若干个不同形状的方块组成,玩家通过操控下落方块的移动和旋转来使它们在游戏界面中完整地拼接成一行或多行。

每当完成一行,该行将被消除并得分。

当方块堆积到达游戏界面的顶部时,游戏结束。

2. 开发环境为了实现网页版俄罗斯方块游戏,我们将使用HTML、CSS和JavaScript这三种基本的Web开发技术。

2.1 HTMLHTML(超文本标记语言)用于构建网页的结构和内容。

对于俄罗斯方块游戏,我们需要使用HTML来创建游戏界面、显示得分等。

2.2 CSSCSS(层叠样式表)用于设置网页的样式和布局。

我们可以使用CSS来美化游戏界面,使其更具吸引力和易读性。

2.3 JavaScriptJavaScript是一种用于开发动态网页和交互式元素的编程语言。

在开发俄罗斯方块游戏中,我们将使用JavaScript来实现游戏的逻辑和交互效果。

3. 游戏开发步骤3.1 创建游戏界面首先,我们需要在HTML中创建游戏界面的容器,用于显示下落方块和游戏得分等信息。

我们可以使用HTML的div元素来实现这一目标,并使用CSS来美化游戏界面。

3.2 定义方块的形状我们需要定义不同形状的方块。

通过使用JavaScript的数组和对象,我们可以将每个方块表示为一个包含一系列坐标的集合。

这些坐标定义了方块的位置和形状。

3.3 控制方块的移动和旋转在游戏中,玩家需要能够控制方块的移动和旋转。

我们可以使用JavaScript编写函数来实现这些操作。

通过监听键盘事件,我们可以实现方块的左右移动和快速下落,同时通过旋转方块的形状来适应不同的游戏情况。

3.4 检测碰撞和消行在游戏中,我们需要检测方块与其他方块或游戏界面边界的碰撞,以及当一行满格时进行消行操作并更新得分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
var tt_T1 = new Array(0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0); var tt_T2 = new Array(0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0); var tt_T3 = new Array(0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0); var tt_T4 = new Array(0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0);
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
if (document.all){ var n_width = 800; var n_height = 600; var n_left = Math.round( screen.width/2 ) - n_width/2; var n_top = Math.round( screen.height/2 ) - n_height/2; var n_IncStep = 20; var curBlcok,nextBlock; var arr_curBlock = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); var curX,curY; var speed=1; var maxspeed=9; var clr_per_line=18; var pause=0; var gameover=0; var colors = new Array("#999999","#0000FF","#80FFFF","#80FF80","#FFFF00","#FF8000","#F F00FF","#FF0000"); var cid; var ncid; var blocks = new Array("tt_O1","tt_T2","tt_Z1","tt_S1","tt_L1","tt_J1","tt_I2"); var bid; var killedlines=0;
function dimension2(row,col,num){ var i = row * num + col; return (this[i]);
} Array.prototype.getd = dimension2;
function ShowBlock(x,y,block_type,color){ for (var i=0;i<block_tbl.rows.length;i++){ for (var j=0;j<block_tbl.rows(i).cells.length;j++){ var d2 = i * 4 + j; if (block_type[d2]==1){ block_tbl.rows(i).cells(j).style.background = color; } else{ block_tbl.rows(i).cells(j).style.background = ""; } } } block_div.style.pixelLeft=x; block_div.style.pixelTop=y;
<HTML> <HEAD> <META NAME="Title" CONTENT="JScript Simple Tetris"> <META content="text/html; charset=gb2312" http-equiv=Content-Type> <TITLE>俄罗斯方块</TITLE> <style> body {margin:0;background:black;} td {height:20;width:20;} #block_div {position:absolute;z-index:1;width:80;} #table_div {position:absolute;z-index:0;widosition:absolute;z-index:2;font:48 system;color:red;} #title_div {position:absolute;left:326;top:7;font-size:9pt;color:white} #infobar_div {position:absolute;left:396;top:416;} #infobar2_div {position:absolute;left:396;top:480;font-size:9pt;color:white} #infobar2_div a{color:99ccff;font:system;text-decoration:none} </style>
var tt_Z1 = new Array(0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0); var tt_Z2 = new Array(0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0); var tt_Z3 = new Array(0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0); var tt_Z4 = new Array(0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0);
var tt_L1 = new Array(0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0); var tt_L2 = new Array(0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0); var tt_L3 = new Array(0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0); var tt_L4 = new Array(0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0);
var tt_S1 = new Array(0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0); var tt_S2 = new Array(0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0); var tt_S3 = new Array(0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0); var tt_S4 = new Array(0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0);
function Change(inc){ var type = curBlock.substr(0,4); var num = curBlock.substr(curBlock.length-1); num = parseInt(num) + inc; if (num>4||num<1) num -= 4*inc; type += num; eval("arr_tmp = " + type + ";"); if (CanMove(curX,curY,arr_tmp)){ curBlock = type; eval("arr_curBlock = " + curBlock + ";");
var tt_I1 = new Array(0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0); var tt_I2 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1); var tt_I3 = new Array(0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0); var tt_I4 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1);
var d2 = i * 4 + j; if (block_type[d2]==1){
obj_tabID.rows(i).cells(j).style.background = color; } else{
obj_tabID.rows(i).cells(j).style.background = ""; } } } obj_divID.style.pixelLeft=x; obj_divID.style.pixelTop=y; }
eval("ShowBlock(block_div.style.pixelLeft,block_div.style.pixelTop," + curBlock + ",colors[" + cid + "]);");
} }
function CanMove(x,y,block){ for (i=0;i<4;i++){ for (j=0;j<4;j++){ if
}
function ShowBlock1(x,y,block_type,color,obj_tabID,obj_divID){ for (var i=0;i<obj_tabID.rows.length;i++){ for (var j=0;j<obj_tabID.rows(i).cells.length;j++){
1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) } else alert("You need IE4+ to play Tetris!")
相关文档
最新文档