大二时利用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=;
char cScore[]; int numberOfBomb=;
int const fruitLength=;
bool gameOver=false;
bool gameStart=true;
Fruit* (myFruit[])={ new Fruit("apple.png",,,-,),
new Fruit("apple.png",,,,),
new Fruit("apple.png",,,,),
new Fruit("apple.png",,,,-),
new Fruit("banana.png",,,,),
new Fruit("banana.png",,,-,),
new Fruit("banana.png",,,,-),
new Fruit("strawberry.png",,,,),
new Fruit("pineapple.png",,,-,),
new Fruit("pineapple.png",,,,-),
new Fruit("watermelon.png",,,,-)}; Fruit* (Bomb[])={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, , ,PM_REMOVE) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{ //if(gameStart==false&&gameOver==false)
{
tNow = GetTickCount(); if(tNow-tPre >= )
MyPaint(hdc);
if(gameStart==false&&gameOver==false)
{
tNow2=GetTickCount();
if(tNow-tCheck>=)
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 = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
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, , , , , hInstance, );
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc); bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,,,LR_LOADFROMFILE);
font=(HBITMAP)LoadImage(NULL,"bgOver.bmp",IMAGE_BITMAP,,,LR_LOADFROMFILE);
start=(HBITMAP)LoadImage(NULL,"bgStart.bmp",IMAGE_BITMAP,,,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[]="Score:";
SelectObject(mdc,bg);
BitBlt(hdc,,,,,mdc,,,SRCCOPY);
sprintf(cScore, "%d", score);
old_fcolor=SetTextColor(hdc,RGB(,,));
old_bcolor=SetBkColor(hdc,RGB(,,));
old_tmode=SetBkMode(hdc,TRANSPARENT);
strcat(ss,cScore);
TextOut(hdc,,,ss,strlen(ss));
SetTextColor(hdc,old_fcolor);
SetBkColor(hdc,old_bcolor);
SetBkMode(hdc,old_tmode); for(int i=;i<fruitLength;i++)
{
myFruit[i]->Draw(hdc);
myFruit[i]->Move(rect);
}
for(int i=;i<numberOfBomb;i++)
{
Bomb[i]->Draw(hdc);
Bomb[i]->Move(rect);
} tPre = GetTickCount();
}
if(gameOver==true)
{
char ss[]="Your Score is ";
SelectObject(mdc,font);
BitBlt(hdc,,,,,mdc,,,SRCCOPY);
sprintf(cScore, "%d", score);
old_fcolor=SetTextColor(hdc,RGB(,,));
old_bcolor=SetBkColor(hdc,RGB(,,));
old_tmode=SetBkMode(hdc,TRANSPARENT);
strcat(ss,cScore);
TextOut(hdc,,,ss,strlen(ss));
SetTextColor(hdc,old_fcolor);
SetBkColor(hdc,old_bcolor);
SetBkMode(hdc,old_tmode);
}
if(gameStart==true)
{
SelectObject(mdc,start);
BitBlt(hdc,,,,,mdc,,,SRCCOPY);
}
} void productBomb()
{
if(numberOfBomb<)
{
Bomb[numberOfBomb]->changePosition(rect);
numberOfBomb++;
}
tCheck = GetTickCount();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WORD mouseX=;
WORD mouseY=; switch (message)
{
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
PostQuitMessage();
if(gameOver==true)
{
if(wParam==||wParam==)
{
numberOfBomb=;
gameOver=false;
gameStart=true;
}
}
if(gameStart==true)
{
if(wParam==)
{
gameStart=false;
score=;
}
}
break; case WM_DESTROY:
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(font);
for(int i=;i<fruitLength;i++)
{
myFruit[i]->Destroy();
}
for(int i=;i<;i++)
{
Bomb[i]->Destroy();
}
ReleaseDC(hWnd,hdc);
PostQuitMessage();
break;
case WM_LBUTTONDOWN:
mouseX=LOWORD(lParam);
mouseY=HIWORD(lParam);
for(int i=;i<fruitLength;i++)
{
if(myFruit[i]->checkClick(mouseX,mouseY))
{
myFruit[i]->changePosition(rect);
score+=AddScore(myFruit[i]->GetName());
}
}
for(int i=;i<numberOfBomb;i++)
{
if(Bomb[i]->checkClick(mouseX,mouseY))
{
gameOver=true;
}
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ;
}
int AddScore(std::string name)
{
if(name=="apple.png")
{
return ;
}
if(name=="banana.png")
{
return ;
}
if(name=="strawberry.png")
{
return ;
}
if(name=="pineapple.png")
{
return ;
} if(name=="watermelon.png")
{
return ;
}
return ; }

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()-;
int i=rand()/;
int j=sqrt((double)(-speedX*speedX));
speedY=(i==)?j:-j;
}
void Fruit:: Draw(HDC hdc)
{
image.TransparentBlt (hdc,positionX,positionY,image.GetWidth(),image.GetHeight(),RGB(,,));
}
void Fruit::Move(RECT rect)
{
positionX+=speedX;
positionY+=speedY;
if(positionX <= )
{
positionX = ;
speedX = -speedX;
}
else if(positionX >= rect.right-image.GetWidth())
{
positionX = rect.right - image.GetWidth();
speedX = -speedX;
}
if(positionY<=)
{
positionY = ;
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;
}

C++ 游戏之点点水果的更多相关文章

  1. java游戏制作之水果忍者

    水果忍者的原理很简单,主要就是采用随机的方式是画面上面出现水果. package Fruitninja; import java.awt.Dimension; import java.awt.Grap ...

  2. Python开发接水果小游戏

    我研发的Python游戏引擎Pylash已经更新到1.4了.如今我们就来使用它完毕一个极其简单的小游戏:接水果. 下面是游戏截图: 游戏操作说明:点击屏幕左右两边或者使用键盘方向键控制人物移动.使人物 ...

  3. 练手WPF(四)——贪吃蛇小游戏的简易实现(下)

    八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...

  4. 纯css3手机页面图标样式代码

    全部图标:http://hovertree.com/texiao/css/19/ 先看效果: 或者点这里:http://hovertree.com/texiao/css/19/hoverkico.ht ...

  5. 使用Visual Studio进行 Android开发的十大理由

    [原文发表地址]Top 10 reasons to use Visual Studio for C++ Android Development! Visual Studio: C++跨平台的移动解决方 ...

  6. 设计模式之十八:桥接模式(Bridge)

    桥接模式: 将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化. UML图: 主要包含: Abstraction:定义了抽象部分的接口.操作一个实现部分对象的引用. RefinedAbstra ...

  7. 少儿编程|Scratch编程教程系列合集,总有一款适合你

    如果觉得资源不错,友情转发,贵在分享!!! 少儿编程Scratch: 少儿编程Scratch第一讲:Scratch完美的初体验少儿编程Scratch第二讲:奇妙的接球小游戏少儿编程Scratch第三讲 ...

  8. 基于HTML5和JS实现的切水果游戏

    切水果游戏曾经是一款风靡手机的休闲游戏,今天要介绍的就是一款网页版的切水果游戏, 由JavaSript和HTML5实现,虽然功能和原版的相差太大,但是基本的功能还是具备了,还是模仿的挺逼真,有一定的J ...

  9. ios水果风暴游戏源码下载

    游戏源码是从那个IOS教程网IOS.662p.com分享给大家的. 这是一款ios水果风暴游戏源码下载,介绍给大家一下,喜欢的朋友可以下载学习一下吧.应用介绍:这是一个以获得高分和挑战更高难度为目的的 ...

随机推荐

  1. R语言学习笔记—K近邻算法

    K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适 ...

  2. Markdown新手快速入门基础教程

    Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. 当前许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息.例如:GitHub.简书.redd ...

  3. springboot热部署(一)——Java热部署与热加载原理

    一.概述 在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载. 对于Java应用程序来说, 热部署就是在服务器运行时重新部署项目,——生产环境 热加载即在在运行时重新加载class,从而 ...

  4. 2018下学期C语言学习总结

    怎么说呢,2018年下学期已经过去了,2019年的上学期又来了,在2018年没有达到自己想要的结果,希望2019年可以达到,加油!我希望我以后可以又快又准确的完成C语言的编程,学习好所以关于电脑的基础 ...

  5. FFT/NTT/MTT学习笔记

    FFT/NTT/MTT Tags:数学 作业部落 评论地址 前言 这是网上的优秀博客 并不建议初学者看我的博客,因为我也不是很了解FFT的具体原理 一.概述 两个多项式相乘,不用\(N^2\),通过\ ...

  6. 苏州优步uber司机奖励政策(持续更新)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. easybcd删除win10启动项如何恢复?

    制作windows启动盘: u盘启动 开始安装,选择左下角的"修复计算机": 运行命令 bcdboot c:\windows /l zh-cn 从系统盘C:\Windows目录中复 ...

  8. 【HEOI2016】序列

    题面 题解 很像最长不下降子序列对吧(废话) 设$up[i]$和$down[i]$分别表示$i$最大最小能取多少 注意到: $$ f[i] = max_j\left\{f[j]\right\} + 1 ...

  9. JNDI是什么,怎么理解

    JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...

  10. UWP 使用HttpClient获取网页数据

    我的App自然灾害中,为了展示地震的各种信息,就需要从网页上获取地震源数据. 如图所示,我们需要展示 地震等级.地震发生时间.经纬度.震源深度.地震位置等信息. 那么,假设给了一个地震的源,中国地震台 ...