https://www.myziyuan.com/
- Lu珊Han
- 是俄罗斯方块 但不晓得是不是手机游戏 #include <graphics.h> #include <stdio.h> #include <dos.h> #include <conio.h> #include <time.h> #include <math.h> #include <stdlib.h> void draw_block(int x,int y,int style,int way); void kill_line(int y); void draw_little_block(int x,int y,int z,int style); int check_block(int x,int y,int style); int change(int *i,int *j,int key); int style1,style,score,speed,l; int board[10][20]; char str[100]; struct shape { int xy[8],next; }; struct shape shapes[19]= /* 19种方块(前 8个点表示4个小方块的相对位置 第9点表示类型) */ { { 0,-2, 0,-1, 0, 0, 1, 0, 1 }, {-1, 0, 0, 0, 1,-1, 1, 0, 2}, { 0,-2, 1,-2, 1,-1, 1, 0, 3}, {-1,-1,-1, 0, 0,-1, 1,-1, 0}, { 0,-2, 0,-1, 0, 0, 1,-2, 5}, {-1,-1, 0,-1, 1,-1, 1, 0, 6}, { 0, 0, 1,-2, 1,-1, 1, 0, 7}, {-1,-1,-1, 0, 0, 0, 1, 0, 4}, {-1, 0, 0,-1, 0, 0, 1, 0, 9}, { 0,-2, 0,-1, 0, 0, 1,-1,10}, {-1,-1, 0,-1, 1,-1, 0, 0,11}, { 0,-1, 1,-2, 1,-1, 1, 0, 8}, {-1, 0, 0,-1, 0, 0, 1,-1,13}, { 0,-2, 0,-1, 1,-1, 1, 0,12}, {-1,-1, 0,-1, 0, 0, 1, 0,15}, { 0,-1, 0, 0, 1,-2, 1,-1,14}, { 0,-3, 0,-2, 0,-1, 0, 0,17}, {-1, 0, 0, 0, 1, 0, 2, 0,16}, { 0,-1, 0, 0, 1,-1, 1, 0,18} }; #define MAPXOFT 9 /* 第1个方块的位置 */ #define MAPYOFT 5 #define MAPXOFT1 18 /* 下一个方块的位置 */ #define MAPYOFT1 17 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define ENTER 0x1c0d int main() { int gdriver,gmode, i,j,key,x0=5,y0=1,m,n,c,key1,p,q,le=0,b; l=1,score=0; gdriver=DETECT; initgraph(&gdriver,&gmode,"D:\\TURBOC2"); randomize(); for(m=0;m<=19;m++) for(n=0;n<=19;n++) board[m][n]=0; /* 初始游戏版 */ setcolor(10); /* 开机的画面 */ settextstyle(0,0,3); outtextxy(10,150,"WELCOME TO RUSSIS"); outtextxy(10,250,"READY GO"); setcolor(14); settextstyle (0,0,4); outtextxy(10,350,"^_^"); /* circle(400,350,60); ellipse(370,340,60,120,25,25); ellipse(430,340,60,120,25,25); ellipse(400,350,225,315,30,30);*/ getch(); settextstyle(0,0,1); cleardevice(); setcolor(LIGHTRED); /* 画出游戏所在的范围图 */ setlinestyle(0,0,3); setfillstyle(1,14); rectangle(157,419,533,429); floodfill(300,424,LIGHTRED); setcolor(LIGHTRED); setlinestyle(0,0,3); setfillstyle(1,14); rectangle(147,95,157,429); floodfill(152,200,LIGHTRED); setcolor(LIGHTRED); setlinestyle(0,0,3); setfillstyle(1,14); rectangle(323,95,333,429); floodfill(330,320,LIGHTRED); setcolor(LIGHTRED); setlinestyle(0,0,1); setfillstyle(1,BLUE); rectangle(450,50,500,70); floodfill(455,55,LIGHTRED); setcolor(10); for(m=0;m<=10;m=m+2) ellipse(240,94,0,180,84+m,84+m); setcolor(14); setfillstyle(1,0); circle(440,330,60); floodfill(440,330,14); outtextxy(420,80,"* you can change the game"); /* 对游戏的说明 */ outtextxy(440,90,"-speed and the gradth by"); /* 上为变形 左右 为 调整 下为快下 ESC为退出 */ outtextxy(440,100," using 'up'and'down'."); outtextxy(420,110,"* when you are plying the"); outtextxy(440,120,"game,you can use these pu"); outtextxy(440,130,"-tturns."); outtextxy(420,140,"* if you want to go into t"); outtextxy(440,150,"-he game,please 'enter'."); outtextxy(420,160,"* you can chang shapes "); outtextxy(440,170," using UP"); outtextxy(420,180,"* RIGHT and LEFT can" ); outtextxy(440,190," move shapes"); outtextxy(10,40,"GAMESPEED:"); outtextxy(10,100,"GRADTH:"); printf("\n\n\n 1"); printf("\n\n\n\n 0"); /* setcolor(LIGHTRED); setlinestyle(0,0,1); setfillstyle(1,10); rectangle(10,65,110,85); floodfill(15,75,LIGHTRED); */ outtextxy(450,40,"SCORES:"); outtextxy(10,190,"**The speed will"); outtextxy(10,200,"increas if score"); outtextxy(10,210,"increas 3"); for(p=0;p<=100;p++) /* 对速度的调整 */ { key=bioskey(0); if(key==ENTER) break; if(key==UP) { if(l==9) l=9; if(l<9) l++; } if(key==DOWN) { if(l==1) l=l; if(l>1) l--; } gotoxy(2,4); printf("%d",l); } for(q=0;q<=100;q++) /* 对高度的调整 */ { key=bioskey(0); if(key==ENTER) break; if(key==UP) { if(le==5) le=le; if(le<5) le++; } if(key==DOWN) { if(le==0) le=le; if(le>0) le--; } gotoxy(2,8); printf("%d",le); } key=bioskey(0); if(key==ENTER) { style=random(19); for(m=1;m<=le;m++) /* 具体的对高度的调整 */ { b=random(7)+1; for(n=1;n<=10;n++) { if(random(2)) { board[n-1][20-m]=1; draw_little_block(MAPXOFT+n,MAPYOFT+21-m,1,b); } } } while(1) { while(1) { i=x0,j=y0; style1=random(19); setcolor(14); /* 画出下一个方 块 */ draw_block(MAPXOFT1,MAPYOFT1,style1,1); for(j=y0;j<=20;j++) { while(1) { if(bioskey(1)) /* 方块的 调整 */ { key=bioskey(0); change(&i,&j,key); } if(!check_block (i,j+1,style)) /* 判断方块能不能下降 */ break; if(j==20) break; if(speed==1) { draw_block (i,j,style,0); /* 方块的下降 */ j++; draw_block (i,j,style,1); delay(10000); } if(speed!=1) { m++; delay (10000); if(m>=3*(10-l)) { m=0; draw_block (i,j,style,0); /* 方块的下降 */ j++; draw_block (i,j,style,1); } } } speed=0; for(m=0;m<=6;m+=2) /* 对有方块的位置给予1 的数值 */ board[i+shapes[style].xy[m]-1] [j+shapes[style].xy[m+1]-1]=1; if(board[ i][4]==1) { setcolor(14); settextstyle(0,0,2); outtextxy(10,450,"CAREFUL -_-"); delay(100000000); delay(100000000); setcolor(0); outtextxy(10,450,"CAREFUL -_-"); settextstyle(0,0,1); setcolor(LIGHTRED); } /* setcolor(LIGHTRED); setlinestyle(0,0,1); setfillstyle(1,10); rectangle(10,65,110,85); floodfill(15,75,LIGHTRED);*/ if(l==1) /* 显示当前游戏等级 */ { setcolor(LIGHTRED); setlinestyle(0,0,1); /* 容易的速度 */ setfillstyle(1,10); rectangle(10,65,110,85); floodfill(15,75,LIGHTRED); outtextxy(7,70," easy speed"); } if(l==4) { setcolor(BLACK); outtextxy(7,70," easy speed"); setcolor(LIGHTRED); /* 中等难度 */ setlinestyle(0,0,1); setfillstyle(1,10); rectangle(10,65,110,85); floodfill(15,75,LIGHTRED); outtextxy(7,70," normal speed"); } if(l==7) { setcolor(BLACK); outtextxy(7,70," normal speed"); setcolor(LIGHTRED); setlinestyle(0,0,1); /* 困难的难度 */ setfillstyle(1,10); rectangle(10,65,110,85); floodfill(15,75,LIGHTRED); outtextxy(7,70," hard speed"); } kill_line(j); if(j==20) break; if(!check_block(i,j+1,style)) break; } draw_block(MAPXOFT1,MAPYOFT1,style1,0); /* 对下1个方块显示位置进行覆盖 */ style=style1; /* 使的方块和显示的方块一样 */ if(j==1) /* 关机的画面 */ { setcolor(14); settextstyle(0,0,2); outtextxy(170,200,"GAME OVER"); outtextxy(170,240,"THANK YOU"); sleep(3); exit(0); } } } } getch(); } int change(int *i,int *j,int key) /* 方块的具体的变化( 移动 变形 下降) */ { if(key==UP&&check_block(*i,*j,shapes[style].next)) /* 变形 */ { draw_block(*i,*j,style,0); style=shapes[style].next; draw_block(*i,*j,style,1); } else if(key==LEFT&&check_block(*i-1,*j,style)) /* 移动 */ { draw_block(*i,*j,style,0); (*i)--; draw_block(*i,*j,style,1); } else if(key==RIGHT&&check_block(*i+1,*j,style)) { draw_block(*i,*j,style,0); (*i)++; draw_block(*i,*j,style,1); } else if(key==DOWN&&check_block(*i,*j+1,style)) /* 下降 */ { draw_block(*i,*j,style,0); (*j)++; draw_block(*i,*j,style,1); speed=1; } else if(key==ESC) /* 退出 */ exit(0); } void draw_block(int x,int y,int style,int way) /* 画出方块 的位置 */ { int x1=x+MAPXOFT,y1=y+MAPYOFT; int i; if(way==1) { setcolor(WHITE); } else { setcolor(BLACK); } for(i=0;i<=6;i+=2) { draw_little_block(x1+shapes[style].xy[ i],y1+shapes[style].xy[i+1],way,style); } } void draw_little_block(int x,int y,int z,int style) /* 画 出方块的每一个小方块的形状(方块的色彩) */ { int m,n; if(z==1) /* 对色彩的调整 */ { if(0<=style&&style<=3) n=2; if(4<=style&&style<=7) n=3; if(8<=style&&style<=11) n=4; if(12<=style&&style<=13) n=5; if(14<=style&&style<=15) n=6; if(16<=style&&style<=17) n=7; if(style==18) n=8; m=1; } if(z==0) { m=0,n=0; } setcolor(m); setfillstyle(1,n); rectangle(x*16,y*16,x*16+16,y*16+16); floodfill(x*16+2,y*16+2,m); } void kill_line(int y) /* 消行 */ { int i,t=1,j,k,color=random(7)+1; for(;y>=1&&t<=4;y--,t++) /* 对4行进行验证 */ { for(i=1;i<=10;i++) if(!board[i-1][y-1]) /* 严整1行的数组是不是全 为1 */ break; if(i==11) { setcolor(LIGHTRED); /* 对积分底色的画法 */ setlinestyle(0,0,1); setfillstyle(1,BLUE); rectangle(450,50,500,70); floodfill(455,55,LIGHTRED); score++; /* 每消去1行 可以得1分 */ setcolor(14); itoa(score,str,10); outtextxy(460,55,str); if(score!=0&&score%3==0) l++; /* 每次分到一定位置是 速度进 行提高(目前是3行加1次 可以调整) */ setcolor(14); /* 每次消去是进行庆祝模式 */ settextstyle(0,0,4); outtextxy(10,310,"COOL"); outtextxy(10,270,"^_^"); delay(100000000); delay(100000000); delay(100000000); setcolor(BLACK); settextstyle(0,0,4); outtextxy(10,310,"COOL"); outtextxy(10,270,"^_^"); settextstyle(0,0,1); if(score%3==0&&score!=0) { setcolor(14); settextstyle(0,0,2); outtextxy(10,435,"CONGRATULATION ON YOU ^_^"); sleep(2); setcolor(BLACK); settextstyle(0,0,2); outtextxy(10,435,"CONGRATULATION ON YOU ^_^ "); settextstyle(0,0,1); } for(k=1;k<=10;k++) /* 对满了行进行消去 */ { setcolor(BLACK); draw_little_block (k+MAPXOFT,y+MAPYOFT,0,2); } for(j=y-1;j>=1;j--) /* 消去1行后 用上面的 累下来(并且调整色彩) */ for(k=1;k<=10;k++) { board[k-1][j]=board[k-1][j-1]; if(board[k-1][j]) { setcolor(BLACK); draw_little_block (k+MAPXOFT,j+MAPYOFT,0,2); setcolor(WHITE); draw_little_block (k+MAPXOFT,j+1+MAPYOFT,1,color); } } delay(100000000000); y++; } } } int check_block(int x,int y,int style) /* 验证能不能往下1 个位置累方块 */ { int x1=x+MAPXOFT,y1=y+MAPYOFT; int x2,y2,i; for(i=0;i<=6;i+=2) { x2=x1+shapes[style].xy[ i]; y2=y1+shapes[style].xy[i+1]; if(x2>=10&&x2<20&&y2<26&&(y2<6||board[x2-10][y2- 6]==0)) continue; else break; } if(i==8) return 1; else return 0; getch(); }
- 2021-02-22 09:55:01
- 金牛科技
- #pragma once#include "afxwin.h"#include "Resource.h"const int BLOCK_LINE = 20;const int BLOCK_ROW = 10;class CBlock{public: CBlock(void); ~CBlock(void);private: int m_BlockShape; int m_nextBlockShape; int m_BlockState; int m_BlockLevel; int m_BlockCurDelLine; bool m_blockRunning; POINT m_BlockPos[4]; POINT m_nextBlockPos[4]; int m_Blockmap[BLOCK_LINE][BLOCK_ROW];public: void BlockInit( void );private: CBitmap m_bmpBlock[7];public: void CreateNewBlock(void); void MakeNewBlock(int shape, POINT pt[], int xPos); //CDC memDC; void DrawBlock(CDC* pDC); void BlockDropDown(CDC* pDC); void HideBlock(CDC* pDC);private: CBitmap m_bmpBKGND;public: void DrawNextBlock( CDC* pDC ); void BlockLeft(CDC* pDC); void BlockRight(CDC* pDC); void BlockFastDown(CDC* pDC); void ChangeState(CDC* pDC); void DeleteLine(CDC* pDC, int LineNum, bool start); bool BlockGameOver(void); void BlockScore(int del, CDC* pDC); bool BlockLevelUp(void); int BlockSpeed(void);};#include "StdAfx.h"#include "Block.h"CBlock::CBlock(void){ srand( (unsigned)time(NULL) ); m_BlockShape = 0; m_nextBlockShape = rand()%7; m_BlockState = 0; m_BlockLevel = 1; m_BlockCurDelLine = 0; m_blockRunning = false; memset(m_Blockmap, 0, sizeof(m_Blockmap) );}CBlock::~CBlock(void){}void CBlock::BlockInit( void ){ for( int i=0; i<7; i++) { m_bmpBlock[i].LoadBitmapW( IDB_BLOCKBAR+i ); } m_bmpBKGND.LoadBitmapW( IDB_BMPBACK );}void CBlock::CreateNewBlock(void){ m_BlockShape = m_nextBlockShape; m_nextBlockShape = rand()%7; m_BlockState = 0; MakeNewBlock( m_BlockShape, m_BlockPos, 4 );}void CBlock::MakeNewBlock(int shape, POINT pt[], int xPos){ switch(shape) { case 0: for(int i=0; i<4; i++) { pt[i].x=i+xPos; pt[i].y=0; } break; case 1: pt[0].x = 1+xPos; pt[0].y = 0; for(int i=1; i<4; i++) { pt[i].x = i-1+xPos; pt[i].y = 1; } break; case 2: pt[0].x = 0+xPos; pt[0].y = 0; pt[1].x = 1+xPos; pt[1].y = 0; pt[2].x = 1+xPos; pt[2].y = 1; pt[3].x = 2+xPos; pt[3].y = 1; break; case 3: pt[0].x = 0+xPos; pt[0].y = 1; pt[1].x = 1+xPos; pt[1].y = 1; pt[2].x = 1+xPos; pt[2].y = 0; pt[3].x = 2+xPos; pt[3].y = 0; break; case 4: pt[0].x = 0+xPos; pt[0].y = 0; for(int i=1; i<4; i++) { pt[i].x = i-1+xPos; pt[i].y = 1; } break; case 5: pt[0].x = 2+xPos; pt[0].y = 0; for(int i=1; i<4; i++) { pt[i].x = i-1+xPos; pt[i].y = 1; } break; case 6: for(int i=0; i<2; i++) { pt[i].x = i+xPos; pt[i].y = 0; pt[i+2].x = i+xPos; pt[i+2].y = 1; } break; default: break; }}void CBlock::DrawBlock(CDC* pDC){ //BlockInit(); //MakeNewBlock( m_BlockShape, m_BlockPos, 4 ); CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject( &m_bmpBlock[m_BlockShape] ) ; int x = BLOCK_X; int y = BLOCK_Y; for( int i = 0; i<4; i++ ) { x = BLOCK_X + m_BlockPos[i].x*BLOCK_WIDTH; y = BLOCK_Y + m_BlockPos[i].y*BLOCK_HEIGHT; pDC->BitBlt( x, y, 20, 20, &memDC, 0, 0, SRCCOPY ); }}void CBlock::BlockDropDown( CDC* pDC ){ int i,j; bool bAbleDrop = true; for( i=0; i<4; i++ ) { if( 19 == m_BlockPos[i].y || 0 != m_Blockmap[m_BlockPos[i].y+1][m_BlockPos[i].x] ) { bAbleDrop = false; break; } } if( true == bAbleDrop ) { HideBlock( pDC ); for( i=0; i<4; i++ ) { m_BlockPos[i].y++; } DrawBlock( pDC ); } else { for( i=0; i<4; i++ ) { m_Blockmap[m_BlockPos[i].y][m_BlockPos[i].x] = m_BlockShape+1; } for( i=0; i<20; i++ ) { for( j=0; j<10; j++ ) { if( 0 == m_Blockmap[i][j] ) { break; } } if( 10 == j ) { DeleteLine( pDC, i, false ); m_BlockCurDelLine++; BlockScore(1, pDC ); } } CreateNewBlock(); MakeNewBlock( m_BlockShape, m_BlockPos, 4 ); DrawBlock( pDC ); DrawNextBlock( pDC ); }}void CBlock::HideBlock(CDC* pDC){ CDC bkDC; bkDC.CreateCompatibleDC(pDC); bkDC.SelectObject(m_bmpBKGND); int x, y; for( int i=0; i<4; i++ ) { x = BLOCK_X+BLOCK_WIDTH*m_BlockPos[i].x; y = BLOCK_Y+BLOCK_HEIGHT*m_BlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, x, y, SRCCOPY ); } bkDC.DeleteDC();}void CBlock::DrawNextBlock( CDC* pDC ){ CDC bkDC; bkDC.CreateCompatibleDC( pDC ); bkDC.SelectObject( m_bmpBKGND ); int x ,y; pDC->BitBlt( NEXTBLOCK_X, NEXTBLOCK_Y, NEXTBLOCK_WIDTH, NEXTBLOCK_HEIGHT, &bkDC, NEXTBLOCK_X, NEXTBLOCK_Y, SRCCOPY ); MakeNewBlock( m_nextBlockShape, m_nextBlockPos, 0 ); bkDC.SelectObject( m_bmpBlock[m_nextBlockShape] ); if( 0 == m_nextBlockShape ) { for( int i=0; i<4; i++ ) { x = NEXTBLOCK_X + 15 + BLOCK_WIDTH*m_nextBlockPos[i].x; y = NEXTBLOCK_Y + 47 + BLOCK_HEIGHT*m_nextBlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, 0, 0, SRCCOPY ); } } else if( 6 == m_nextBlockShape ) { for( int i=0; i<4; i++ ) { x = NEXTBLOCK_X + 35 + BLOCK_WIDTH*m_nextBlockPos[i].x; y = NEXTBLOCK_Y + 38 + BLOCK_HEIGHT*m_nextBlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, 0, 0, SRCCOPY ); } } else { for( int i=0; i<4; i++ ) { x = NEXTBLOCK_X + 24 + BLOCK_WIDTH*m_nextBlockPos[i].x; y = NEXTBLOCK_Y + 38 + BLOCK_HEIGHT*m_nextBlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, 0, 0, SRCCOPY ); } }}void CBlock::BlockLeft(CDC* pDC){ for( int i=0; i<4; i++ ) { if( m_BlockPos[i].x <= 0 ) return; if( 0 != m_Blockmap[m_BlockPos[i].y][m_BlockPos[i].x-1] ) return; } HideBlock( pDC ); for( int i=0; i<4; i++ ) { m_BlockPos[i].x -= 1; } DrawBlock( pDC );}void CBlock::BlockRight(CDC* pDC){ for( int i=0; i<4; i++ ) { if( m_BlockPos[i].x >= 9 ) return; if( 0 != m_Blockmap[m_BlockPos[i].y][m_BlockPos[i].x+1] ) return; } HideBlock( pDC ); for( int i=0; i<4; i++ ) { m_BlockPos[i].x += 1; } DrawBlock( pDC );}void CBlock::BlockFastDown(CDC* pDC){ for( int i=0; i<4; i++ ) { if( m_BlockPos[i].y >= 19 ) return; if( 0 != m_Blockmap[m_BlockPos[i].y+1][m_BlockPos[i].x] ) return; } HideBlock( pDC ); for( int i=0; i<4; i++ ) { m_BlockPos[i].y += 1; } DrawBlock( pDC );}#include "StdAfx.h"#include "Block.h"CBlock::CBlock(void){ srand( (unsigned)time(NULL) ); m_BlockShape = 0; m_nextBlockShape = rand()%7; m_BlockState = 0; m_BlockLevel = 1; m_BlockCurDelLine = 0; m_blockRunning = false; memset(m_Blockmap, 0, sizeof(m_Blockmap) );}CBlock::~CBlock(void){}void CBlock::BlockInit( void ){ for( int i=0; i<7; i++) { m_bmpBlock[i].LoadBitmapW( IDB_BLOCKBAR+i ); } m_bmpBKGND.LoadBitmapW( IDB_BMPBACK );}void CBlock::CreateNewBlock(void){ m_BlockShape = m_nextBlockShape; m_nextBlockShape = rand()%7; m_BlockState = 0; MakeNewBlock( m_BlockShape, m_BlockPos, 4 );}void CBlock::MakeNewBlock(int shape, POINT pt[], int xPos){ switch(shape) { case 0: for(int i=0; i<4; i++) { pt[i].x=i+xPos; pt[i].y=0; } break; case 1: pt[0].x = 1+xPos; pt[0].y = 0; for(int i=1; i<4; i++) { pt[i].x = i-1+xPos; pt[i].y = 1; } break; case 2: pt[0].x = 0+xPos; pt[0].y = 0; pt[1].x = 1+xPos; pt[1].y = 0; pt[2].x = 1+xPos; pt[2].y = 1; pt[3].x = 2+xPos; pt[3].y = 1; break; case 3: pt[0].x = 0+xPos; pt[0].y = 1; pt[1].x = 1+xPos; pt[1].y = 1; pt[2].x = 1+xPos; pt[2].y = 0; pt[3].x = 2+xPos; pt[3].y = 0; break; case 4: pt[0].x = 0+xPos; pt[0].y = 0; for(int i=1; i<4; i++) { pt[i].x = i-1+xPos; pt[i].y = 1; } break; case 5: pt[0].x = 2+xPos; pt[0].y = 0; for(int i=1; i<4; i++) { pt[i].x = i-1+xPos; pt[i].y = 1; } break; case 6: for(int i=0; i<2; i++) { pt[i].x = i+xPos; pt[i].y = 0; pt[i+2].x = i+xPos; pt[i+2].y = 1; } break; default: break; }}void CBlock::DrawBlock(CDC* pDC){ CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject( &m_bmpBlock[m_BlockShape] ) ; int x = BLOCK_X; int y = BLOCK_Y; for( int i = 0; i<4; i++ ) { x = BLOCK_X + m_BlockPos[i].x*BLOCK_WIDTH; y = BLOCK_Y + m_BlockPos[i].y*BLOCK_HEIGHT; pDC->BitBlt( x, y, 20, 20, &memDC, 0, 0, SRCCOPY ); }}void CBlock::BlockDropDown( CDC* pDC ){ int i,j; bool bAbleDrop = true; for( i=0; i<4; i++ ) { if( 19 == m_BlockPos[i].y || 0 != m_Blockmap[m_BlockPos[i].y+1][m_BlockPos[i].x] ) { bAbleDrop = false; break; } } if( true == bAbleDrop ) { HideBlock( pDC ); for( i=0; i<4; i++ ) { m_BlockPos[i].y++; } DrawBlock( pDC ); } else { for( i=0; i<4; i++ ) { m_Blockmap[m_BlockPos[i].y][m_BlockPos[i].x] = m_BlockShape+1; } for( i=0; i<20; i++ ) { for( j=0; j<10; j++ ) { if( 0 == m_Blockmap[i][j] ) { break; } } if( 10 == j ) { DeleteLine( pDC, i, false ); m_BlockCurDelLine++; BlockScore(1, pDC ); } } CreateNewBlock(); MakeNewBlock( m_BlockShape, m_BlockPos, 4 ); DrawBlock( pDC ); DrawNextBlock( pDC ); }}void CBlock::HideBlock(CDC* pDC){ CDC bkDC; bkDC.CreateCompatibleDC(pDC); bkDC.SelectObject(m_bmpBKGND); int x, y; for( int i=0; i<4; i++ ) { x = BLOCK_X+BLOCK_WIDTH*m_BlockPos[i].x; y = BLOCK_Y+BLOCK_HEIGHT*m_BlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, x, y, SRCCOPY ); } bkDC.DeleteDC();}void CBlock::DrawNextBlock( CDC* pDC ){ CDC bkDC; bkDC.CreateCompatibleDC( pDC ); bkDC.SelectObject( m_bmpBKGND ); int x ,y; pDC->BitBlt( NEXTBLOCK_X, NEXTBLOCK_Y, NEXTBLOCK_WIDTH, NEXTBLOCK_HEIGHT, &bkDC, NEXTBLOCK_X, NEXTBLOCK_Y, SRCCOPY ); MakeNewBlock( m_nextBlockShape, m_nextBlockPos, 0 ); bkDC.SelectObject( m_bmpBlock[m_nextBlockShape] ); if( 0 == m_nextBlockShape ) { for( int i=0; i<4; i++ ) { x = NEXTBLOCK_X + 15 + BLOCK_WIDTH*m_nextBlockPos[i].x; y = NEXTBLOCK_Y + 47 + BLOCK_HEIGHT*m_nextBlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, 0, 0, SRCCOPY ); } } else if( 6 == m_nextBlockShape ) { for( int i=0; i<4; i++ ) { x = NEXTBLOCK_X + 35 + BLOCK_WIDTH*m_nextBlockPos[i].x; y = NEXTBLOCK_Y + 38 + BLOCK_HEIGHT*m_nextBlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, 0, 0, SRCCOPY ); } } else { for( int i=0; i<4; i++ ) { x = NEXTBLOCK_X + 24 + BLOCK_WIDTH*m_nextBlockPos[i].x; y = NEXTBLOCK_Y + 38 + BLOCK_HEIGHT*m_nextBlockPos[i].y; pDC->BitBlt( x, y, BLOCK_WIDTH, BLOCK_HEIGHT, &bkDC, 0, 0, SRCCOPY ); } }}void CBlock::BlockLeft(CDC* pDC){ for( int i=0; i<4; i++ ) { if( m_BlockPos[i].x <= 0 ) return; if( 0 != m_Blockmap[m_BlockPos[i].y][m_BlockPos[i].x-1] ) return; } HideBlock( pDC ); for( int i=0; i<4; i++ ) { m_BlockPos[i].x -= 1; } DrawBlock( pDC );}void CBlock::BlockRight(CDC* pDC){ for( int i=0; i<4; i++ ) { if( m_BlockPos[i].x >= 9 ) return; if( 0 != m_Blockmap[m_BlockPos[i].y][m_BlockPos[i].x+1] ) return; } HideBlock( pDC ); for( int i=0; i<4; i++ ) { m_BlockPos[i].x += 1; } DrawBlock( pDC );}void CBlock::BlockFastDown(CDC* pDC){ for( int i=0; i<4; i++ ) { if( m_BlockPos[i].y >= 19 ) return; if( 0 != m_Blockmap[m_BlockPos[i].y+1][m_BlockPos[i].x] ) return; } HideBlock( pDC ); for( int i=0; i<4; i++ ) { m_BlockPos[i].y += 1; } DrawBlock( pDC );}
- 2021-02-11 20:31:55
- 好牛通
- 求用JAVA编写俄罗斯方块游戏的源代码,俄罗斯方块——java源代码提供 import java.awt.*; import java.awt.event.*; //俄罗斯方块类 public class ERS_Block extends Frame{ public static boolean isPlay=false; public static int level=1,score=0; public static TextField scoreField,levelField; public static MyTimer timer; GameCanvas gameScr; public static void main(String[] argus){ ERS_Block ers = new ERS_Block("俄罗斯方块游戏 V1.0 Author:Vincent"); WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener); } //俄罗斯方块类的构造方法 ERS_Block(String title){ super(title); setSize(600,480); setLayout(new GridLayout(1,2)); gameScr = new GameCanvas(); gameScr.addKeyListener(gameScr); timer = new MyTimer(gameScr); timer.setDaemon(true); timer.start(); timer.suspend(); add(gameScr); Panel rightScr = new Panel(); rightScr.setLayout(new GridLayout(2,1,0,30)); rightScr.setSize(120,500); add(rightScr); //右边信息窗体的布局 MyPanel infoScr = new MyPanel(); infoScr.setLayout(new GridLayout(4,1,0,5)); infoScr.setSize(120,300); rightScr.add(infoScr); //定义标签和初始值 Label scorep = new Label("分数:",Label.LEFT); Label levelp = new Label("级数:",Label.LEFT); scoreField = new TextField(8); levelField = new TextField(8); scoreField.setEditable(false); levelField.setEditable(false); infoScr.add(scorep); infoScr.add(scoreField); infoScr.add(levelp); infoScr.add(levelField); scorep.setSize(new Dimension(20,60)); scoreField.setSize(new Dimension(20,60)); levelp.setSize(new Dimension(20,60)); levelField.setSize(new Dimension(20,60)); scoreField.setText("0"); levelField.setText("1"); //右边控制按钮窗体的布局 MyPanel controlScr = new MyPanel(); controlScr.setLayout(new GridLayout(5,1,0,5)); rightScr.add(controlScr); //定义按钮play Button play_b = new Button("开始游戏"); play_b.setSize(new Dimension(50,200)); play_b.addActionListener(new Command(Command.button_play,gameScr)); //定义按钮Level UP Button level_up_b = new Button("提高级数"); level_up_b.setSize(new Dimension(50,200)); level_up_b.addActionListener(new Command(Command.button_levelup,gameScr)); //定义按钮Level Down Button level_down_b =new Button("降低级数"); level_down_b.setSize(new Dimension(50,200)); level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr)); //定义按钮Level Pause Button pause_b =new Button("游戏暂停"); pause_b.setSize(new Dimension(50,200)); pause_b.addActionListener(new Command(Command.button_pause,gameScr)); //定义按钮Quit Button quit_b = new Button("退出游戏"); quit_b.setSize(new Dimension(50,200)); quit_b.addActionListener(new Command(Command.button_quit,gameScr)); controlScr.add(play_b); controlScr.add(level_up_b); controlScr.add(level_down_b); controlScr.add(pause_b); controlScr.add(quit_b); setVisible(true); gameScr.requestFocus(); } } //重写MyPanel类,使Panel的四周留空间 class MyPanel extends Panel{ public Insets getInsets(){ return new Insets(30,50,30,50); } } //游戏画布类 class GameCanvas extends Canvas implements KeyListener{ final int unitSize = 30; //小方块边长 int rowNum; //正方格的行数 int columnNum; //正方格的列数 int maxAllowRowNum; //允许有多少行未削 int blockInitRow; //新出现块的起始行坐标 int blockInitCol; //新出现块的起始列坐标 int [][] scrArr; //屏幕数组 Block b; //对方快的引用 //画布类的构造方法 GameCanvas(){ rowNum = 15; columnNum = 10; maxAllowRowNum = rowNum - 2; b = new Block(this); blockInitRow = rowNum - 1; blockInitCol = columnNum/2 - 2; scrArr = new int [32][32]; } //初始化屏幕,并将屏幕数组清零的方法 void initScr(){ for(int i=0;i<rowNum;i++) for (int j=0; j<columnNum;j++) scrArr[j]=0; b.reset(); repaint(); } //重新刷新画布方法 public void paint(Graphics g){ for(int i = 0; i < rowNum; i++) for(int j = 0; j < columnNum; j++) drawUnit(i,j,scrArr[j]); } //画方块的方法 public void drawUnit(int row,int col,int type){ scrArr[row][col] = type; Graphics g = getGraphics(); tch(type){ //表示画方快的方法 case 0: g.setColor(Color.black);break; //以背景为颜色画 case 1: g.setColor(Color.blue);break; //画正在下落的方块 case 2: g.setColor(Color.magenta);break; //画已经落下的方法 } g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true); g.dispose(); } public Block getBlock(){ return b; //返回block实例的引用 } //返回屏幕数组中(row,col)位置的属性值 public int getScrArrXY(int row,int col){ if (row < 0 || row >= rowNum || col < 0 || col >= columnNum) return(-1); else return(scrArr[row][col]); } //返回新块的初始行坐标方法 public int getInitRow(){ return(blockInitRow); //返回新块的初始行坐标 } //返回新块的初始列坐标方法 public int getInitCol(){ return(blockInitCol); //返回新块的初始列坐标 } //满行删除方法 void deleteFullLine(){ int full_line_num = 0; int k = 0; for (int i=0;i<rowNum;i++){ boolean isfull = true; L1:for(int j=0;j<columnNum;j++) if(scrArr[j] == 0){ k++; isfull = false; break L1; } if(isfull) full_line_num++; if(k!=0 && k-1!=i && !isfull) for(int j = 0; j < columnNum; j++){ if (scrArr[j] == 0) drawUnit(k-1,j,0); else drawUnit(k-1,j,2); scrArr[k-1][j] = scrArr[j]; } } for(int i = k-1 ;i < rowNum; i++){ for(int j = 0; j < columnNum; j++){ drawUnit(i,j,0); scrArr[j]=0; } } ERS_Block.score += full_line_num; ERS_Block.scoreField.setText(""+ERS_Block.score); } //判断游戏是否结束方法 boolean isGameEnd(){ for (int col = 0 ; col <columnNum; col ++){ if(scrArr[maxAllowRowNum][col] !=0) return true; } return false; } public void keyTyped(KeyEvent e){ } public void keyReleased(KeyEvent e){ } //处理键盘输入的方法 public void keyPressed(KeyEvent e){ if(!ERS_Block.isPlay) return; tch(e.getKeyCode()){ case KeyEvent.VK_DOWN:b.fallDown();break; case KeyEvent.VK_LEFT:b.leftMove();break; case KeyEvent.VK_RIGHT:b.rightMove();break; case KeyEvent.VK_SPACE:b.leftTurn();break; } } } //处理控制类 class Command implements ActionListener{ static final int button_play = 1; //给按钮分配编号 static final int button_levelup = 2; static final int button_leveldown = 3; static final int button_quit = 4; static final int button_pause = 5; static boolean pause_resume = true; int curButton; //当前按钮 GameCanvas scr; //控制按钮类的构造方法 Command(int button,GameCanvas scr){ curButton = button; this.scr=scr; } //按钮执行方法 public void actionPerformed (ActionEvent e){ tch(curButton){ case button_play:if(!ERS_Block.isPlay){ scr.initScr(); ERS_Block.isPlay = true; ERS_Block.score = 0; ERS_Block.scoreField.setText("0"); ERS_Block.timer.resume(); } scr.requestFocus(); break; case button_levelup:if(ERS_Block.level < 10){ ERS_Block.level++; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText(""+ERS_Block.score); } scr.requestFocus(); break; case button_leveldown:if(ERS_Block.level > 1){ ERS_Block.level--; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText(""+ERS_Block.score); } scr.requestFocus(); break; case button_pause:if(pause_resume){ ERS_Block.timer.suspend(); pause_resume = false; }else{ ERS_Block.timer.resume(); pause_resume = true; } scr.requestFocus(); break; case button_quit:System.exit(0); } } } //方块类 class Block { static int[][] pattern = { {0x0f00,0x4444,0x0f00,0x4444},//用十六进至表示,本行表示长条四种状态 {0x04e0,0x0464,0x00e4,0x04c4}, {0x4620,0x6c00,0x4620,0x6c00}, {0x2640,0xc600,0x2640,0xc600}, {0x6220,0x1700,0x2230,0x0740}, {0x6440,0x0e20,0x44c0,0x8e00}, {0x0660,0x0660,0x0660,0x0660} }; int blockType; //块的模式号(0-6) int turnState; //块的翻转状态(0-3) int blockState; //快的下落状态 int row,col; //块在画布上的坐标 GameCanvas scr; //块类的构造方法 Block(GameCanvas scr){ this.scr = scr; blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); } //重新初始化块,并显示新块 public void reset(){ blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); dispBlock(1); } //实现“块”翻转的方法 public void leftTurn(){ if(assertValid(blockType,(turnState + 1)%4,row,col)){ dispBlock(0); turnState = (turnState + 1)%4; dispBlock(1); } } //实现“块”的左移的方法 public void leftMove(){ if(assertValid(blockType,turnState,row,col-1)){ dispBlock(0); col--; dispBlock(1); } } //实现块的右移 public void rightMove(){ if(assertValid(blockType,turnState,row,col+1)){ dispBlock(0); col++; dispBlock(1); } } //实现块落下的操作的方法 public boolean fallDown(){ if(blockState == 2) return(false); if(assertValid(blockType,turnState,row-1,col)){ dispBlock(0); row--; dispBlock(1); return(true); }else{ blockState = 2; dispBlock(2); return(false); } } //判断是否正确的方法 boolean assertValid(int t,int s,int row,int col){ int k = 0x8000; for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ if((int)(pattern[t][s]&k) != 0){ int temp = scr.getScrArrXY(row-i,col+j); if (temp<0||temp==2) return false; } k = k >> 1; } } return true; } //同步显示的方法 public synchronized void dispBlock(int s){ int k = 0x8000; for (int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ if(((int)pattern[blockType][turnState]&k) != 0){ scr.drawUnit(row-i,col+j,s); } k=k>>1; } } } } //定时线程 class MyTimer extends Thread{ GameCanvas scr; public MyTimer(GameCanvas scr){ this.scr = scr; } public void run(){ while(true){ try{ sleep((10-ERS_Block.level + 1)*100); } catch(InterruptedException e){} if(!scr.getBlock().fallDown()){ scr.deleteFullLine(); if(scr.isGameEnd()){ ERS_Block.isPlay = false; suspend(); }else scr.getBlock().reset(); } } } } class WinListener extends WindowAdapter{ public void windowClosing (WindowEvent l){ System.exit(0); } } 22
- 2021-02-11 20:31:55