实例介绍
【实例截图】
【核心代码】
// 俄罗斯方块.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);
}
标签: 俄罗斯方块游戏
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论