📄 qq堂小游戏 (原创 vc++实现).txt
字号:
QQ堂小游戏 (原创 VC++实现)
评论/浏览(16/78)发表时间:2007年5月29日 21时3分
[%repeat_0 match="/data/option"%] [%=@title%] [%=@count%]票 [[%=@percent%]%]
[%_repeat_0%]
最近研究游戏编程(学了差不多1个星期),嫌着上课无事,写了个五子棋游戏,在这里发下.因为里面有用到一些图片,这里又发不下,如果有兴趣的朋友,留下邮箱,我把完整的程序发到你们邮箱里面去. #include <windows.h>
#include<time.h>
#include<stdio.h>
HINSTANCE hInst;
HWND hWnd;
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint();
void Move(WPARAM key);
void FangLei();
void ShowBaoZha(int k);
void BaoZha(int k);
void Computer();
void ShowInfo();
unsigned long now,pass;
int pH=40,pW=40;
const int bmpNum=14;
HBITMAP bmp[bmpNum],bufBmp;
HDC mdc,hdc,bufDC;
int manY=1;
const int bMaxNum=10;
const int w=13,h=8;
const int bgW=614,bgH=555;
const int bMaxLen=10;
int manNum=0;
int cptNum=0;
struct Man
{
int x;
int y;
int bCount;
int bExist;
int bNum;
int bLen;
}man,cpt;
struct b
{
int x;
int y;
int t;
BOOL exist;
}b[bMaxNum];
int map[w][h];
void RandMap()
{
srand(time(0));
for(int i=0; i<w; i++)
for(int j=0; j<h; j++)
{
int r=rand()%5+1;
if(r==1)
{
map[i][j]=0;
}
else if(r==2)
{
map[i][j]=12;
}
else
{
map[i][j]=2;
}
}
map[0][0]=1;
map[0][1]=0;
map[1][0]=0;
map[1][1]=0;
map[w-2][h-1]=0;
map[w-2][h-2]=0;
map[w-1][h-1]=13;
map[w-1][h-2]=0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
now=GetTickCount();
if(pass-now>=100)
{
MyPaint();
}
}
}
return msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
hWnd = CreateWindow("canvas", "QQ堂" , WS_OVERLAPPEDWINDOW,
100, 100, 1000, 500, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,10,10,640,480,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
SetWindowPos(hWnd,NULL,100,50,850,600,SWP_SHOWWINDOW);
bmp[0]=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,bgW,bgH,LR_LOADFROMFILE);
bmp[1]=(HBITMAP)LoadImage(NULL,"man.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[2]=(HBITMAP)LoadImage(NULL,"qian.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[3]=(HBITMAP)LoadImage(NULL,"lei.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[4]=(HBITMAP)LoadImage(NULL,"baozha1.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[5]=(HBITMAP)LoadImage(NULL,"baozha2.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[6]=(HBITMAP)LoadImage(NULL,"baozhaleft.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[7]=(HBITMAP)LoadImage(NULL,"baozharight.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[8]=(HBITMAP)LoadImage(NULL,"baozhatop.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[9]=(HBITMAP)LoadImage(NULL,"baozhabottom.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[10]=(HBITMAP)LoadImage(NULL,"xiezi.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[11]=(HBITMAP)LoadImage(NULL,"jiadan.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[12]=(HBITMAP)LoadImage(NULL,"xiang.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
bmp[13]=(HBITMAP)LoadImage(NULL,"cpt.bmp",IMAGE_BITMAP,pW,pH,LR_LOADFROMFILE);
//初始化
man.x=0;
man.y=0;
man.bCount=3;
man.bExist=3;
man.bNum=0;
man.bLen=1;
cpt.x=w-1;
cpt.y=h-1;
RandMap();
hdc=GetDC(hWnd);
mdc=CreateCompatibleDC(hdc);
bufDC=CreateCompatibleDC(hdc);
bufBmp=CreateCompatibleBitmap(hdc,bgW,bgH);
SelectObject(mdc,bufBmp);
MyPaint();
SetTimer(hWnd,1001,200,NULL);
SetTimer(hWnd,999,30,NULL);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i=0;
int k=0;
int z=0;
switch (message)
{
case WM_TIMER:
if(wParam==1000)
{
for(k=0; k<bMaxNum; k++) //是否有炸弹要爆炸
{
for(int z1=0; z1<w; z1++)
{
for(int z2=0; z2<h; z2++)
{
if(map[z1][z2]==4 ||map[z1][z2]==5||map[z1][z2]==6 ||
map[z1][z2]==7 ||map[z1][z2]==8 ||map[z1][z2]==9 )
{
map[z1][z2]=0;
}
}
}
}
}
if(wParam==1001)
{
Computer();
ShowInfo();
}
if(wParam==999)
{
for(int k=0; k<bMaxNum; k++) //是否有炸弹要爆炸
{
if(b[k].exist==TRUE)
{
if(b[k].t <= 0) //炸弹爆炸
{
PlaySound (TEXT ("baozha.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
ShowBaoZha(k);
man.bNum--;
man.bExist++;
b[k].exist=FALSE;
SetTimer(hWnd,1000,180,NULL);
}
b[k].t--;
}
}
}
break;
case WM_KEYDOWN:
if(wParam==VK_SPACE)
{
FangLei();
}
Move(wParam);
MyPaint();
if(wParam==VK_F1)
{
InvalidateRect(hWnd,NULL,TRUE);
man.x=0;
man.y=0;
man.bCount=3;
man.bExist=3;
man.bNum=0;
man.bLen=1;
cpt.x=w-1;
cpt.y=h-1;
manNum=0;
cptNum=0;
RandMap();
}
break;
case WM_DESTROY:
for(; i<bmpNum; i++)
DeleteObject(bmp[i]);
ReleaseDC(hWnd,mdc);
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
KillTimer(hWnd,1000);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
发表评论共16条评论,第1页/共2页 上一页下一页 長髮為伱而留
引用删除1楼 長髮為伱而留
评论时间:2007年5月29日 21时5分
void Move(WPARAM key)
{
switch(key)
{
case VK_LEFT:
if(map[man.x-1][man.y]==0 && man.x>0 || map[man.x-1][man.y]==10 ||
map[man.x-1][man.y]==11 )
{
if(map[man.x-1][man.y]==10 || map[man.x-1][man.y]==11 )
{
PlaySound (TEXT ("chi.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
}
if(map[man.x-1][man.y]==10 && man.bLen<bMaxLen)
man.bLen++;
if(map[man.x-1][man.y]==11 && man.bExist<bMaxNum)
man.bExist++;
if(map[man.x][man.y]!=3)
map[man.x][man.y]=0;
map[--man.x][man.y]=1;
}
break;
case VK_RIGHT:
if(map[man.x+1][man.y]==0 && man.x<w-1 || map[man.x+1][man.y]==10 ||
map[man.x+1][man.y]==11 )
{
if(map[man.x+1][man.y]==10 ||
map[man.x+1][man.y]==11)
{
PlaySound (TEXT ("chi.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
}
if(map[man.x+1][man.y]==10 && man.bLen<bMaxLen)
man.bLen++;
if(map[man.x+1][man.y]==11 && man.bExist<bMaxNum)
man.bExist++;
if(map[man.x][man.y]!=3)
map[man.x][man.y]=0;
map[++man.x][man.y]=1;
}
break;
case VK_DOWN:
if(map[man.x][man.y+1]==0 && man.y<h-1 ||map[man.x][man.y+1]==10 ||
map[man.x][man.y+1]==11 )
{
if(map[man.x][man.y+1]==10 ||
map[man.x][man.y+1]==11 )
{
PlaySound (TEXT ("chi.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
}
if(map[man.x][man.y+1]==10 && man.bLen<bMaxLen)
man.bLen++;
if(map[man.x][man.y+1]==11 && man.bExist<bMaxNum)
man.bExist++;
if(map[man.x][man.y]!=3)
map[man.x][man.y]=0;
map[man.x][++man.y]=1;
}
break;
case VK_UP:
if(map[man.x][man.y-1]==0 && man.y>0 || map[man.x][man.y-1]==10 ||
map[man.x][man.y-1]==11 )
{
if(map[man.x][man.y-1]==10 ||
map[man.x][man.y-1]==11 )
{
PlaySound (TEXT ("chi.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
}
if(map[man.x][man.y-1]==10 && man.bLen<bMaxLen)
man.bLen++;
if(map[man.x][man.y-1]==11 && man.bExist<bMaxNum)
man.bExist++;
if(map[man.x][man.y]!=3)
map[man.x][man.y]=0;
map[man.x][--man.y]=1;
}
break;
}
}
void FangLei()
{
if(man.bExist>0 && map[man.x][man.y]!=3 && man.bNum<=bMaxNum) //当炸弹的数目大于0的时候
{
if(b[man.bNum].exist)
{
for(int i=0; i<bMaxNum; i++)
{
if(b[i].exist==FALSE)
{
man.bNum=i;
}
}
}
map[man.x][man.y]=3;
b[man.bNum].x=man.x;
b[man.bNum].y=man.y;
man.bExist--;
b[man.bNum].t=50;
b[man.bNum].exist=TRUE;
man.bNum++;
}
}
void MyPaint()
{
SelectObject(bufDC,bmp[0]);
BitBlt(mdc,0,0,bgW,bgH,bufDC,0,0,SRCCOPY);
for(int i=0; i<w; i++)
{
for(int j=0; j<h; j++)
{
if(map[i][j]!=0)
{
SelectObject(bufDC,bmp[map[i][j]]);
BitBlt(mdc,46+i*pW,190+j*pH,bgW,bgH,bufDC,0,0,SRCCOPY);
}
}
}
BitBlt(hdc,0,0,bgW,bgH,mdc,0,0,SRCCOPY);
pass=GetTickCount();
}
int FindBobm(int x,int y)
{
for(int i=0; i<bMaxNum; i++)
{
if(b[i].x==x && b[i].y==y)
{
return i;
}
}
return -1;
}
長髮為伱而留
引用删除2楼 長髮為伱而留
评论时间:2007年5月29日 21时6分
void ShowBaoZha(int k)
{
int r;
static const int jiLu=2;
for(int z=b[k].x; z>b[k].x-man.bLen; z--)
{
if(map[z-1][b[k].y]==12)
break;
if(map[z-1][b[k].y]==1 && man.y==b[k].y) //炸到玩家了
{
manNum++;
break;
}
if(map[z-1][b[k].y]==13 && cpt.y==b[k].y)
{
cptNum++;
break;
}
if(z<0 )
{
break;
}
if(map[z-1][b[k].y]==2)
{
r=rand()%jiLu+1;
if(r==1)
{
map[z-1][b[k].y]=10;
}
else if(r==2)
{
map[z-1][b[k].y]=11;
}
else
{
map[z-1][b[k].y]=0;
}
break;
}
if(map[z-1][b[k].y]==3)
{
b[FindBobm(z-1,b[k].y)].t=0;
break;
}
map[z][b[k].y]=4;
}
if(z>=0)
map[z][b[k].y]=6;
for( z=b[k].x; z<b[k].x+man.bLen; z++)
{
if(map[z+1][b[k].y]==12)
break;
if(map[z+1][b[k].y]==1 && man.y==b[k].y) //炸到玩家了
{
manNum++;
break;
}
if(map[z+1][b[k].y]==13 && cpt.y==b[k].y)
{
cptNum++;
break;
}
if(map[z+1][b[k].y]==2)
{
r=rand()%jiLu+1;
if(r==1)
{
map[z+1][b[k].y]=10;
}
else if(r==2)
{
map[z+1][b[k].y]=11;
}
else
{
map[z+1][b[k].y]=0;
}
break;
}
if(map[z+1][b[k].y]==3)
{
b[FindBobm(z+1,b[k].y)].t=0;
break;
}
if(z>w-1 )
{
break;
}
map[z][b[k].y]=4;
}
if(z<w-1)
map[z][b[k].y]=7;
for( z=b[k].y; z>b[k].y-man.bLen; z--)
{
if(map[b[k].x][z-1]==12)
break;
if(map[b[k].x][z-1]==1 && man.x==b[k].x) //炸到玩家了
{
manNum++;
break;
}
if(map[b[k].x][z-1]==13 && cpt.x==b[k].x) //炸到玩家了
{
cptNum++;
break;
}
if(map[b[k].x][z-1]==2)
{
r=rand()%jiLu+1;
if(r==1)
{
if(z>0)
map[b[k].x][z-1]=10;
}
else if(r==2)
{
if(z>0)
map[b[k].x][z-1]=11;
}
else
{
map[z+1][b[k].y]=0;
}
if(z>0)
{
map[b[k].x][z-1]=8;
}
else
{
break;
}
z=-1;
break;
}
if(map[b[k].x][z-1]==3)
{
b[FindBobm(b[k].x,z-1)].t=0;
break;
}
if(z<0)
{
break;
}
map[b[k].x][z]=5;
}
if(z>=0)
map[b[k].x][z]=8;
for( z=b[k].y; z<b[k].y+man.bLen; z++)
{
if(map[b[k].x][z+1]==13 && cpt.x==b[k].x) //炸到玩家了
{
cptNum++;
break;
}
if(map[b[k].x][z+1]==12)
break;
if(map[b[k].x][z+1]==1 && man.x==b[k].x) //炸到玩家了
{
manNum++;
break;
}
if(map[b[k].x][z+1]==2 )
{
r=rand()%jiLu+1;
if(r==1 )
{
if(z<h-1)
map[b[k].x][z+1]=10;
}
else if(r==2)
{
if(z<h-1)
map[b[k].x][z+1]=11;
}
else
{
if(z<h-1)
map[b[k].x][z+1]=0;
}
if( z<h-1 )
{
map[b[k].x][z+1]=0;
break;
}
}
if(map[b[k].x][z+1]==3)
{
b[FindBobm(b[k].x,z+1)].t=0;
break;
}
if(z>h-1)
{
break;
}
map[b[k].x][z]=5;
}
if(z<=h-1)
map[b[k].x][z]=9;
}
void Computer()
{int r=rand()%2+1;
if(r==1)
{
if(cpt.x>man.x)
{
if(map[cpt.x-1][cpt.y]==0 || map[cpt.x-1][cpt.y]==1 && cpt.x>0 )
{
if(map[cpt.x-1][cpt.y]==1)
{
manNum++;
}
if(map[cpt.x][cpt.y]!=3)
map[cpt.x][cpt.y]=0;
map[--cpt.x][cpt.y]=13;
}
return ;
}
else
{
if(map[cpt.x+1][cpt.y]==0 && cpt.x<w-1 || map[cpt.x+1][cpt.y]==1 )
{
if(map[cpt.x+1][cpt.y]==1)
{
manNum++;
}
if(map[cpt.x][cpt.y]!=3)
map[cpt.x][cpt.y]=0;
map[++cpt.x][cpt.y]=13;
}
return ;
}
}
else
{
if(cpt.y<man.y)
{
if(map[cpt.x][cpt.y+1]==0 && cpt.y<h-1 || map[cpt.x][cpt.y+1]==1)
{
if(map[cpt.x][cpt.y+1]==1)
manNum++;
if(map[cpt.x][cpt.y]!=3)
map[cpt.x][cpt.y]=0;
map[cpt.x][++cpt.y]=13;
return ;
}
else
{
if(map[cpt.x][cpt.y-1]==0 && cpt.y>0 || map[cpt.x][cpt.y-1]==1)
{
if(map[cpt.x][cpt.y-1]==1)
manNum++;
if(map[cpt.x][cpt.y]!=3)
map[cpt.x][cpt.y]=0;
map[cpt.x][--cpt.y]=13;
}
return ;
}
}
}
void ShowInfo()
{
char str1[50], str2[50];
sprintf(str1,"你被怪物炸了%d次",manNum);
sprintf(str2,"怪物被你炸了%d次",cptNum);
TextOut(hdc,650,90,"按F1重新开始游戏",strlen("按F1重新开始游戏"));
TextOut(hdc,650,120,str1,strlen(str1));
TextOut(hdc,650,150,str2,strlen(str2));
if(cptNum>=10 )
{
SendMessage(hWnd,WM_KEYDOWN,VK_F1,0);
}
if(manNum>=10)
{
SendMessage(hWnd,WM_KEYDOWN,VK_F1,0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -