自己编写的一个小游戏,本来打算做贪吃蛇,结果不会使蛇的身子随蛇头方向改变而改变就换了种想法,最后变成了这样一个另类的小游戏,“笑哭“,下面是程序的主要代码,如果有兴趣也可以下载完整程序代码资源:https://download.csdn.net/download/yt201758501112/10488198。

Lessonx.h

/

//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
#include <stdio.h>
#include <vector>
using namespace std;
/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class CGameMain
{
private:
int m_iGameState; // 游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中
    CSprite * m_pControlSnake;         //定义蛇头部精灵
    CSprite * m_pSnakebody1;            //定义一节蛇身
    CSprite * tmpsprite;             //定义两个中间变量精灵
    CSprite * tmpsprite1;
    vector<CSprite*>  m_pSnakefood;      //定义食物精灵组
    vector<CSprite*>  m_pzhangai;        //定义障碍精灵组
    CTextSprite * m_pStarttext;      //定义开始文本精灵
    CTextSprite * m_pgamescore;      //定义分数文本精灵
    CTextSprite * m_plevel;        //定义级别文本精灵
    CSprite * m_pgameover;          //定义游戏结束时背景精灵
    CSprite * m_pbeijing;          //定义开始时背景精灵
    CTextSprite * m_ptime;         //定义游戏时间文本精灵
    CTextSprite * m_pend1;         //定义文本精灵
    CTextSprite * m_pend2;
    CSound * m_bjmusic;          //定义音效精灵
    CSound * m_eatmusic;
    int m_foodminX;        //定义食物出现的最小X坐标
    int m_foodmaxX;         //定义食物出现的最大X坐标
    int m_foodminY;         //定义食物出现的最小Y坐标
    int m_foodmaxY;         //定义食物出现的最大Y坐标
    int m_foodcount;        //定义食物出现的数目
    int m_zhangaimaxY;      //定义障碍出现的最大Y坐标
    int m_zhangaiminY;      //定义障碍出现的最小Y坐标
    int m_zhangaicount;     //定义障碍出现的数目
    float DeltaTime;        //定义时间
    float speedsnake;       //定义蛇移动的速度
    int weizhi;        //定义需要的变量
    int judge;
    float speedbeijing;
    int t;
    char foodname[1000];      //定义需要存储的数组
    char zhangainame[1000];
    int fenshu;         //定义级别,分数
    int level;
    float mintime,maxtime;
    float basetime;
public:
CGameMain();            //构造函数
~CGameMain();           //析构函数

// Get方法
int GetGameState() { return m_iGameState; }

// Set方法
void SetGameState( const int iState ) { m_iGameState = iState; }

// 游戏主循环等
void GameMainLoop( float fDeltaTime );
void GameInit();
void GameRun( float fDeltaTime );
void GameEnd();
void OnMouseMove( const float fMouseX, const float fMouseY );
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );
void OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY );
void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress );
void OnKeyUp( const int iKey );
void OnSpriteColSprite( const char *szSrcName, const char *szTarName );
void OnSpriteColWorldLimit( const char *szName, const int iColSide );
};

/
//
extern CGameMain g_GameMain;

#endif // _LESSON_X_H_

Lessonx.cpp

/
//
//
//
//
/
#include <Stdio.h>
#include "CommonClass.h"
#include "LessonX.h"
#include <algorithm>
#include <cstring>
#include <time.h>
#include <stdlib.h>
#include<windows.h>
#pragma comment(lib,"winmm.lib")

//
//
CGameMain g_GameMain;

//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。

//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{
m_iGameState = 0;
m_pControlSnake =new CSprite("Snake_0");        //导入精灵
m_pSnakebody1 =new CSprite("snake_1");
m_pStarttext =new CTextSprite("start");        //导入文本精灵
m_pgamescore=new CTextSprite("gamescore");
m_plevel=new CTextSprite("level");
m_pgameover=new CSprite("gameend");
m_pbeijing=new CSprite("beijing");
m_ptime=new CTextSprite("time");
m_bjmusic=new CSound("bjmusic.wav",1,1);        //导入音乐精灵
m_eatmusic=new CSound("eatmusic.wav",0,1);
m_pend1=new CTextSprite("end1");
m_pend2=new CTextSprite("end2");
m_foodmaxX=0;          //初始化变量
m_foodmaxY=0;
m_foodminX=0;
m_foodminY=0;
m_foodcount=0;
DeltaTime=0;
    speedbeijing=10.f;
    speedsnake=15.f;
    basetime=0.f;
    m_iHook=0;
weizhi=0;
judge=1;
t=0;
fenshu=0;
level=1;
mintime=2.f;
maxtime=4.f;
iTime=0;
}
//==============================================================================
//
// 析构函数
CGameMain::~CGameMain()
{
}

//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void CGameMain::GameMainLoop( float fDeltaTime )
{
switch( GetGameState() )
{
// 初始化游戏,清空上一局相关数据
case 1:
{
GameInit();
SetGameState(2); // 初始化之后,将游戏状态设置为进行中
}
break;

// 游戏进行中,处理各种游戏逻辑
case 2:
{
// TODO 修改此处游戏循环条件,完成正确游戏逻辑
if( true )
{
GameRun( fDeltaTime );

}
else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态
{
SetGameState(0);
GameEnd();
}
}
break;

// 游戏结束/等待按空格键开始
case 0:
default:
break;
};
}
//=============================================================================
//
// 每局开始前进行初始化,清空上一局相关数据
void CGameMain::GameInit()
{

}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun( float fDeltaTime )
{
       DeltaTime+=fDeltaTime;       //累加时间来判断是否产生障碍
       basetime+=fDeltaTime;           //累加时间以用来计时
     m_ptime->SetTextValueFloat(basetime);
     if(judge==1)            //判断当蛇头吃到食物时产生新的食物
     {
        sprintf(foodname,"food%d",m_foodcount++);          //改变食物的名字
        tmpsprite=new CSprite(foodname);          //初始化中间精灵
        tmpsprite->CloneSprite("food0");        //克隆初始食物精灵
        m_foodmaxX=31;             //根据原图判断边界坐标
        m_foodminX=-49;
        m_foodmaxY=31;
        m_foodminY=-36;
        int iposX=CSystem::RandomRange(m_foodminX,m_foodmaxX);           //随机产生食物的X坐标
        int iposY=CSystem::RandomRange(m_foodminY,m_foodmaxY);           //随机产生食物的Y坐标
        tmpsprite->SetSpritePosition(iposX,iposY);               //根据随机产生的坐标将精灵置入游戏界面中
        m_pControlSnake->SetSpriteCollisionSend(true);           //设置头部精灵发送信号
        tmpsprite->SetSpriteCollisionReceive(true);            //设置食物精灵接受信号
        judge=0;             //把判断值初始化
     }

if(DeltaTime>mintime&&DeltaTime<maxtime)             //当达到相应的时间时产生一障碍
     {
         sprintf(zhangainame,"box%d",m_zhangaicount++);           //改变障碍的名字
         tmpsprite1=new CSprite(zhangainame);            //初始化中间变量精灵
         tmpsprite1->CloneSprite("box0");             //克隆初始障碍
         m_zhangaiminY=-35;             //根据原图判断坐标范围
         m_zhangaimaxY=35;
         int posY=CSystem::RandomRange(m_zhangaiminY,m_zhangaimaxY);             //随机产生Y值
         int posX=50;
         tmpsprite1->SetSpritePosition(posX,posY);             //置入障碍
         tmpsprite1->SetSpriteCollisionReceive(true);               //设置障碍可以接受信号
         tmpsprite1->SetSpriteLinearVelocity(-speedbeijing,0);           //设置障碍的移动速度
         DeltaTime=0;          //初始化变量
     }
     if(fenshu>=50&&fenshu<=100)             //根据分数的不同变化关卡
     {
        speedbeijing=15.f;               //设置第二关障碍,蛇的移动速度
        speedsnake=20.f;
        level=2;          //改变关卡级别
        m_plevel->SetTextValue(level);
        mintime=1.8;         //改变障碍出现的时间间隔
        maxtime=3.6;
       // m_pbeijing->SetSpriteLinearVelocity(speedbeijing,0);
     }
     if(fenshu>100&&fenshu<=150)
     {
         speedbeijing=20.f;         //设置第三关障碍,蛇的移动速度
         speedsnake=25.f;
         level=3;           //改变关卡级别
        m_plevel->SetTextValue(level);
        mintime=1.6;            //改变障碍出现的时间间隔
        maxtime=3.2;
       // m_pbeijing->SetSpriteLinearVelocity(speedbeijing,0);
     }
     if(fenshu>150&&fenshu<=200)
     {
         speedbeijing=25.f;             //设置第四关障碍,蛇的移动速度
         speedsnake=30.f;
         level=4;           //改变关卡级别
        m_plevel->SetTextValue(level);
        mintime=1.4;            //改变障碍出现的时间间隔
        maxtime=2.8;
     //   m_pbeijing->SetSpriteLinearVelocity(speedbeijing,0);
     }
     if(fenshu>200)
     {
         speedbeijing=30.f;             //设置第五关障碍,蛇的移动速度
         speedsnake=35.f;
         level=5;           //改变关卡级别
         m_plevel->SetTextValue(level);
         mintime=1.0;           //改变障碍出现的时间间隔
         maxtime=2;
      //s   m_pbeijing->SetSpriteLinearVelocity(speedbeijing,0);
     }
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
}
//==========================================================================
//
// 鼠标移动
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void CGameMain::OnMouseMove( const float fMouseX, const float fMouseY )
{

}
//==========================================================================
//
// 鼠标点击
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void CGameMain::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{

}
//==========================================================================
//
// 鼠标弹起
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void CGameMain::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{

}
//==========================================================================
//
// 键盘按下
// 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义
// 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下)
void CGameMain::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{
    if( KEY_SPACE == iKey && 0 == GetGameState() )
{
SetGameState( 1 );
        m_pStarttext->SetSpriteVisible(false);          //设置当按下空格时开始文本精灵消失
    }
    float fSpeedX=0.f,fSpeedY=0.f;
    float fdirector=0.f;
    switch(iKey)             //设置按键对蛇头精灵速度的影响
    {
        case KEY_W:
            fSpeedY=-speedsnake;
            fdirector=270.f;
            break;
        case KEY_A:
            fSpeedX=-speedsnake;
            fdirector=180.f;
            break;
        case KEY_S:
            fSpeedY=speedsnake;
            fdirector=90.f;
            break;
        case KEY_D:
            fSpeedX=speedsnake;
            fdirector=0.f;
            break;
    };
    m_pControlSnake->SetSpriteLinearVelocity(fSpeedX, fSpeedY);       //改变蛇头的速度
    m_pControlSnake->SetSpriteRotation(fdirector);            //改变蛇头的朝向
}
//==========================================================================
//
// 键盘弹起
// 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义
void CGameMain::OnKeyUp( const int iKey )
{

}
//==========================================================================
//
// 精灵与精灵碰撞
// 参数 szSrcName:发起碰撞的精灵名字
// 参数 szTarName:被碰撞的精灵名字
void CGameMain::OnSpriteColSprite( const char *szSrcName, const char *szTarName)
{
    if(stricmp("snake_0",szSrcName)==0&&stricmp(foodname,szTarName)==0)           //当蛇头与食物碰撞时
    {
        weizhi=weizhi-2;
        tmpsprite->SpriteMountToSprite("snake_0",weizhi,0);           //将食物接在蛇头后面
        judge=1;             //改变判断变量
        fenshu+=10;          //改变分数
        m_pgamescore->SetTextValue(fenshu);
        PlaySound("E:\\eatmusic.wav",0,SND_FILENAME|SND_ASYNC);        //播放吃食物的音效

}
    else
        judge=0;
    if(stricmp("snake_0",szSrcName)==0&&stricmp(foodname,szTarName)!=0)             //当蛇头与障碍碰撞时
    {
        m_pControlSnake->DeleteSprite();              //删除蛇头与蛇身
        m_pgameover->SetSpritePosition(0,0);          //导入游戏结束界面
        m_pgameover->SetSpriteVisible(true);
        m_pend1->SetSpritePosition(-2.5,0);           //导入游戏终结文本
        m_pend2->SetSpritePosition(-4.9,6);
        m_pend2->SetTextValue(fenshu);

}
}
//===========================================================================
//
// 精灵与世界边界碰撞
// 参数 szName:碰撞到边界的精灵名字
// 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边
void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{
    if(stricmp(szName,"snake_0")==0&&iColSide==0)             //设置当蛇头碰到边界时结束游戏
    {
        m_pControlSnake->DeleteSprite();
        m_pgameover->SetSpritePosition(0,0);
        m_pgameover->SetSpriteVisible(true);
        m_pend1->SetSpritePosition(-2.5,0);
        m_pend2->SetSpritePosition(-4.9,6);
        m_pend2->SetTextValue(fenshu);
    }
    if(stricmp(szName,"snake_0")==0&&iColSide==1)
    {
        m_pControlSnake->DeleteSprite();
        m_pgameover->SetSpritePosition(0,0);
        m_pgameover->SetSpriteVisible(true);
        m_pend1->SetSpritePosition(-2.5,0);
        m_pend2->SetSpritePosition(-4.9,6);
        m_pend2->SetTextValue(fenshu);
    }
    if(stricmp(szName,"snake_0")==0&&iColSide==2)
    {
        m_pControlSnake->DeleteSprite();
        m_pgameover->SetSpritePosition(0,0);
        m_pgameover->SetSpriteVisible(true);
        m_pend1->SetSpritePosition(-2.5,0);
        m_pend2->SetSpritePosition(-4.9,6);
        m_pend2->SetTextValue(fenshu);
    }
    if(stricmp(szName,"snake_0")==0&&iColSide==3)
    {
        m_pControlSnake->DeleteSprite();
        m_pgameover->SetSpritePosition(0,0);
        m_pgameover->SetSpriteVisible(true);
        m_pend1->SetSpritePosition(-2.5,0);
        m_pend2->SetSpritePosition(-4.9,6);
        m_pend2->SetTextValue(fenshu);
    }
}

Funcode-贪吃蛇相关推荐

  1. 用html编写一个贪吃蛇,HTML编写的贪吃蛇代码

    <HTML编写的贪吃蛇代码>由会员分享,可在线阅读,更多相关<HTML编写的贪吃蛇代码(14页珍藏版)>请在人人文库网上搜索. 1.使用表格 var fangxiang;fan ...

  2. 结队-结队编程项目贪吃蛇-项目进度

    导入pygame 目前已经实现贪吃蛇游戏的场景绘制,舞台的尺寸 redColour = pygame.Color(255,0,0) blackColour = pygame.Color(0,0,0) ...

  3. 贪吃蛇计时器怎么编写java_java编写简易贪吃蛇游戏

    本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下 程序共包含以下两个文件: 文件:ShellWin.java import java.awt.Color; import java ...

  4. Java项目:贪吃蛇游戏(java+swing)

    源码获取:博客首页 "资源" 里下载! 功能简介: 贪吃蛇游戏 大嘴鱼洁面类.完成大嘴鱼的界面的绘制: /*** 大嘴鱼洁面类.完成大嘴鱼的界面的绘制.*/ public clas ...

  5. JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇

    作者:雷神 QQ:38929568 QQ群:28048051JAVA游戏编程(满) 28047782(将满) 与前一款扫雷比较,这个游戏多了一个 类,用来显示动画,也是蛇要吃的物品类, 也有了代码包, ...

  6. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

  7. 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!

    作者 | 周萝卜 来源 | 萝卜大杂烩 相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了. 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 ...

  8. 用c语言编一个贪吃蛇,刚学C语言,想写一个贪吃蛇的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include typedef struct snake { int a; int b; stru ...

  9. 【python教程入门学习】Python实现自动玩贪吃蛇程序

    这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...

  10. Python实现贪吃蛇小游戏(双人模式)

    这篇文章主要为大家详细介绍了Python实现双人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简 ...

最新文章

  1. matlab工作路径
  2. 计算机病毒能够自我复制自我执行吗,计算机病毒能够自我复制、自我执行。
  3. 机器人瓦力 配乐_《WALL-E》机器人小王子
  4. Java基础day20
  5. Dalvik/ART(ANDROID)中的多线程机制(3)
  6. 多线程(C++)临界区Critical Sections
  7. Aspose.Words对于Word的操作
  8. A股开盘:深证区块链50指数跌0.02%,丽鹏股份、爱施德涨停
  9. jvm第五节-性能调优工具使用
  10. [转]国内Linux操作系统发行商分类溯源
  11. 羊年快乐!献上小礼一份!
  12. 【Linux】Linux修改openfiles后不生效问题?
  13. 角度标注-Visio制图总结(四)
  14. 文本转成图片(自动换行、自定义字体),图片抗锯齿优化,图片压缩优化
  15. 怎么查看ofd格式电子发票? 2种简单方法免费查看
  16. Arduino实现语音实时播报当前温湿度
  17. 走进波分 -- 16.Optix OSN9800产品介绍
  18. 基于Multisim_UA741的四种波形发生器电路仿真
  19. 购买地铁车票的规定如下: 乘1-4站,3元/位;乘5-9站,4元/位; 乘9站以上,5元/位。 输入乘坐人数(per_num)和乘坐站数(sta_num), 计算购买地铁车票需要的总金额,并将计算结果
  20. wi7计算机桌面删除,win7系统删除桌面右键多余选项

热门文章

  1. 芯片测试服务器,检测服务器硬件软件
  2. mbr硬盘锁c语言源码,今日头一贴!修改MBR引导区,让你的电脑嗝屁!嗝屁!
  3. 《编码的奥秘》目录摘要及读书笔记
  4. Redis(1)——NoSQL数据库简介
  5. jsp mysql demo_ntko: ntko办公插件使用案例demo使用java+jsp+mysql实现
  6. c语言中平分怎么表示,平分水问题
  7. 深入浅出Python的抽象基类
  8. Day1通信基本概念 通信系统模型 通信系统分类与通信方式
  9. Hexo+Github博客搭建教程
  10. 二叉链表存储的二叉C语言,C语言实现二叉链表存储