俄罗斯方块程序代码

合集下载

俄罗斯方块源代码

俄罗斯方块源代码

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}。

俄罗斯方块c代码

俄罗斯方块c代码

/********************************************** 游戏名称:俄罗斯方块**********************************************/#ifndef BLOCK_H_H#define BLOCK_H_H#include<windows.h>#include<time.h>#include<iostream>using namespace std;#define WIDTH 10 //游戏区宽度#define HEIGHT 22 //游戏区高度#define SIZE 10 //方块大小#define KIND 8 //方块种类#define ID_LEFT 0#define ID_RIGHT 1#define ID_DOWN 2#define ID_UP 3#define ID_TIMER 4//八种方块struct BLOCK{WORD dir[4];COLORREF color;};//当前方块、下一方块struct BLOCKINFO{byte id:3;char x,y;byte dir:2;};enum DRAW{SHOW,//显示方块HIDE//隐藏方块};///////////定义函数////////////////void Init(HDC hdc); //初始化void NewGame(HDC hdc); //新游戏void GameOver(); //游戏结束void NewBlock(HDC hdc); //产生新方块bool CheckBlock(BLOCKINFO block); //检查是否可放下方块void DrawBlock(HDC hdc,BLOCKINFO block,DRAW draw); //画方块void OnRotate(HDC hdc); //旋转方块void Transform(HDC hdc); //变形方块void OnLeft(HDC hdc); //左移方块void OnRight(HDC hdc); //右移方块void OnDown(HDC hdc); //下移方块void OnSink(HDC hdc); //下沉方块#endif#include"BLOCK.h"//窗口句柄HWND Hwnd;bool start=true;int grade=0; //分数int level=1; //等级//文本TCHAR buf1[10],buf2[10];int len1=sprintf(buf1,"等级:%d",level);int len2=sprintf(buf2,"分数:%d",grade);//颜色COLORREFBLACK=RGB(0,0,0),RED=RGB(255,0,0),GREEN=RGB(0,255,0),BLUE=RGB(0,0,255),YELL OW=RGB(255,255,0),ORANGE=RGB(255,165,0),LA VENDER=RGB(230,230,250),GRAY=RG B(128,128,128),WHITE=RGB(255,255,255);//当前方块、下一方块BLOCKINFO g_curblock,g_nextblock;//八种方块BLOCK g_blocks[KIND]={{0x0F00,0x4444,0x0F00,0x4444,RED},{0x0660,0x0660,0x0660,0x0660,BLUE},{0x4460,0x02E0,0x0622,0x0740,GREEN},{0x2260,0x0E20,0x0644,0x0470,YELLOW},{0x0C60,0x2640,0x0C60,0x2640,ORANGE},{0x0360,0x4620,0x0360,0x4620,LA VENDER},{0x4E00,0x4C40,0xE40,0x4640,GRAY},{0x4E20,0x06C4,0x0472,0x2360,ORANGE}};//游戏区byte g_world[WIDTH][HEIGHT]={0};//游戏区颜色COLORREF color[WIDTH][HEIGHT]={0};//初始化游戏void Init(HDC hdc){grade=0; //分数level=1; //等级RECT rect;SetBkColor(hdc,BLACK);SetTextColor(hdc,WHITE);TextOut(hdc,(WIDTH+4)*SIZE,(HEIGHT-6)*SIZE,buf1,len1);TextOut(hdc,(WIDTH+4)*SIZE,(HEIGHT-8)*SIZE,buf2,len2);SetRect(&rect,-8.5*SIZE,(HEIGHT-2)*SIZE,-SIZE,(HEIGHT-3)*SIZE);SelectObject(hdc,GetStockObject(NULL_BRUSH));SelectObject(hdc,GetStockObject(WHITE_PEN));DrawText(hdc,TEXT("操作介绍"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("左移:左键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("右移:右键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("下移:下键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("下沉:空格键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("旋转:上键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("变形:Shift+上键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("暂停:回车键"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);OffsetRect(&rect,0,-2*SIZE);DrawText(hdc,TEXT("退出:Esc"),-1,&rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT);Rectangle(hdc,0,0,WIDTH*SIZE,HEIGHT*SIZE);Rectangle(hdc,(WIDTH+4)*SIZE,HEIGHT*SIZE,(WIDTH+8)*SIZE,(HEIGHT-4)*SIZE);srand((unsigned)time(NULL));NewGame(hdc);}//游戏结束void GameOver(){KillTimer(Hwnd,ID_TIMER);if(IDYES==MessageBox(Hwnd,"是否重新开始","提示",MB_YESNO)){start=true;for(int i=0;i<WIDTH;i++){for(int j=0;j<HEIGHT;j++){color[i][j]=0;}}SetTimer(Hwnd,ID_TIMER,500,NULL);InvalidateRect(Hwnd,NULL,TRUE);}elseSendMessage(Hwnd,WM_DESTROY,0,0);}//新游戏void NewGame(HDC hdc){if(start){//清空游戏区ZeroMemory(g_world, WIDTH * HEIGHT);//生成下一方块g_nextblock.id=rand()%8;g_nextblock.dir=rand()%4;g_nextblock.x=WIDTH+4;g_nextblock.y=HEIGHT-1;}for(int i=0;i<WIDTH;i++){for(int j=0;j<HEIGHT;j++){if(color[i][j]){SelectObject(hdc,GetStockObject(WHITE_PEN));SelectObject(hdc,CreateSolidBrush(color[i][j]));}else{SelectObject(hdc,GetStockObject(BLACK_BRUSH));SelectObject(hdc,GetStockObject(BLACK_PEN));}RoundRect(hdc,i*SIZE,j*SIZE,(i+1)*SIZE,(j+1)*SIZE,0.25*SIZE,0.25*SIZE);}}NewBlock(hdc);}//产生新方块void NewBlock(HDC hdc){if(start){start=false;DrawBlock(hdc,g_nextblock,HIDE);g_curblock=g_nextblock;g_curblock.x=WIDTH/2-2;g_curblock.y=HEIGHT+2;g_nextblock.id=rand()%8;g_nextblock.dir=rand()%4;WORD c=g_blocks[g_curblock.id].dir[g_curblock.dir];while((c&0xF)==0){g_curblock.y--;c>>=4;}}DrawBlock(hdc,g_curblock,SHOW);DrawBlock(hdc,g_nextblock,SHOW);}//画方块void DrawBlock(HDC hdc,BLOCKINFO block,DRAW draw){WORD b=g_blocks[block.id].dir[block.dir];int x,y;COLORREF color;SelectObject(hdc,GetStockObject(NULL_BRUSH));SelectObject(hdc,GetStockObject(WHITE_PEN));Rectangle(hdc,0,0,WIDTH*SIZE,HEIGHT*SIZE);Rectangle(hdc,(WIDTH+4)*SIZE,HEIGHT*SIZE,(WIDTH+8)*SIZE,(HEIGHT-4)*SIZE); switch(draw){case SHOW:color=g_blocks[block.id].color;SelectObject(hdc,GetStockObject(WHITE_PEN));break;case HIDE:color=BLACK;SelectObject(hdc,GetStockObject(BLACK_PEN));break;}SelectObject(hdc,CreateSolidBrush(color));for(int i=0;i<16;i++){if(b&0x8000){x=block.x+i%4;y=block.y-i/4;if(y<HEIGHT){RoundRect(hdc,x*SIZE,y*SIZE,(x+1)*SIZE,(y+1)*SIZE,0.25*SIZE,0.25*SIZE); }}b<<=1;}SelectObject(hdc,GetStockObject(BLACK_BRUSH));SelectObject(hdc,GetStockObject(BLACK_PEN));}//检查是否可放下方块bool CheckBlock(BLOCKINFO block){WORD b=g_blocks[block.id].dir[block.dir];int x,y;for(int i=0;i<16;i++){if(b&0x8000){x=block.x+i%4;y=block.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 OnLeft(HDC hdc){BLOCKINFO tmp;tmp=g_curblock;tmp.x--;if(CheckBlock(tmp)){DrawBlock(hdc,g_curblock,HIDE);g_curblock.x--;DrawBlock(hdc,g_curblock,SHOW);}}//右移方块void OnRight(HDC hdc){BLOCKINFO tmp;tmp=g_curblock;tmp.x++;if(CheckBlock(tmp)){DrawBlock(hdc,g_curblock,HIDE);g_curblock.x++;DrawBlock(hdc,g_curblock,SHOW);}}//旋转方块void OnRotate(HDC hdc){int dx;BLOCKINFO tmp;tmp=g_curblock;tmp.dir++;if(CheckBlock(tmp)){dx=0;goto rotate;}tmp.x=g_curblock.x-1;if(CheckBlock(tmp)){dx=-1;goto rotate;}tmp.x=g_curblock.x+1;if(CheckBlock(tmp)){dx=1;goto rotate;}tmp.x=g_curblock.x-2;if(CheckBlock(tmp)){dx=-2;goto rotate;}tmp.x=g_curblock.x+2;if(CheckBlock(tmp)){dx=2;goto rotate;}return;rotate:DrawBlock(hdc,g_curblock,HIDE);g_curblock.dir++;g_curblock.x+=dx;DrawBlock(hdc,g_curblock,SHOW);}//变形方块void Transform(HDC hdc){int dx;BLOCKINFO tmp;tmp=g_curblock;tmp.id++;if(CheckBlock(tmp)){dx=0;goto transform;}tmp.x=g_curblock.x-1;if(CheckBlock(tmp)){dx=-1;goto transform;}tmp.x=g_curblock.x+1;if(CheckBlock(tmp)){dx=1;goto transform;}tmp.x=g_curblock.x-2;if(CheckBlock(tmp)){dx=-2;goto transform;}tmp.x=g_curblock.x+2;if(CheckBlock(tmp)){dx=2;goto transform;}return;transform:DrawBlock(hdc,g_curblock,HIDE);g_curblock.id++;g_curblock.x+=dx;DrawBlock(hdc,g_curblock,SHOW);}//下沉方块void OnSink(HDC hdc){int i,x,y;DrawBlock(hdc,g_curblock,HIDE);BLOCKINFO tmp=g_curblock;tmp.y--;while(CheckBlock(tmp)){g_curblock.y--;tmp.y--;}DrawBlock(hdc,g_curblock,SHOW);//判断是否结束游戏WORD b=g_blocks[g_curblock.id].dir[g_curblock.dir];for(i=0;i<16;i++){if(b&0x8000){if(g_curblock.y-i/4>=HEIGHT){GameOver();return;}else{g_world[g_curblock.x+i%4][g_curblock.y-i/4]=1;color[g_curblock.x+i%4][g_curblock.y-i/4]=g_blocks[g_curblock.id].color;}}b<<=1;}//判断是否消行int row[4]={0};bool brow=false;for(y=g_curblock.y;y>=(g_curblock.y>3?g_curblock.y-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_curblock.y-y]=1;grade+=10;}}//延时200毫秒Sleep(200);//消行if(brow){for(i=0;i<4;i++)if(row[i]){for(y=g_curblock.y-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;color[x][y-1]=color[x][y];color[x][y]=0;}BitBlt(hdc,0,(g_curblock.y-i)*SIZE,WIDTH*SIZE,(HEIGHT-g_curblock.y+i-1)*SIZE-1,hdc ,0,(g_curblock.y-i+1)*SIZE,SRCCOPY);len2=sprintf(buf2,"分数:%d",grade);SetBkColor(hdc,BLACK);SetTextColor(hdc,WHITE);TextOut(hdc,(WIDTH+4)*SIZE,(HEIGHT-8)*SIZE,buf2,len2);}}if(grade/100&&(!(grade%100))){level+=1;len1=sprintf(buf1,"等级:%d",level);SetBkColor(hdc,BLACK);SetTextColor(hdc,WHITE);TextOut(hdc,(WIDTH+4)*SIZE,(HEIGHT-6)*SIZE,buf1,len1);KillTimer(Hwnd,ID_TIMER);SetTimer(Hwnd,ID_TIMER,500-30*level,NULL);}start=true;NewBlock(hdc);}//下移方块void OnDown(HDC hdc){BLOCKINFO tmp;tmp=g_curblock;tmp.y--;if(CheckBlock(tmp)){DrawBlock(hdc,g_curblock,HIDE);g_curblock.y--;DrawBlock(hdc,g_curblock,SHOW);}elseOnSink(hdc);}#include"BLOCK.h"HINSTANCE hinst;//窗口句柄extern HWND Hwnd;bool s=true;//窗口过程函数LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);/////////////////////////int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hpreInstance,LPSTR lpCmdLine,int nCmdShow){hinst=hInstance;WNDCLASS wndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW;//类型wndclass.lpfnWndProc=WindowProc;//窗口过程函数wndclass.cbClsExtra=0;//存储附加信息wndclass.cbWndExtra=0;//wndclass.hInstance=hInstance;//程序的实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标(IDI_APPLICATION)wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//光标wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统画刷wndclass.lpszMenuName=NULL;//菜单名wndclass.lpszClassName="tetris";//窗口类名RegisterClass(&wndclass);//注册窗口//创建窗口HWND hwnd;hwnd=CreateWindow("tetris","俄罗斯方块",WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX,280,50,70*SIZE,60*SIZE,NULL,NULL,hInstance,NULL);//WS_OVERLAPPEDWINDOWHwnd=hwnd;//显示窗口ShowWindow(hwnd,nCmdShow);//更新窗口UpdateWindow(hwnd);MSG msg;BOOL bRet;while(bRet=GetMessage(&msg,NULL,0,0))//获取消息{if(bRet==-1)return -1;TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}//////////////////////////////////LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;LPDRAWITEMSTRUCT pdis;HDC hdc;static int cxClient,cyClient;static HWND hleft,hright,hup,hdown;POINT pt[3];switch (uMsg){case WM_SIZE:cxClient=LOWORD(lParam);cyClient=HIWORD(lParam);MoveWindow(hleft,53*SIZE,40*SIZE,3*SIZE,3*SIZE,TRUE);MoveWindow(hright,59*SIZE,40*SIZE,3*SIZE,3*SIZE,TRUE);MoveWindow(hup,56*SIZE,37*SIZE,3*SIZE,3*SIZE,TRUE);MoveWindow(hdown,56*SIZE,43*SIZE,3*SIZE,3*SIZE,TRUE);break;case WM_CREATE:SetTimer(hwnd,ID_TIMER,500,NULL);hleft=CreateWindow(TEXT("button"),TEXT(""),WS_CHILD|WS_VISIBLE|BS_OWNERD RAW,0,0,3*SIZE,3*SIZE,hwnd,(HMENU)ID_LEFT,hinst,NULL);hright=CreateWindow(TEXT("button"),TEXT(""),WS_CHILD|WS_VISIBLE|BS_OWNER DRAW,0,0,3*SIZE,3*SIZE,hwnd,(HMENU)ID_RIGHT,hinst,NULL);hdown=CreateWindow(TEXT("button"),TEXT(""),WS_CHILD|WS_VISIBLE|BS_OWNER DRAW,0,0,3*SIZE,3*SIZE,hwnd,(HMENU)ID_DOWN,hinst,NULL);hup=CreateWindow(TEXT("button"),TEXT(""),WS_CHILD|WS_VISIBLE|BS_OWNERD RAW,0,0,3*SIZE,3*SIZE,hwnd,(HMENU)ID_UP,hinst,NULL);break;case WM_PAINT:hdc=BeginPaint(hwnd,&ps);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);Init(hdc);EndPaint(hwnd,&ps);break;case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);switch (wmId){case 106:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}break;case WM_TIMER:if(s){hdc=GetDC(hwnd);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);OnDown(hdc);ReleaseDC(hwnd,hdc);}break;case WM_KEYDOWN:switch(wParam){case VK_LEFT:if(s){hdc=GetDC(hwnd);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);OnLeft(hdc);ReleaseDC(hwnd,hdc);}SendMessage(hleft,BM_SETSTATE,1,0);break;case VK_RIGHT:if(s){hdc=GetDC(hwnd);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);OnRight(hdc);ReleaseDC(hwnd,hdc);}SendMessage(hright,BM_SETSTATE,1,0);break;case VK_UP:if(s){hdc=GetDC(hwnd);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);if(GetKeyState(VK_SHIFT)<0)Transform(hdc);elseOnRotate(hdc);ReleaseDC(hwnd,hdc);}SendMessage(hup,BM_SETSTATE,1,0);break;case VK_DOWN:if(s){hdc=GetDC(hwnd);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);OnDown(hdc);ReleaseDC(hwnd,hdc);}SendMessage(hdown,BM_SETSTA TE,1,0);break;case VK_SPACE:if(s){hdc=GetDC(hwnd);SetMapMode(hdc,MM_ISOTROPIC);SetWindowExtEx(hdc,250,250,NULL);SetViewportExtEx(hdc,cxClient,-cyClient,NULL);SetViewportOrgEx(hdc,20*SIZE,55*SIZE,NULL);OnSink(hdc);ReleaseDC(hwnd,hdc);}break;case VK_RETURN:if(s)s=false;elses=true;break;}break;case WM_KEYUP:switch(wParam){case VK_LEFT:SendMessage(hleft,BM_SETSTATE,0,0);break;case VK_RIGHT:SendMessage(hright,BM_SETSTATE,0,0);break;case VK_UP:SendMessage(hup,BM_SETSTA TE,0,0);break;case VK_DOWN:SendMessage(hdown,BM_SETSTA TE,0,0);break;}break;case WM_DRAWITEM:pdis=(LPDRAWITEMSTRUCT)lParam;FillRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH));if(pdis->itemState&ODS_SELECTED)SelectObject(pdis->hDC,(HBRUSH)CreateSolidBrush(RGB(255,0,0)));elseSelectObject(pdis->hDC,(HBRUSH)CreateSolidBrush(RGB(255,255,255)));switch(pdis->CtlID){case ID_LEFT:pt[0].x=0;pt[0].y=1.5*SIZE;pt[1].x=3*SIZE;pt[1].y=0;pt[2].x=3*SIZE;pt[2].y=3*SIZE;break;case ID_RIGHT:pt[0].x=0;pt[0].y=0;pt[1].x=0;pt[1].y=3*SIZE;pt[2].x=3*SIZE;pt[2].y=1.5*SIZE;break;case ID_DOWN:pt[0].x=0;pt[0].y=0;pt[1].x=3*SIZE;pt[1].y=0;pt[2].x=1.5*SIZE;pt[2].y=3*SIZE;break;case ID_UP:pt[0].x=1.5*SIZE;pt[0].y=0;pt[1].x=0;pt[1].y=3*SIZE;pt[2].x=3*SIZE;pt[2].y=3*SIZE;break;}Polygon(pdis->hDC,pt,3);break;case WM_CLOSE:DestroyWindow(hwnd);break;case WM_DESTROY:KillTimer(hwnd,ID_TIMER);PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;}。

简单俄罗斯方块程序代码

简单俄罗斯方块程序代码

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

我们可以用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数组,绘制已经落下的方块。

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

俄罗斯方块程序代码

俄罗斯方块程序代码

//包含头文件#include<stdio.h>#include<Windows.h>#include<conio.h>#include<graphics.h>#include<time.h>#include "Tetris.h"//int score=0;//int lever=1;//char scores[10];//char levers[10];/*enum cmd{round, //旋转方块left, //左移方块right, //右移方块down, //下一方块bottom, //方块沉底quit //离开游戏};//定义绘制方块的状态的枚举类型enum draw{show, //显示方块hide //抹掉方块};//定义俄罗斯方块的结构体struct block{int dir[4]; //方块的四个旋转的状态int color; //方块的颜色}*/static T_TrsBlockStyle gz_tBlockStyleTab[7] ={/* 口口口口口口口口口口口口口口口口*/{0x0F00, 0x4444, 0x0F00, 0x4444, RED},/*口口口口口口口口口口口口口口口口*/{0x0660, 0x0660, 0x0660, 0x0660, BLUE},/* 口口口口口口口口口口口口口口口口*/{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA},/* 口口口口口口口口口口口口口口口口*/{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW},/* 口口口口口口口口口口口口口口口口*/{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN},/* 口口口口口口口口口口口口口口口口*/{0x0360, 0x4620, 0x0360, 0x4620, GREEN},/* 口口口口口口口口口口口口口口口口*/{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}};/*//定义俄罗斯方块的信息的结构体struct blockinfo{int id; //7中方块中的哪一种byte dir:2; //1种方块中四个方向中的哪个char x,y; //方块的坐标(不是屏幕中的而是自己设置的游戏区域中的)}curblock,nextblock;*/// 定义游戏区//unsigned char area[width][high] = {0};//函数声明bool TRS_AppCreate(void ** ppUser,void * pFunc);static void TRS_Init(void *pUser);static void TRS_DrawBackground(void *pUser);static void TRS_GameOver(void *pUser);static void TRS_Quit(void *pUser);static void TRS_ScoreShow(void *pUser);static void TRS_NewGame(void *pUser);static AEEEvent TRS_GetMsg(PCTetrisApp pMe);static bool TRS_TetrisHandle(void *pUser, DWORD evt, WORD w,DWORD dw);static void TRS_Newblock(void *pUser);static void TRS_DrawBlock(void *pUser,T_TrsBlockInfo tCurBlck,EDrawStyle eStyle);static bool TRS_Checkblock(void *pUser, T_TrsBlockInfo tCurBlck);static void TRS_HRound(void *pUser);static void TRS_HLeft(void *pUser);static void TRS_HRight(void *pUser);static void TRS_HDown(void *pUser);static void TRS_HBottom(void *pUser);/*------------------------------------------------------------------------------函数名称:main功能说明:主函数参数说明:作者:时间:-------------------------------------------------------------------------------*/void main(){PCTetrisApp pMe;AEEEvent eMsg;//init();TRS_AppCreate((void **)&pMe,NULL);/*while(true){scoreshow();c=getcmd();discmd(c);if (c == quit){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)Quit();}}*/}bool TRS_AppCreate(void ** ppUser,void * pFunc);{PCTetrisApp pMe;new(pMe);*ppUser = pMe;pMe->m_iScore=0;pMe->m_iLever=0;memset(pMe->m_iScores,0,sizeof(int)*10);memset(pMe->m_iLevers,0,sizeof(int)*10);for(iLoop = 0;iLoop <GSCRN_WIDTH_CL;iLoop++){for(jLoop=0;jLoop <GSCRN_HIGHT_CL;jLoop++){pMe->m_uiArea[iLoop][jLoop]=0;}}pMe->m_dwOldTime = 0;pMe->m_dwNewTime = 0;return true;}static bool TRS_TetrisHandle(void *pUser, DWORD evt, WORD w,DWORD dw) {switch(evt){case EVT_ROUND :TRS_HRound(pUser);break;case EVT_LEFT :TRS_HLeft(pUser);break;case EVT_RIGHT :TRS_HRight(pUser);break;case EVT_DOWN :TRS_HDown(pUser);break;case EVT_BOTTOM:TRS_HBottom(pUser);break;case EVT_QUIT :{HWND wnd = GetHWnd();if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)TRS_Quit(pUser);}break;default:return false;}return true;}//初始化函数static void TRS_Init(void *pUser){PCTetrisApp pMe =(PCTetrisApp)pUser;initgraph(SCREEN_HIGHT,SCREEN_WIDTH); //初始化屏幕大小srand((unsigned)time(NULL)); //以当前时间作为随机种子TRS_NewGame();}static void TRS_DrawBackground(void *pUser);{PCTetrisApp pMe =(PCTetrisApp)pUser;setfont(TRS_GUIDE_FONT_SIZE,0,TRS_GUIDE_FONT_TYPE); //定义字体宋体,字高16,字宽比例自动适应outtextxy(TRS_OPERATION_TITLE_X,TRS_OPERATION_TITLE_Y,"操作提示:");outtextxy(TRS_MLEFT_X,TRS_MLEFT_Y,"a:左移");outtextxy(TRS_MRIGHT_X,TRS_MRIGHT_Y,"d:右移");outtextxy(TRS_MDOWN_X,TRS_MDOWN_Y,"s:下移");outtextxy(TRS_ROTATION_X,TRS_ROTATION_Y,"w:变形");outtextxy(TRS_MBOTTOM_X,TRS_MBOTTOM_Y,"空格:沉底");outtextxy(TRS_EXIT_X,TRS_EXIT_Y,"ESC:退出");setfont(50,0,"黑体");outtextxy(460,160,"Tetris");setfont(22,0,"宋体");outtextxy(20,20,"得分:");outtextxy(20,80,"等级:");setorigin(220,20); //设置坐标原点setfillstyle(WHITE); //设置填充颜色为白色//画游戏的边框bar3d(-21,-1,-6,GSCRN_HIGHT_CL * CELL_WIDTH,5,1);bar(-21,GSCRN_HIGHT_CL * CELL_WIDTH,GSCRN_WIDTH_CL * CELL_WIDTH,GSCRN_HIGHT_CL * CELL_WIDTH+20);bar3d(GSCRN_WIDTH_CL * CELL_WIDTH,-1,GSCRN_WIDTH_CL * CELL_WIDTH+15,GSCRN_HIGHT_CL * CELL_WIDTH+20,5,1);//画预览方块区域的边框rectangle((GSCRN_WIDTH_CL + 2) * CELL_WIDTH - 1, -1, (GSCRN_WIDTH_CL + 6) * CELL_WIDTH, 4 * CELL_WIDTH);}// 退出游戏static void TRS_Quit(void *pUser){PCTetrisApp pMe =(PCTetrisApp)pUser;closegraph();//释放应用空间free(pMe);exit(0);}// 结束游戏static void TRS_GameOver(void *pUser){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("游戏结束。

