基本信息
源码名称:c++ 俄罗斯方块 游戏源码下载
源码大小:0.02M
文件格式:.cpp
开发语言:C/C++
更新时间:2015-04-02
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
// 俄罗斯方块.cpp : Defines the entry point for the application. // Download by http://www.codefans.net #include "stdafx.h" #include <windows.h> #include <stdlib.h> #include "mmsystem.h" #include "resource.h" const POINT apt[7][4][4]={{{120,0,140,0,140,20,160,0},{120,20,140,20,140,0,160,20},{120,20,140,0,140,40,140,20},{140,20,140,0,160,20,140,40}}, {{120,0,120,20,140,20,160,20},{120,0,120,20,120,40,140,0},{120,0,140,0,160,0,160,20},{120,40,140,0,140,20,140,40}}, {{140,0,140,20,160,0,160,20},{140,0,140,20,160,0,160,20},{140,0,140,20,160,0,160,20},{140,0,140,20,160,0,160,20}}, {{140,0,140,20,140,40,140,60},{120,40,140,40,160,40,180,40},{140,0,140,20,140,40,140,60},{120,40,140,40,160,40,180,40}}, {{120,20,140,20,160,20,160,0},{120,0,120,20,120,40,140,40},{120,0,120,20,140,0,160,0},{120,0,140,0,140,20,140,40}}, {{120,0,140,0,140,20,160,20},{120,20,120,40,140,0,140,20},{120,0,140,0,140,20,160,20},{120,20,120,40,140,0,140,20}}, {{120,20,140,20,140,0,160,0},{120,0,120,20,140,20,140,40},{120,20,140,20,140,0,160,0},{120,0,120,20,140,20,140,40}}}; int sx,sy; //图形函数的变量 //int px,py; int cfk[300][480]; //存方块数组 HBRUSH color[8]; int m,n; static int f; //分数 static int dj; //等级 struct frect { int x; int y; int dir; int sharp; }Pos; static TCHAR str[256]; void fangkuai(HDC hdc,int x,int y,int col); void huabk(HDC hdc,int x,int y,int x1,int y1); BOOL gameover(void); void tuxing(HDC hdc,int dir,int sharp,int x,int y,int col); void Init(void); BOOL save(HDC hdc,int dir,int sharp,int x,int y); void load(HDC hdc); void hua(HDC hdc); BOOL check(int dir,int sharp,int x,int y); void CALLBACK timerProc(HWND hwnd,UINT message,UINT timerid,DWORD timer); void ScrollLeft(TCHAR *str); LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { // TODO: Place code here. HWND hwnd; MSG msg; static TCHAR szappname[]=TEXT("俄罗斯方块"); WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=wndproc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); wndclass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szappname; RegisterClass(&wndclass); HMENU hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)); hwnd=CreateWindow(szappname,TEXT("俄罗斯方块"),WS_MINIMIZEBOX|WS_SYSMENU,480,100,406,532, NULL,hMenu,hInstance,NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,NULL,NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static HWND hwndbutton,hwndbutton1,hwndbutton2,hwndbutton3,hwndedit,hwndedit1,hwndedit2,hwndedit3; HDC hdc; PAINTSTRUCT ps; static HINSTANCE hInstance; static int speed=600; static int pause=1; int line; switch(message) { case WM_CREATE: { //PlaySound(TEXT("1/神话主题曲.wav"),NULL,SND_FILENAME|SND_ASYNC|SND_LOOP); color[0]=CreateSolidBrush(RGB(0,0,0)); //白刷 color[1]=CreateSolidBrush(RGB(0,255,0)); //绿刷 color[2]=CreateSolidBrush(RGB(255,0,0)); //红刷 hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("暂停"),WS_CHILD|WS_VISIBLE,320,140,80,40,hwnd,(HMENU)1,hInstance,NULL); hwndbutton1=CreateWindow(TEXT("BUTTON"),TEXT("退出"),WS_CHILD|WS_VISIBLE,320,200,80,40,hwnd,(HMENU)2,hInstance,NULL); hwndbutton2=CreateWindow(TEXT("BUTTON"),TEXT("新游戏"),WS_CHILD|WS_VISIBLE,320,260,80,40,hwnd,(HMENU)3,hInstance,NULL); hwndbutton3=CreateWindow(TEXT("BUTTON"),TEXT("确定"),WS_CHILD|WS_VISIBLE,320,450,80,30,hwnd,(HMENU)4,hInstance,NULL); hwndedit=CreateWindow(TEXT("EDIT"),TEXT("分数:0"),WS_CHILD|WS_VISIBLE|ES_READONLY,320,320,80,20,hwnd,(HMENU)5,hInstance,NULL); hwndedit1=CreateWindow(TEXT("EDIT"),TEXT("等级:1"),WS_CHILD|WS_VISIBLE|ES_READONLY,320,350,80,20,hwnd,(HMENU)6,hInstance,NULL); hwndedit2=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD|WS_VISIBLE,320,380,80,20,hwnd,(HMENU)7,hInstance,NULL); hwndedit3=CreateWindow(TEXT("EDIT"),TEXT(""),WS_CHILD|WS_VISIBLE|ES_READONLY,320,410,80,20,hwnd,(HMENU)8,hInstance,NULL); SetTimer(hwnd,1,speed,NULL); SetTimer(hwnd,2,400,timerProc); return 0; } case WM_PAINT: { hdc=BeginPaint(hwnd,&ps); hua(hdc); load(hdc); huabk(hdc,300,0,0,460); huabk(hdc,0,0,0,460); Init(); tuxing(hdc,Pos.dir,Pos.sharp,220,20,1); tuxing(hdc,Pos.dir,Pos.sharp,0,0,1); EndPaint(hwnd,&ps); return 0; } case WM_TIMER: { hdc=GetDC(hwnd); if(check(Pos.dir,Pos.sharp,Pos.x,Pos.y 20)) { tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,0); Pos.y=Pos.y 20; tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,1); } else { if(gameover()) { PlaySound(TEXT("1/luodi.wav"),NULL,SND_FILENAME|SND_ASYNC); line=save(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y); if(line==1) { TCHAR fs[256]; f =10; wsprintf(fs,"分数:%d",f); SetDlgItemText(hwnd,5,fs); if(f==100) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==200) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==400) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==800) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==1000) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==2000) { KillTimer(hwnd,1); MessageBox(NULL,TEXT(""),TEXT(""),MB_OK); ZeroMemory(cfk,sizeof(cfk)); InvalidateRect(hwnd,NULL,FALSE); } } else if(line>=2&&line<4) { TCHAR fs[256]; f =20; wsprintf(fs,"分数:%d",f); SetDlgItemText(hwnd,5,fs); if(f==100) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==200) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==400) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==800) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==1000) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==2000) { KillTimer(hwnd,1); MessageBox(NULL,TEXT(""),TEXT(""),MB_OK); ZeroMemory(cfk,sizeof(cfk)); InvalidateRect(hwnd,NULL,FALSE); } } else if(line>=4&&line<8) { TCHAR fs[256]; f =40; wsprintf(fs,"分数:%d",f); SetDlgItemText(hwnd,5,fs); if(f==100) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==200) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==400) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==800) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==1000) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==2000) { KillTimer(hwnd,1); MessageBox(NULL,TEXT(""),TEXT(""),MB_OK); ZeroMemory(cfk,sizeof(cfk)); InvalidateRect(hwnd,NULL,FALSE); } } else if(line>=8) { TCHAR fs[256]; f =160; wsprintf(fs,"分数:%d",f); SetDlgItemText(hwnd,5,fs); if(f==100) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==200) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==400) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==800) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==1000) { TCHAR dj1[256]; dj ; wsprintf(dj1,"等级:%d",dj); SetDlgItemText(hwnd,6,dj1); } if(f==2000) { KillTimer(hwnd,1); MessageBox(NULL,TEXT(""),TEXT(""),MB_OK); ZeroMemory(cfk,sizeof(cfk)); InvalidateRect(hwnd,NULL,FALSE); } } Init(); speed=600; SetTimer(hwnd,1,speed,NULL); InvalidateRect(hwnd,0,FALSE); } else { KillTimer(hwnd,1); PlaySound(TEXT("1/结束.wav"),NULL,SND_FILENAME|SND_ASYNC); int i=MessageBox(NULL,TEXT(".......@_@是否重来@_@......"),TEXT("提示"),MB_OKCANCEL); if(i==IDOK) { ZeroMemory(cfk,sizeof(cfk)); InvalidateRect(hwnd,0,FALSE); SetTimer(hwnd,1,speed,NULL); } } } ReleaseDC(hwnd,hdc); return 0; } case WM_KEYDOWN: { hdc=GetDC(hwnd); switch(wParam) { case VK_UP: case VK_SPACE: { if(check(Pos.dir,(Pos.sharp 1)%4,Pos.x,Pos.y)) //同个函数传替的参数值不同,其每个函数返回的值也不同。 { PlaySound(TEXT("1/xuanzhuan.wav"),NULL,SND_FILENAME|SND_ASYNC); tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,0); Pos.sharp%=4; //使用两个tuxing函数,第一个的颜色与背景颜色一样,另一个就是本身颜色 tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,1); } return 0; } case VK_LEFT: { if(check(Pos.dir,Pos.sharp,Pos.x-20,Pos.y)) { PlaySound(TEXT("1/xuanzhuan.wav"),NULL,SND_FILENAME|SND_ASYNC); tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,0); Pos.x-=20; tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,1); } return 0; } case VK_RIGHT: { if(check(Pos.dir,Pos.sharp,Pos.x 20,Pos.y)) { PlaySound(TEXT("1/xuanzhuan.wav"),NULL,SND_FILENAME|SND_ASYNC); tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,0); Pos.x =20; tuxing(hdc,Pos.dir,Pos.sharp,Pos.x,Pos.y,1); } return 0; } case VK_DOWN: { PlaySound(TEXT("1/xuanzhuan.wav"),NULL,SND_FILENAME|SND_ASYNC); speed=100; SetTimer(hwnd,1,speed,NULL); } } ReleaseDC(hwnd,hdc); return 0; } case WM_COMMAND: { switch(LOWORD(wParam)) { case 1: { if(gameover()) { if(pause) { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); KillTimer(hwnd,1); SetWindowText(hwndbutton,TEXT("继续")); } else { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); SetTimer(hwnd,1,speed,NULL); SetWindowText(hwndbutton,TEXT("暂停")); SetFocus(hwnd); //把输入焦点换回到主窗口 } pause%=2; } return 0; } case 2: { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); KillTimer(hwnd,1); int i=MessageBox(hwnd,TEXT("确定要退出吗?"),TEXT("提示"),MB_OKCANCEL); if(i==IDOK) { KillTimer(hwnd,1); PostQuitMessage(0); } else { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); SetTimer(hwnd,1,speed,NULL); } return 0; } case 3: { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); KillTimer(hwnd,1); int i=MessageBox(hwnd,TEXT("确定要重新开始吗?"),TEXT("提示"),MB_OKCANCEL); if(i==IDOK) { ZeroMemory(cfk,sizeof(cfk)); InvalidateRect(hwnd,NULL,FALSE); SetTimer(hwnd,1,speed,NULL); } else { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); SetTimer(hwnd,1,speed,NULL); } return 0; } case 4: { ZeroMemory(str,sizeof(str)); GetDlgItemText(hwnd,7,str,sizeof(str)/sizeof(TCHAR)); SetFocus(hwnd); return 0; } case ID_MENUITEM40001: { PlaySound(TEXT("1/manhang"),NULL,SND_FILENAME|SND_ASYNC); KillTimer(hwnd,1); MessageBox(hwnd,TEXT("1.游戏不简单,不过功能也齐全.\n" "2.此游戏可能和其他的有点不\n" " 同之处,其他的都是以分数来玩的!\n" "3.而我的不同之处是以时间\n" " 来玩的!根据时间来换取不同的\n" " 音乐!时间越久速度也越快!@_@\n"),TEXT("说明"),MB_OK); SetTimer(hwnd,1,speed,NULL); return 0; } case ID_MENUITEM40002: { PlaySound(TEXT("1/Pause.wav"),NULL,SND_FILENAME|SND_ASYNC); KillTimer(hwnd,1); MessageBox(hwnd,TEXT("通过此游戏的编程,让我知道许多知识.\n" "特别是POINT结构体,以及数组的使用...\n" "也要感谢帮助过我的人,特别是我的网友\n" "和她.非常感谢了!!!我会继续努力的!!!"),TEXT("感言"),MB_OK); SetTimer(hwnd,1,speed,NULL); return 0; } } return 0; } case WM_DESTROY: { KillTimer(hwnd,1); KillTimer(hwnd,2); PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd,message,wParam,lParam); } void fangkuai(HDC hdc,int x,int y,int col) //画方块 { int sz=20; RECT rect; SelectObject(hdc,color[col]); FillRect(hdc,&rect,color[col]); Rectangle(hdc,x,y,x sz,y sz); } void tuxing(HDC hdc,int dir,int sharp,int x,int y,int col) //画图形 { int k; for(k=0;k<=3;k ) { sx=apt[dir][sharp][k].x x; //加x是来控制方块的移动的 sy=apt[dir][sharp][k].y y; //同上 fangkuai(hdc,sx,sy,col); } } void Init(void) //初始结构体 { Pos.dir=rand()%7; Pos.sharp=0; Pos.x=0; Pos.y=0; } BOOL save(HDC hdc,int dir,int sharp,int x,int y) //保存方块的位置 { int i,j; bool state; int line=0; for(i=0;i<=3;i ) { sx=apt[dir][sharp][i].x x; sy=apt[dir][sharp][i].y y; cfk[sx][sy]=1; } for(j=0;j<480;j =20) { for(i=20;i<300;i =20) { if(cfk[i][j]!=1) { state=false; break; } } if(i==300&&cfk[280][j]==1) { state=true; for(m=0;m<300;m =20) { fangkuai(hdc,m,j,2); PlaySound(TEXT("1/manhang.wav"),NULL,SND_FILENAME|SND_ASYNC); Sleep(20); } line ; } if(state) { for(m=j;m>1;m-=20) { for(n=0;n<300;n =20) { cfk[n][m]=cfk[n][m-20]; } //hua(hdc); //数组下移后重画 经典 //load(hdc); // 可以去掉,因为在WM_PAINT中有了,而且用到了INVALIDTAERECT函数! } } } return line; } void load(HDC hdc) //显示已下落的方块 { int i,j; for(i=0;i<300;i =20) { for(j=0;j<480;j =20) { if(cfk[i][j]==1) { fangkuai(hdc,i,j,1); } } } } BOOL check(int dir,int sharp,int px,int py) //检查是否出界 //封装函数的重要性! { int i,x1,y1; for(i=0;i<=3;i ) { x1=apt[dir][sharp][i].x px; y1=apt[dir][sharp][i].y py; if(x1<=0||x1>=300||y1>=460||cfk[x1][y1]==1) //这代码之经典!判断是否出界以及判断是否有方块 { return FALSE; } } return TRUE; } void hua(HDC hdc) //画笔 { RECT rect; SetRect(&rect,0,0,300,460); FillRect(hdc,&rect,color[0]); rect.left=320; rect.top=0; rect.right=400; rect.bottom=480; FillRect(hdc,&rect,color[1]); rect.left=320; rect.top=0; rect.right=400; rect.bottom=100; FillRect(hdc,&rect,color[0]); } void huabk(HDC hdc,int x1,int y1,int x2,int y2) //画边框 { int k; for(k=0;k<24;k ) { fangkuai(hdc,x1,y1,2); y1 =20; } for(k=0;k<15;k ) { fangkuai(hdc,x2,y2,2); x2 =20; } } BOOL gameover(void) { int i,j=40; for(i=0;i<=300;i =20) { if(cfk[i][j]==1) { return false; } } return true; } void ScrollLeft(TCHAR *str) { //最左边的字符记下来 TCHAR leftChar = str[0]; int len = lstrlen(str); //从左至右,把左边的字符替换为右边那个 for(int i=1;i<len;i ) { str[i-1] = str[i]; } //将最后一个字符设置为以前的第一个 str[len-1] = leftChar; } VOID CALLBACK timerProc (HWND hwnd,UINT nMsg,UINT nTimerid,DWORD dwTime) { //滚动字符 ScrollLeft(str); SetDlgItemText(hwnd,8,str); }