俄罗斯方块游戏(C语言)

合集下载

俄罗斯方块 C语言程序

俄罗斯方块 C语言程序

#include<stdio.h>#include<graphics.h>#include<conio.h>#include<time.h>#include<dos.h>#include<stdlib.h>#include<math.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bintBox_x[5],Box_y[5],Box_xy[15][10]={0},num,life=1,score,mx,my,key,x[5],y[5],size,g rade=0;int *buf;void Init();void my_ad_1();void my_ad_2();void my_ad_3();void play();void jiang();void De_B_xy();void Draw_Box();void Ad_Box_y();void Mi_Box_x();void Ad_Box_x();void ch_B_xy();void rebuild();void Draw_New();void close();void delay_n(int n);void main(){Init();my_ad_1();my_ad_2();my_ad_3();play();close();}void Init(){int driver=DETECT,mode;initgraph(&driver,&mode,"C:\\Program Files\\CYuYan\\bin");mx=getmaxx();my=getmaxy();setbkcolor(BLUE);size=imagesize(0,0,32,32);if(size!=-1)buf=malloc(size);getimage(0,0,32,32,buf);}void my_ad_1(){intch1[]={100,120,100,300,120,300,120,200,200,200,200,280,180,280,180,300,220,30 0,220,180,120,180,120,140,300,140,300,100,280,120,100,120},ch2[]={240,100,280,300,300,300,260,100,240,100},ch3[]={280,160,264,280,284,280,300,160,280,160},j1[]={300,120,340,160,360,160,320,100,300,120},j2[]={300,180,340,220,360,220,320,160,300,180},j3[]={300,300,340,300,380,220,360,220,300,300},j4[]={380,120,380,140,420,140,420,280,360,280,360,300,500,300,500,280,440,280, 440,140,480,140,480,120,380,120};settextjustify(CENTER_TEXT,CENTER_TEXT);settextstyle(TRIPLEX_FONT,HORIZ_DIR,5);setcolor(WHITE);sleep(2);outtextxy(320,200,"C Program Flash Creation");settextstyle(3,HORIZ_DIR,3);sleep(1);outtextxy(320,300,"Cheng Jiang,Electronic Class 1,Physic Department, GDUT");sleep(1);cleardevice();fillpoly(16,ch1);fillpoly(5,ch2);fillpoly(5,ch3);fillpoly(5,j1);fillpoly(5,j2);fillpoly(5,j3);fillpoly(12,j4);sleep(2);cleardevice();}void my_ad_2(){setfillstyle(SOLID_FILL,LIGHTBLUE);bar(0,0,150,my);bar(450,0,mx,my);setviewport(150,0,450,my,1);}void my_ad_3()int i,j;outtextxy(150,30,"Waitting...");setlinestyle(1,1,1);rectangle(0,60,450,90);setlinestyle(SOLID_LINE,1,THICK_WIDTH); jiang();for(i=0;i<10;i++){bar(30*i,60,30*(i+1),90);rectangle(30*i,60,30*(i+1),90);sleep(1);}clearviewport();outtextxy(150,240,"OK! Press [Enter]");getch();clearviewport();}void play(){int i,j;outtextxy(150,460,"grade:0 score: 0 ");while(1){randomize();num=random(19);De_B_xy();while(1){while(kbhit()){key=bioskey(0);Draw_Box();switch(key){case UP:getch();break;case DOWN:Ad_Box_y();break; case RIGHT:Ad_Box_x();break; case LEFT:Mi_Box_x();break; case ESC:close();break;default:ch_B_xy();break;}if(check()) break;}Draw_Box();if(check()) break;for(i=1;i<5;i++)Box_y[i]+=1;if(!kbhit())delay_n(10-grade);}rebuild();Draw_New();if(!life) break;}}void Draw_Box(){int i;for(i=1;i<5;i++)putimage(x[i]*30-1,30*y[i]-1,buf,COPY_PUT);if(!(y[1]&&y[2]&&y[3]&&y[0]))for(i=4;i<8;i++)putimage(30*i-1,0,buf,COPY_PUT);for(i=1;i<5;i++){x[i]=Box_x[i];y[i]=Box_y[i];bar(Box_x[i]*30, Box_y[i]*30, (Box_x[i]+1)*30, (Box_y[i]+1)*30);rectangle(Box_x[i]*30, Box_y[i]*30, (Box_x[i]+1)*30, (Box_y[i]+1)*30); }}void De_B_xy(){int i;switch(num){case 0: {Box_x[1]=Box_x[2]=Box_x[3]=Box_x[4]=0;Box_y[1]=0;Box_y[2]=1;Box_y[3]=2;Box_y[4]=3;} break;case 1: {Box_y[1]=Box_y[2]=Box_y[3]=Box_y[4]=0;Box_x[1]=0;Box_x[2]=1;Box_x[3]=2;Box_x[4]=3;} break;case 2: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=0;Box_x[4]=1;Box_y[1]=0;Box_y[2]=0; Box_y[3]=1;Box_y[4]=1;} break;case 3: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1;Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=1;} break;case 4: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2;Box_y[1]=2;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break;case 5: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1;Box_y[1]=1;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break;case 6: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=2;Box_y[4]=1;} break; case 7: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=1;Box_y[1]=0;Box_y[2]=1; Box_y[3]=1;Box_y[4]=2;} break; case 8: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=0; Box_y[3]=1;Box_y[4]=0;} break; case 9: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=1; Box_y[1]=1;Box_y[2]=2; Box_y[3]=0;Box_y[4]=1;} break; case 10:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break; case 11:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break; case 12:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=2;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=0;Box_y[4]=1;} break; case 13:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=0;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break; case 14:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=2; Box_y[1]=0;Box_y[2]=1; Box_y[3]=0;Box_y[4]=0;} break; case 15:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=2;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break; case 16:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=2;Box_x[4]=2; Box_y[1]=0;Box_y[2]=0; Box_y[3]=0;Box_y[4]=1;} break; case 17:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=0;} break; case 18:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=2; Box_y[1]=0;Box_y[2]=1; Box_y[3]=1;Box_y[4]=1;} break; }for(i=1;i<5;i++)Box_x[i]+=4;}int check(){int i,p=0;for(i=1;i<5;i++)if(Box_xy[Box_y[i]+1][Box_x[i]]||Box_y[i]>13) p=1;return(p);}void Ad_Box_y(){int i,p=1;for(i=1;i<5;i++)if(Box_xy[Box_y[i]+1][Box_x[i]]||Box_y[i]>13) p=0;if(p)for(i=1;i<5;i++)Box_y[i]+=1;}void Ad_Box_x(){int i,p=1;for(i=1;i<5;i++)if(Box_xy[Box_y[i]][ Box_x[i]+1]||Box_x[i]>8) p=0;if(p)for(i=1;i<5;i++)Box_x[i]+=1;}void Mi_Box_x(){int i,p=1;for(i=1;i<5;i++)if(Box_xy[Box_y[i]][ Box_x[i]-1]||Box_x[i]<1) p=0;if(p)for(i=1;i<5;i++)Box_x[i]-=1;}void ch_B_xy(){int i,j,t,maxx=Box_x[1],maxy=Box_y[1];for(i=2;i<5;i++){if(maxx<Box_x[i])maxx=Box_x[i];if(maxy<Box_y[i])maxy=Box_y[i];}switch(num){case 0:num=num+1;break;case 1:num=num-1;case 2: ;break;case 3:num=num+1;break;case 4:num=num+1;break;case 5:num=num+1;break;case 6:num=num-3;break;case 7:num=num+1;break;case 8:num=num-1;break;case 9:num=num+1;break;case 10:num=num-1;break;case 11:num=num+1;break;case 12:num=num+1;break;case 13:num=num+1;break;case 14:num=num-3;break;case 15:num=num+1;break;case 16:num=num+1;break;case 17:num=num+1;break;case 18:num=num-3;break;}De_B_xy();for(i=1;i<5;i++){Box_x[i]=Box_x[i]+maxx-Box_x[4]; Box_y[i]=Box_y[i]+maxy-2;}}void rebuild(){int i,j,p,t[4]={0},k=0;for(i=1;i<5;i++)Box_xy[Box_y[i]][Box_x[i]]=1;for(i=0;i<15;i++){p=1;for(j=0;j<10;j++)if(!Box_xy[i][j])p=0;if(p)t[k]=i;k++;score+=10*k;}}for(k=0;k<4;k++){if(t[k]){for(i=t[k];i>0;i--)for(j=0;j<10;j++)Box_xy[i][j]=Box_xy[i-1][j]; }}for(i=0;i<10;i++)if(Box_xy[0][i])life=0;setfillstyle(1,4);for(i=0;i<4;i++)if(t[i])bar(0,30*t[i],300,30*(t[i]+1)); setfillstyle(1,9);for(i=1;i<5;i++){x[i]=0;y[i]=0;}grade=(score-score%100)/100 ; delay(30000);void Draw_New(){int i,j;char text[20];clearviewport();for(i=0;i<15;i++)for(j=0;j<10;j++)if(Box_xy[i][j]){bar(30*j,30*i,30*j+30,30*i+30);rectangle(30*j,30*i,30*j+30,30*i+30);}sprintf(text,"grade: %d score: %d",grade,score); gotoxy(100,460);outtextxy(150,460,text);}void close(){int i,j;for(i=14;i>=0;i--){for(j=0;j<10;j++){bar(30*j,30*i,30*(j+1),30*(i+1));rectangle(30*j,30*i,30*(j+1),30*(i+1));}delay(20000);}clearviewport();jiang();outtextxy(150,60,"game over");getch();closegraph();}void delay_n( int n){int i;for(i=0;i<n;i++) delay(50000);}void jiang(){int jx=0,jy=4;for(jx=0;jx<3;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));bar(30*jx,30*(jy+3),30*(jx+1),30*(jy+4));rectangle(30*jx,30*(jy+3),30*(jx+1),30*(jy+4)); jy++;}jy=14;for(jx=0;jx<4;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));jy--;}jy=4;for(jx=4;jx<9;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1)); }jy=14;for(jx=3;jx<11;jx++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1)); }jx=6;for(jy=5;jy<15;jy++){bar(30*jx,30*jy,30*(jx+1),30*(jy+1));rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1)); }}。

俄罗斯方块 变形 c语言

俄罗斯方块 变形 c语言

俄罗斯方块变形c语言在C语言中实现俄罗斯方块游戏是一项复杂的任务,涉及到图形界面、游戏逻辑和事件处理等多个方面。

以下是一个简化版的俄罗斯方块游戏示例,使用字符在控制台中显示游戏界面。

c复制代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#define WIDTH 20#define HEIGHT 10typedef enum {BLOCK_EMPTY,BLOCK_I,BLOCK_J,BLOCK_L,BLOCK_O,BLOCK_S,BLOCK_Z} BlockType;typedef struct {BlockType type;int x;int y;} Block;Block board[WIDTH][HEIGHT];BlockType currentBlock = BLOCK_I;int rotation = 0;int x = WIDTH / 2;int y = HEIGHT - 1;void drawBoard() {for (int i = 0; i < WIDTH; i++) { for (int j = 0; j < HEIGHT; j++) { char ch = ' ';switch (board[i][j].type) {case BLOCK_EMPTY:ch = '.';break;case BLOCK_I:ch = 'I';break;case BLOCK_J:ch = 'J';break;case BLOCK_L:ch = 'L';break;case BLOCK_O:ch = 'O';break;case BLOCK_S:ch = 'S';break;case BLOCK_Z:ch = 'Z';break;}printf("%c", ch);}printf("\n");}}void updateBoard() {for (int i = 0; i < WIDTH; i++) {for (int j = 0; j < HEIGHT; j++) {if (board[i][j].type != BLOCK_EMPTY) {board[i][j].y--; // Move block down one row.} else { // Place new block.switch (currentBlock) { // Place based on current block type.case BLOCK_I: // Place full I-block.board[i][j].type = BLOCK_I; // Column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column j Y n Row Y j Columns n - j 1 -- i 1 i - i j Row i Row i - 1 i Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i - - - - - - - - - - - - - - -。

俄罗斯方块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); }。

c语言程序设计 俄罗斯方块

c语言程序设计 俄罗斯方块
{"0000200000"},
{"0000110000"},
{"0001001000"},
{"0010000100"},
{"0100000010"}}},
{{{"0000000000"}, //5
{"0000000000"},
{"1011001101"},
{"0101111010"}}},
{{{"0000000000"}, //16
{"0000000000"},
{"0000200000"},
{"0000000000"},
{"1010101010"},
{"0001001000"},
{"0010000100"},
{"0010200100"},
{"0001111000"},
{"0001001000"},
{"0001001000"}}},
{{{"0000000000"}, //6
{"0001201000"},
{"0001111000"},
{"0001111000"}}},
{{{"0000000000"}, //3
{"0000000000"},
{"0000000000"},

自己用C语言编写的俄罗斯方块小游戏 hello world级

自己用C语言编写的俄罗斯方块小游戏  hello world级
break;
default : return ;
}
}
void clear_small_screen()
{
int i,j;
int x,y;
for(i=0;i<SMALL_CUBSIZE;i++){
for(j=0;j<SMALL_CUBSIZE;j++){
for (x = X_SMALL_START+j*SMALL_UNIT; x <X_SMALL_START+SMALL_UNIT+j*SMALL_UNIT; x++)
break;
case 17:
for(i=0;i<3;i++)
small_cub[0][i]=1;
small_cub[1][1]=1;
break;
case 18:
for(i=0;i<3;i++)
small_cub[i][1]=1;
small_cub[1][0]=1;
break;
case 7:
for(i=0;i<3;i++)
small_cub[i][0]=1;
small_cub[0][1]=1;
break;
case 8:
for(i=0;i<3;i++)
small_cub[0][i]=1;
small_cub[1][2]=1;
{
int i,j;
for(i=0;i<x;i+Байду номын сангаас){
for(j=0;j<y;j++){
if(chosen==1)

俄罗斯方块C语言代码

俄罗斯方块C语言代码

#include <stdio.h>#include <dos.h>#include <conio.h>#include <graphics.h>#include <stdlib.h>#ifdef__cplusplus#define __CPPARGS ...#else#define __CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸*/#define BGCOLOR 7 /* 背景着色*/#define GX 200#define GY 10#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d/* 定义俄罗斯方块的方向(我定义他为4种)*/#define F_DONG 0#define F_NAN 1#define F_XI 2#define F_BEI 3#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/#define NEXTROW 12 /* 要出的下一个方块的横从标*/#define MAXROW 14 /* 游戏屏幕大小*/#define MAXCOL 20#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/#define SCROW 60int gril[22][16]; /* 游戏屏幕坐标*/int col=1,row=7; /* 当前方块的横纵坐标*/int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6;int num=0; /*游戏分*/int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*//* 以下我用了一个3维数组来纪录方块的最初形状和方向*/int boxstr[7][4][16]={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}};/* 随机得到当前方块和下一个方块的形状和方向*/void boxrad(){minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random(7);}/*初始化图形模试*/void init(int gdrive,int gmode){int errorcode;initgraph(&gdrive,&gmode,"e:\\tc");errorcode=graphresult();if(errorcode!=grOk){printf("error of: %s",grapherrormsg(errorcode));exit(1);}}/* 在图形模式下的清屏*/void cls(){setfillstyle(SOLID_FILL,0);setcolor(0);bar(0,0,640,480);}/*在图形模式下的高级清屏*/void clscr(int a,int b,int c,int d,int color){setfillstyle(SOLID_FILL,color);setcolor(color);bar(a,b,c,d);}/*最小方块的绘制*/void minbox(int asc,int bsc,int color,int bdcolor){int a=0,b=0;a=SCCOL+asc;b=SCROW+bsc;clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);if(color!=BGCOLOR){setcolor(bdcolor);line(a+1,b+1,a-1+MINBOXSIZE,b+1);line(a+1,b+1,a+1,b-1+MINBOXSIZE);line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); }}/*游戏中出现的文字*/void txt(int a,int b,char *txt,int font,int color){setcolor(color);settextstyle(0,0,font);outtextxy(a,b,txt);}/*windows 绘制*/void win(int a,int b,int c,int d,int bgcolor,int bordercolor){clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);}/* 当前方块的绘制*/void funbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); }/*下一个方块的绘制*/void nextfunbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);}/*时间中断定义*/#define TIMER 0x1cint TimerCounter=0;void interrupt ( *oldhandler)(__CPPARGS);void interrupt newhandler(__CPPARGS){TimerCounter++;oldhandler();}void SetTimer(void interrupt (*IntProc)(__CPPARGS)){oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();}/*由于游戏的规则,消掉都有最小方块的一行*/void delcol(int a){int i,j;for(i=a;i>1;i--)for(j=1;j<15;j++){minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);gril[i][j]=gril[i-1][j];if(gril[i][j]==1)minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);}/*消掉所有都有最小方块的行*/ void delete(){int i,j,zero,delgx=0;char *nm="00000";for(i=1;i<21;i++){zero=0;for(j=1;j<15;j++)if(gril[j]==0)zero=1;if(zero==0){delcol(i);delgx++;}}num=num+delgx*delgx*10;dj=num/10000;sprintf(nm,"%d",num);clscr(456,173,500,200,4);txt(456,173,"Number:",1,15);txt(456,193,nm,1,15);}/*时间中断结束*/void KillTimer(){disable();setvect(TIMER,oldhandler); enable();}/* 测试当前方块是否可以向下落*/ int downok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i+1][row+j])k=0;return(k);/* 测试当前方块是否可以向左行*/int leftok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j-1])k=0;return(k);}/* 测试当前方块是否可以向右行*/int rightok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j+1])k=0;return(k);}/* 测试当前方块是否可以变形*/int upok(){int i,j,k=1,a[4][4];for(i=0;i<4;i++)for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx+1][i];for(i=3;i>=0;i--)for(j=3;j>=0;j--)if(a[j] && gril[col+i][row+j])k=0;return(k);}/*当前方块落下之后,给屏幕坐标作标记*/ void setgril(){int i,j,a[4][4];funbox(0,0,minboxcolor,0);for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j])gril[col+i][row+j]=1;col=1;row=7;}/*游戏结束*/void gameover(){int i,j;for(i=20;i>0;i--)for(j=1;j<15;j++)minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);txt(103,203,"Game Over",3,10);}/*按键的设置*/void call_key(int keyx){switch(keyx){case VK_DOWN: { /*下方向键,横坐标加一。

俄罗斯方块C语言代码(计算机类)

俄罗斯方块C语言代码(计算机类)

#include <stdio.h>#include <dos.h>#include <conio.h>#include <graphics.h>#include <stdlib.h>#ifdef__cplusplus#define __CPPARGS ...#else#define __CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸*/#define BGCOLOR 7 /* 背景着色*/#define GX 200#define GY 10#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d/* 定义俄罗斯方块的方向(我定义他为4种)*/#define F_DONG 0#define F_NAN 1#define F_XI 2#define F_BEI 3#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/#define NEXTROW 12 /* 要出的下一个方块的横从标*/#define MAXROW 14 /* 游戏屏幕大小*/#define MAXCOL 20#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/#define SCROW 60int gril[22][16]; /* 游戏屏幕坐标*/int col=1,row=7; /* 当前方块的横纵坐标*/int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6;int num=0; /*游戏分*/int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*//* 以下我用了一个3维数组来纪录方块的最初形状和方向*/int boxstr[7][4][16]={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}};/* 随机得到当前方块和下一个方块的形状和方向*/void boxrad(){minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random(7);}/*初始化图形模试*/void init(int gdrive,int gmode){int errorcode;initgraph(&gdrive,&gmode,"e:\\tc");errorcode=graphresult();if(errorcode!=grOk){printf("error of: %s",grapherrormsg(errorcode));exit(1);}}/* 在图形模式下的清屏*/void cls(){setfillstyle(SOLID_FILL,0);setcolor(0);bar(0,0,640,480);}/*在图形模式下的高级清屏*/void clscr(int a,int b,int c,int d,int color){setfillstyle(SOLID_FILL,color);setcolor(color);bar(a,b,c,d);}/*最小方块的绘制*/void minbox(int asc,int bsc,int color,int bdcolor){int a=0,b=0;a=SCCOL+asc;b=SCROW+bsc;clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);if(color!=BGCOLOR){setcolor(bdcolor);line(a+1,b+1,a-1+MINBOXSIZE,b+1);line(a+1,b+1,a+1,b-1+MINBOXSIZE);line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); }}/*游戏中出现的文字*/void txt(int a,int b,char *txt,int font,int color){setcolor(color);settextstyle(0,0,font);outtextxy(a,b,txt);}/*windows 绘制*/void win(int a,int b,int c,int d,int bgcolor,int bordercolor){clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);}/* 当前方块的绘制*/void funbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); }/*下一个方块的绘制*/void nextfunbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);}/*时间中断定义*/#define TIMER 0x1cint TimerCounter=0;void interrupt ( *oldhandler)(__CPPARGS);void interrupt newhandler(__CPPARGS){TimerCounter++;oldhandler();}void SetTimer(void interrupt (*IntProc)(__CPPARGS)){oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();}/*由于游戏的规则,消掉都有最小方块的一行*/void delcol(int a){int i,j;for(i=a;i>1;i--)for(j=1;j<15;j++){minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR); gril[i][j]=gril[i-1][j];if(gril[i][j]==1)minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);}}/*消掉所有都有最小方块的行*/void delete(){int i,j,zero,delgx=0;char *nm="00000";for(i=1;i<21;i++){zero=0;for(j=1;j<15;j++)if(gril[j]==0)zero=1;if(zero==0){delcol(i);delgx++;}}num=num+delgx*delgx*10;dj=num/10000;sprintf(nm,"%d",num);clscr(456,173,500,200,4);txt(456,173,"Number:",1,15);txt(456,193,nm,1,15);}/*时间中断结束*/void KillTimer(){disable();setvect(TIMER,oldhandler);enable();}/* 测试当前方块是否可以向下落*/int downok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i+1][row+j])k=0;return(k);}/* 测试当前方块是否可以向左行*/ int leftok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j-1])k=0;return(k);}/* 测试当前方块是否可以向右行*/ int rightok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j+1])k=0;return(k);}/* 测试当前方块是否可以变形*/int upok(){int i,j,k=1,a[4][4];for(i=0;i<4;i++)for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx+1][i]; for(i=3;i>=0;i--)for(j=3;j>=0;j--)if(a[j] && gril[col+i][row+j])k=0;return(k);}/*当前方块落下之后,给屏幕坐标作标记*/void setgril(){int i,j,a[4][4];funbox(0,0,minboxcolor,0);for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j])gril[col+i][row+j]=1;col=1;row=7;}/*游戏结束*/void gameover(){int i,j;for(i=20;i>0;i--)for(j=1;j<15;j++)minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);txt(103,203,"Game Over",3,10);}/*按键的设置*/void call_key(int keyx){switch(keyx){case VK_DOWN: { /*下方向键,横坐标加一。

C语言实现俄罗斯方块

C语言实现俄罗斯方块

电脑自己玩
• 这一部分的算法已编出,但还没找到最优 算法,尚未嵌入程序,可单独演示。
• 游戏中,按回车键暂停,再敲回车开始, 也可按ESC直接退出。
• 记分板开始前为0分,每消1行分数增1,同 时2行得3分,同时3行得7分,同时4行得13 分。
• 当方块出上界,游戏结束,根据提示,按 回车键重新游戏,ESC退出游戏。
• 每次退出前都询问。
• 演示
• 另外还有,自定义操作键,双人游戏,退出 保存等功能,接口都已做好,都有相应的代 码,由于具体操作时存在问题,暂未加入。
总体设计看演示。
二。游戏流程
• 游戏开始前,系统自动初始化图形模式, 装载界面,接着是用户设置速度和难度, 默认情况为速度难度都为0等级。TAB键移 动光标,上下键调整数值,总共有0-9个 速度和难度等级。回车键确认,开始游戏, ESC键直接退出游戏。
• 游戏开始后,有计时器计时,默认情况是 UP键变形,LEFT,RIGHT控制方向。 DOWN加速。
C语言实现俄罗斯方块
演示文稿
ห้องสมุดไป่ตู้
一.界面设计
• Tc2.0中有两种显示模式,一种是字符模式, 另一种是图形模式。
• 本软件在图形模式下运行,图形模式时,整 个全屏是640X480象素。
• 以STEP(16)为步长的话,为40X30的网格。 • 设游戏板为WIDE(10) X HIGH(20)个网格。 • 加上记分板,下一个方块的显示区及设置区。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

俄罗斯方块游戏(C语言)摘要俄罗斯方块是一款风靡全球的掌上游戏机和PC机游戏,它造成的轰动与创造的经济价值可以说是游戏史上的一件大事。

它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。

俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

它看似简单却变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。

作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。

相信大多数人都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。

由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。

关键词:俄罗斯方块开发游戏编程程序开发AbstractsTetris is a fashionable global handheld game and PC games,it caused stir and create the economic value of gaming history is a greatevent.It is invented by the Russian Alexey Pazhitnov.The basic rule of tetris is moving,rotation and put the Game output squares,It arranged in a complete row or a complete multi row,eliminate and score.It seems simple but Full of change.As household the mass games all ages,Its popularity is any games that cannot be compared.Tetris often used for game programming practice subject.Key: Tetris development ,Game programming ,program development目录1. 前言 (1)2.功能描述 (2)3.总体设计 (4)3.1 功能模块设计 (4)3.1.1 游戏执行主流程 (4)3.1.2 游戏方块预览 (4)3.1.3 游戏方块控制 (6)3.1.4 游戏显示更新 (8)3.1.5 游戏速度分数更新 (8)3.1.6 游戏帮助 (8)3.2 数据结构设计 (9)3.2.1 游戏底板BOARD结构体 (9)3.2.2 游戏方块SHAPE结构体 (9)3.2.3 SHAPE结构数组 (11)3.3 函数功能描述 (14)4.程序实现 (16)4.1 源码分析 (16)4.1.1 程序预处理 (16)4.1.2 主函数main() (22)4.1.3 初始化界面 (29)4.1.4 时钟中断处理 (31)4.1.5 成绩、速度及帮助的显示 (33)4.1.6 满行处理 (35)4.1.7 游戏方块的显示和清除 (41)4.1.8 游戏方块操作判断处理 (48)4.2 运行结果 (56)4.2.1 游戏初始状态 (56)4.2.2 游戏进行状态 (57)5. 结论 (59)致谢 (60)参考文献 (62)1.前言俄罗斯方块(Tetris)原本是前苏联科学家阿列克谢·帕吉特洛夫在1984年6月利用空闲时间所编写的游戏程序,据说游戏的作者最喜欢网球(Tennis)运动,于是,它把来源于希腊语的tetra(意为“四”)与其结合,造了“tetris”一词,之后开始提供授权给各个游戏公司,造成各平台上俄罗斯游戏软件大量发行的现象。

俄罗斯方块由于上手简单、老少皆宜,从而成为了家喻户晓款风靡全球的一款电视游戏机和掌上游戏机游戏。

C语言则是目前国际上比较流行的计算机高级编程语言之一,因其简洁、使用方便且具备强大的功能而受到编程人员的普遍青睐。

它既适合作为系统描述语言,也可以用来编写系统软件,还可以来编写应用软件。

用C语言来编写俄罗斯方块这个游戏有较大优势:C语言具有各种各样的数据类型,并引入了指针概念,使得程序效率更高;C语言还包含很广泛的运算符;另外C语言具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断能力也比较强大。

选择此论文题是旨在训练基本编程能力和游戏开发技巧,熟悉C语言图形模式下的编程。

本程序中涉及结构体、数组、时钟中断及绘图等方面的知识。

通过本程序的训练,能对C语言有一个更深刻的了解,掌握俄罗斯方块游戏开发的基本原理,为将来开发出高质量的游戏软件打下坚实的基础。

2.功能描述如图2.1所示,本游戏主要实现一下几种功能:图2.1 俄罗斯方块游戏功能描述图(1)游戏方块预览功能。

在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。

由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。

(2)游戏方块控制功能。

通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。

(3)游戏显示更新功能。

当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。

当消除满行时,要重绘游戏底板的当前状态。

(4)游戏速度分数更新功能。

在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。

比如,消除一行加10分。

当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。

(5)游戏帮助功能。

玩家进入游戏后,将有对本游戏如何操作的友情提示。

3.总体设计3.1 功能模块设计3.1.1 游戏执行主流程本俄罗斯方块游戏执行主流程图3.1所示。

在判断键值时,有左移VK_LEFT、右移VK_RIGHT、下移VK_DOWN、变形旋转VK_UP、退出VK_ESC键值的判断。

3.1.2 游戏方块预览新游戏方块将在如图3.2所示的4×4的正方形小方块中预览。

使用随机函数rand()来产生1~19之间的游戏方块编号,并作为预览的方块编号。

其中的正方形小方块的大小为BSIZE×BSIZE。

BSIZE为设定的像素大小。

图3.2 游戏方块预览图图3.1 游戏执行主流程图3.1.3 游戏方块控制这是此游戏开发的重点和难点部分。

下面分别较少左移、右移、下移、旋转及满行判断的实现。

左移的实现过程如下:(1) 判断在当前的游戏底板中能否左移。

这一判断必须满足如下两条件:游戏方块整体左移一位后,游戏方块不能超越游戏底板的左边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。

若满足这两个条件,则执行下面的左移动作。

否则不执行左移动作。

(2) 清除左移前的游戏方块。

(3) 在左移一位的位置,重新显示此游戏方块。

右移的实现过程如下:(1) 判断在当前游戏底板中能否右移。

这一判断必须满足如下两个条件:游戏方块整体右移一位后,游戏方块不能超越游戏底板的右边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。

若满足这两个条件,则执行下面的右移动作。

否则不只执行右移动作。

(2) 清除右移前的游戏方块。

(3) 在右移一位的位置,重新显示此游戏方块。

下移的实现过程如下:(1) 判断在当前游戏底板中能否下移。

这一判断必须满足如下两个条件:游戏方块整体下移一位后,游戏方块不能超越游戏底板的底边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。

若满足这两个条件,则执行下面的下移动作。

否则,将flag_newbox 标志置1,主循环中会判断此标志,若为1,则会生成下一个游戏方块,并更新预览游戏方块。

(2) 清除下移前的游戏方块。

(3) 在下移一位的位置,重新显示此游戏方块。

旋转的实现过程如下:(1) 判断在当前游戏底板中能否旋转。

这一判断必须满足如下条件:游戏方块整旋转后,游戏方块不能超越游戏底板的左边线、右边线和底边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。

若满足这些条件,则执行下面的旋转动作。

否则不只执行旋转动作。

(2) 清除旋转前的游戏方块。

(3) 在游戏方块显示区域(4×4)不变的位置,利用保存当前游戏方块的数据结构中的next值作为旋转后形成的新游戏方块的编号,并重新显示这个编号的游戏方块。

当生成新的游戏方块前,执行行满的检查,判断行满的过程为:一次从下到上扫描游戏底板中的各行,若某行中1的个数等于游戏底板水平方向上的小方块的个数,则表示此行是满的。

找到满行后,立即将游戏底板中的数据往下顺移一行,直到游戏底板逐行扫描完毕。

3.1.4 游戏显示更新当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。

当消除满行时,要重绘游戏底板的当前状态。

清除方块的过程为:用先画轮廓再填充的方式,使用背景色填充小方块,然后使用前景色画一个游戏底板中的小方块。

循环此过程,变化当前坐标,填充及画出共16个这样的小方块。

这样在游戏底板中,清除了此游戏方块。

3.1.5 游戏速度分数更新当判断出一行满时,score变量一固定值(如10),可以吧等级level看作是速度speed,因为速度speed是根据计分score值不断上升的,所以我们定义level=speed==score/speed_step,其中speed_step是每升一级所需要的分数。

方块下落速度加快,这是不断修改了定时计数器变量TimerCounter 判断条件的结果。

速度越快,时间中断的间隔就越短。

3.1.6 游戏帮助实现比较简单,使用outtextxy()函数实现。

3.2 数据结构设计3.2.1 游戏底板BOARD结构体Struct BOARD{Int var;Int color;}Table_board[Vertical_boxs][Horizontal_boxs];BOARD结构体表示游戏底板中每个小方块所具有的属性。

其中var表示小方块当前状态,只有0与1两个值,表示此小方块已被占用,0表示未被占用。

Color表示小方块的颜色,游戏底板的每个小方块可以拥有不同的颜色,以增强美观。

Vertical_boxs为游戏底板上垂直的方向上小方块的个数,Horizontal_boxs为游戏底板上水平的方向上小方块的个数。

3.2.2 游戏方块SHAPE结构体struct SHAPE{char box[2];int color; /*每个方块的颜色*/int next; /*下个方块的编号*/};SHAPE结构体表示某个游戏方块具有的属性。

相关文档
最新文档