大二时利用C++编写的点水果小游戏
程序代码总共3个文件,main.cpp Fruit.h Fruit.cpp 代码将在图片下面给出
至于讲解,由于过了一年多的时间,有点忘记了,但我会努力回忆并即时写出来的。
程序的下载地址http://files.cnblogs.com/magicsoar/clickfruit.rar包括了需要的图片素材
游戏的开始界面
游戏中界面
游戏的结束界面
游戏的代码
main.cpp
#include <stdio.h>
#include <string>
#include <Windows.h>
#include "atlimage.h"
#include "Fruit.h"
#include <vector>
using namespace std;
#define random(x) (rand()%x)
HINSTANCE hInst;
HBITMAP bg,font,start;
HDC hdc,mdc,bufdc;
HWND hWnd;
DWORD tPre,tNow,tNow2,tCheck;
RECT rect;
int score=0;
char cScore[20];
int numberOfBomb=0;
int const fruitLength=11;
bool gameOver=false;
bool gameStart=true;
Fruit* (myFruit[])={ new Fruit("apple.png",15,15,-9,5),
new Fruit("apple.png",150,15,7,5),
new Fruit("apple.png",40,315,1,5),
new Fruit("apple.png",600,215,9,-5),
new Fruit("banana.png",100,125,10,6),
new Fruit("banana.png",320,315,-7,7),
new Fruit("banana.png",320,315,7,-7),
new Fruit("strawberry.png",400,415,6,8),
new Fruit("pineapple.png",500,215,-5,9),
new Fruit("pineapple.png",550,115,5,-9),
new Fruit("watermelon.png",650,15,5,-9)};
Fruit* (Bomb[25])={new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),
new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),
new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),
new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),
new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png"),new Fruit("bomb.png")};
;
int AddScore(std::string name);
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
void productBomb();
void initFruit();
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
GetMessage(&msg,NULL,NULL,NULL);
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
//if(gameStart==false&&gameOver==false)
{
tNow = GetTickCount();
if(tNow-tPre >= 40)
MyPaint(hdc);
if(gameStart==false&&gameOver==false)
{
tNow2=GetTickCount();
if(tNow-tCheck>=8000)
productBomb();
}
}
}
}
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)
{
//HBITMAP bmp;
hInst = hInstance;
initFruit();
hWnd = CreateWindow("canvas", "Soar" , WS_OVERLAPPEDWINDOW&~WS_THICKFRAME&~WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, 0, 0, hInstance, 0);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
font=(HBITMAP)LoadImage(NULL,"bgOver.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
start=(HBITMAP)LoadImage(NULL,"bgStart.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
GetClientRect(hWnd,&rect);
MyPaint(hdc);
return TRUE;
}
void initFruit()
{
}
void MyPaint(HDC hdc)
{
COLORREF old_fcolor,old_bcolor;
int old_tmode;
if(gameOver==false&&gameStart==false)
{
char ss[80]="Score:";
SelectObject(mdc,bg);
BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY);
sprintf(cScore, "%d", score);
old_fcolor=SetTextColor(hdc,RGB(0,255,0));
old_bcolor=SetBkColor(hdc,RGB(0,0,0));
old_tmode=SetBkMode(hdc,TRANSPARENT);
strcat(ss,cScore);
TextOut(hdc,10,10,ss,strlen(ss));
SetTextColor(hdc,old_fcolor);
SetBkColor(hdc,old_bcolor);
SetBkMode(hdc,old_tmode);
for(int i=0;i<fruitLength;i++)
{
myFruit[i]->Draw(hdc);
myFruit[i]->Move(rect);
}
for(int i=0;i<numberOfBomb;i++)
{
Bomb[i]->Draw(hdc);
Bomb[i]->Move(rect);
}
tPre = GetTickCount();
}
if(gameOver==true)
{
char ss[80]="Your Score is ";
SelectObject(mdc,font);
BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY);
sprintf(cScore, "%d", score);
old_fcolor=SetTextColor(hdc,RGB(255,0,0));
old_bcolor=SetBkColor(hdc,RGB(0,0,0));
old_tmode=SetBkMode(hdc,TRANSPARENT);
strcat(ss,cScore);
TextOut(hdc,10,10,ss,strlen(ss));
SetTextColor(hdc,old_fcolor);
SetBkColor(hdc,old_bcolor);
SetBkMode(hdc,old_tmode);
}
if(gameStart==true)
{
SelectObject(mdc,start);
BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY);
}
}
void productBomb()
{
if(numberOfBomb<20)
{
Bomb[numberOfBomb]->changePosition(rect);
numberOfBomb++;
}
tCheck = GetTickCount();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WORD mouseX=0;
WORD mouseY=0;
switch (message)
{
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
PostQuitMessage(0);
if(gameOver==true)
{
if(wParam==82||wParam==114)
{
numberOfBomb=0;
gameOver=false;
gameStart=true;
}
}
if(gameStart==true)
{
if(wParam==32)
{
gameStart=false;
score=0;
}
}
break;
case WM_DESTROY:
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(font);
for(int i=0;i<fruitLength;i++)
{
myFruit[i]->Destroy();
}
for(int i=0;i<20;i++)
{
Bomb[i]->Destroy();
}
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
mouseX=LOWORD(lParam);
mouseY=HIWORD(lParam);
for(int i=0;i<fruitLength;i++)
{
if(myFruit[i]->checkClick(mouseX,mouseY))
{
myFruit[i]->changePosition(rect);
score+=AddScore(myFruit[i]->GetName());
}
}
for(int i=0;i<numberOfBomb;i++)
{
if(Bomb[i]->checkClick(mouseX,mouseY))
{
gameOver=true;
}
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int AddScore(std::string name)
{
if(name=="apple.png")
{
return 100;
}
if(name=="banana.png")
{
return 50;
}
if(name=="strawberry.png")
{
return 50;
}
if(name=="pineapple.png")
{
return 25;
}
if(name=="watermelon.png")
{
return 10;
}
return 0;
}
Fruit.h
#pragma once
#include <string>
#include "atlimage.h"
using namespace std;
class Fruit
{
private:
std::string name;
int positionX;
int positionY;
int speedX;
int speedY;
CImage image;
public:
Fruit(void);
~Fruit(void);
Fruit(CString);
Fruit(CString name,int positionX,int positionY,int speedX,int speedY);
void changePosition(RECT rect);
void Draw(HDC);
int GetX();
int GetY();
string GetName();
void Move(RECT rect);
bool checkClick(WORD mouseX,WORD mouseY);
void Destroy();
};
Fruit.cpp
#include "Fruit.h"
#include <string>
using namespace std;
#define random(x) (rand()%x)
Fruit::Fruit(void)
{
}
Fruit::Fruit(CString name,int positionX,int positionY,int speedX,int speedY)
{
this->name=name;
image.Load(name);
this->positionX=positionX;
this->positionY=positionY;
this->speedX=speedX;
this->speedY=speedY;
}
Fruit::Fruit(CString name)
{
this->name=name;
image.Load(name);
}
Fruit::~Fruit(void)
{
}
void Fruit::changePosition(RECT rect)
{
positionX=random(rect.right-image.GetWidth());
positionY=random(rect.bottom-image.GetHeight());
speedX=random(28)-14;
int i=rand()/2;
int j=sqrt((double)(200-speedX*speedX));
speedY=(i==1)?j:-j;
}
void Fruit:: Draw(HDC hdc)
{
image.TransparentBlt (hdc,positionX,positionY,image.GetWidth(),image.GetHeight(),RGB(255,255,255));
}
void Fruit::Move(RECT rect)
{
positionX+=speedX;
positionY+=speedY;
if(positionX <= 0)
{
positionX = 0;
speedX = -speedX;
}
else if(positionX >= rect.right-image.GetWidth())
{
positionX = rect.right - image.GetWidth();
speedX = -speedX;
}
if(positionY<=0)
{
positionY = 0;
speedY = -speedY;
}
else if(positionY>= rect.bottom-image.GetHeight())
{
positionY = rect.bottom - image.GetHeight();
speedY = -speedY;
}
}
void Fruit::Destroy()
{
image.Destroy();
}
string Fruit::GetName()
{
return name;
}
bool Fruit::checkClick(WORD mouseX,WORD mouseY)
{
if(mouseX>positionX&&mouseX<positionX+image.GetWidth())
{
if(mouseY>positionY&&mouseY<positionY+image.GetHeight())
return true;
}
return false;
}
int Fruit::GetX()
{
return positionX;
}
int Fruit::GetY()
{
return positionY;
}