俄罗斯方块C源代码

俄罗斯方块C源代码
俄罗斯方块 C 源代码
/* *俄罗斯方块源程序 */ #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;dos.h&gt; #include &lt;graphics.h&gt; /*图形函数库*/
/*定义按键码*/ #define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000 #define VK_UP 0x4800 #define VK_ESC 0x011b #define TIMER 0x1c /*设置中断号*/
颜色填充。*/ sprintf(speed_str,&quot;%3d&quot;,speed+1); outtextxy(x,y,&quot;Level&quot;); outtextxy(x,y+10,speed_str); /*输出字符串指针 speed_str 所指的文本在规定的(x, y)位置*/ outtextxy(x,y+50,&quot;Nextbox&quot;); }
/* 设置新的时钟中断处理过程 */ void SetTimer(void interrupt(*IntProc)(void)) { oldtimer=getvect(TIMER); /*获取中断号为 TIMER 的中断处理函数的入口地 址*/ disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */ setvect(TIMER,IntProc); /*将中断号为 TIMER 的中断处理函数的入口地址改为 IntProc()函数的入口地址 即中断发生时,将调用 IntProc()函数。*/ enable(); /* 开启中断 */ }

俄罗斯方块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: { /*下方向键,横坐标加一。

俄罗斯方块源代码

俄罗斯方块源代码

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即可判断。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//包含头文件#include<stdio.h>#include<Windows.h>#include<conio.h>#include<graphics.h>#include<time.h>#include "Tetris.h"//int score=0;//int lever=1;//char scores[10];//char levers[10];/*enum cmd{round, //旋转方块left, //左移方块right, //右移方块down, //下一方块bottom, //方块沉底quit //离开游戏};//定义绘制方块的状态的枚举类型enum draw{show, //显示方块hide //抹掉方块};//定义俄罗斯方块的结构体struct block{int dir[4]; //方块的四个旋转的状态int color; //方块的颜色}*/static T_TrsBlockStyle gz_tBlockStyleTab[7] ={/* 口口口口口口口口口口口口口口口口*/{0x0F00, 0x4444, 0x0F00, 0x4444, RED},/*口口口口口口口口口口口口口口口口*/{0x0660, 0x0660, 0x0660, 0x0660, BLUE},/* 口口口口口口口口口口口口口口口口*/{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA},/* 口口口口口口口口口口口口口口口口*/{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW},/* 口口口口口口口口口口口口口口口口*/{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN},/* 口口口口口口口口口口口口口口口口*/{0x0360, 0x4620, 0x0360, 0x4620, GREEN},/* 口口口口口口口口口口口口口口口口*/{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}};/*//定义俄罗斯方块的信息的结构体struct blockinfo{int id; //7中方块中的哪一种byte dir:2; //1种方块中四个方向中的哪个char x,y; //方块的坐标(不是屏幕中的而是自己设置的游戏区域中的)}curblock,nextblock;*/// 定义游戏区//unsigned char area[width][high] = {0};//函数声明bool TRS_AppCreate(void ** ppUser,void * pFunc);static void TRS_Init(void *pUser);static void TRS_DrawBackground(void *pUser);static void TRS_GameOver(void *pUser);static void TRS_Quit(void *pUser);static void TRS_ScoreShow(void *pUser);static void TRS_NewGame(void *pUser);static AEEEvent TRS_GetMsg(PCTetrisApp pMe);static bool TRS_TetrisHandle(void *pUser, DWORD evt, WORD w,DWORD dw);static void TRS_Newblock(void *pUser);static void TRS_DrawBlock(void *pUser,T_TrsBlockInfo tCurBlck,EDrawStyle eStyle);static bool TRS_Checkblock(void *pUser, T_TrsBlockInfo tCurBlck);static void TRS_HRound(void *pUser);static void TRS_HLeft(void *pUser);static void TRS_HRight(void *pUser);static void TRS_HDown(void *pUser);static void TRS_HBottom(void *pUser);/*------------------------------------------------------------------------------函数名称:main功能说明:主函数参数说明:作者:时间:-------------------------------------------------------------------------------*/void main(){PCTetrisApp pMe;AEEEvent eMsg;//init();TRS_AppCreate((void **)&pMe,NULL);/*while(true){scoreshow();c=getcmd();discmd(c);if (c == quit){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)Quit();}}*/}bool TRS_AppCreate(void ** ppUser,void * pFunc);{PCTetrisApp pMe;new(pMe);*ppUser = pMe;pMe->m_iScore=0;pMe->m_iLever=0;memset(pMe->m_iScores,0,sizeof(int)*10);memset(pMe->m_iLevers,0,sizeof(int)*10);for(iLoop = 0;iLoop <GSCRN_WIDTH_CL;iLoop++){for(jLoop=0;jLoop <GSCRN_HIGHT_CL;jLoop++){pMe->m_uiArea[iLoop][jLoop]=0;}}pMe->m_dwOldTime = 0;pMe->m_dwNewTime = 0;return true;}static bool TRS_TetrisHandle(void *pUser, DWORD evt, WORD w,DWORD dw) {switch(evt){case EVT_ROUND :TRS_HRound(pUser);break;case EVT_LEFT :TRS_HLeft(pUser);break;case EVT_RIGHT :TRS_HRight(pUser);break;case EVT_DOWN :TRS_HDown(pUser);break;case EVT_BOTTOM:TRS_HBottom(pUser);break;case EVT_QUIT :{HWND wnd = GetHWnd();if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)TRS_Quit(pUser);}break;default:return false;}return true;}//初始化函数static void TRS_Init(void *pUser){PCTetrisApp pMe =(PCTetrisApp)pUser;initgraph(SCREEN_HIGHT,SCREEN_WIDTH); //初始化屏幕大小srand((unsigned)time(NULL)); //以当前时间作为随机种子TRS_NewGame();}static void TRS_DrawBackground(void *pUser);{PCTetrisApp pMe =(PCTetrisApp)pUser;setfont(TRS_GUIDE_FONT_SIZE,0,TRS_GUIDE_FONT_TYPE); //定义字体宋体,字高16,字宽比例自动适应outtextxy(TRS_OPERATION_TITLE_X,TRS_OPERATION_TITLE_Y,"操作提示:");outtextxy(TRS_MLEFT_X,TRS_MLEFT_Y,"a:左移");outtextxy(TRS_MRIGHT_X,TRS_MRIGHT_Y,"d:右移");outtextxy(TRS_MDOWN_X,TRS_MDOWN_Y,"s:下移");outtextxy(TRS_ROTATION_X,TRS_ROTATION_Y,"w:变形");outtextxy(TRS_MBOTTOM_X,TRS_MBOTTOM_Y,"空格:沉底");outtextxy(TRS_EXIT_X,TRS_EXIT_Y,"ESC:退出");setfont(50,0,"黑体");outtextxy(460,160,"Tetris");setfont(22,0,"宋体");outtextxy(20,20,"得分:");outtextxy(20,80,"等级:");setorigin(220,20); //设置坐标原点setfillstyle(WHITE); //设置填充颜色为白色//画游戏的边框bar3d(-21,-1,-6,GSCRN_HIGHT_CL * CELL_WIDTH,5,1);bar(-21,GSCRN_HIGHT_CL * CELL_WIDTH,GSCRN_WIDTH_CL * CELL_WIDTH,GSCRN_HIGHT_CL * CELL_WIDTH+20);bar3d(GSCRN_WIDTH_CL * CELL_WIDTH,-1,GSCRN_WIDTH_CL * CELL_WIDTH+15,GSCRN_HIGHT_CL * CELL_WIDTH+20,5,1);//画预览方块区域的边框rectangle((GSCRN_WIDTH_CL + 2) * CELL_WIDTH - 1, -1, (GSCRN_WIDTH_CL + 6) * CELL_WIDTH, 4 * CELL_WIDTH);}// 退出游戏static void TRS_Quit(void *pUser){PCTetrisApp pMe =(PCTetrisApp)pUser;closegraph();//释放应用空间free(pMe);exit(0);}// 结束游戏static void TRS_GameOver(void *pUser){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("游戏结束。

相关文档
最新文档