Funcode设计


文章目录

  • Funcode设计
  • 前言
  • 一、Funcode下载地址
  • 二、C语言课程设计--迷你高尔夫
    • 1.效果图
    • 2.部分代码
  • 总结

前言

基于Funcode设计的C语言游戏。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Funcode下载地址

Win10版本
提取码:9761

二、C语言课程设计–迷你高尔夫

1.效果图

2.部分代码

代码如下(示例):

#include "CommonAPI.h"
#include "LessonX.h"int           g_MiGameState       =  0;      // 游戏状态,0 -- 游戏结束等待开始状态;1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中
void dDeleteSpriteGameInit();
void dCreatGameInit();
void MoveSpriteToBlock( const char *szName, const int iIndexX, const int iIndexY );
void dCreatInitSpirt();
int SpritePosXToIndexX ( const float fPosX );
int SpritePosYToIndexY( const float fPosY );#define GRID_COUNT  12  // N * N 的矩阵方块,一个N的大小
#define MAX_LEVEL   3   // 最大关卡数量。如果要增加关卡,请先修改此值
#define RIGID_BLOCK 1   // 方块阻挡物、
#define BLACK_HOLE  2   //黑洞
#define GOLF_EXIT   3   //出口的值
// 控制球的移动状态:0当前静止,可以移动,1、2、3、4:代表上下左右4个 // 方向移动中,按键无响应
int g_iMoveState    =  0;
int g_iCurLevel =  1;  // 当前关卡
// 第一块的起始坐标 =-(GRID_COUNT * g_fGridSize * 0.5 - g_fGridSize / 2)
const float g_fGridStartX   =  -27.5f;
const float g_fGridStartY   =  -27.5f;
const float g_fGridSize =  5.f;    // 每块的大小,包括球、出口等都是此大小
int g_iRigidBlockCount  =  0;  // 本关卡创建的阻挡物方块数量
int g_iBlackHoleCount   =  0;  // 本关卡创建的黑洞数量
int g_iGolfExitCount    =  0;  // 本关卡创建的出口的数量
//  二维数组,存储当前关卡N*N的矩阵方块信息
int g_iGridData[GRID_COUNT][GRID_COUNT];
//二维数组中0表示该位置不创建精灵,否则根据不同的值创建不同精灵,
//RIGID_BLOCK(值为1)表示创建一个方块精灵,
//BLACK_HOLE(值为2)表示创建一个黑洞精灵,
//GOLF_EXIT(值为3)表示创建一个出口精灵。
const int m_iLevelData1[GRID_COUNT][GRID_COUNT] = {{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0},
{0, 0, 0, RIGID_BLOCK,  RIGID_BLOCK,    RIGID_BLOCK,    RIGID_BLOCK,    RIGID_BLOCK,    RIGID_BLOCK, 0, 0, 0},
{0, 0, 0, RIGID_BLOCK,  0,              0,              0,              0,              RIGID_BLOCK, 0, 0, 0},
{0, 0, 0, RIGID_BLOCK,  0,              0,              0,              0,              RIGID_BLOCK, 0, 0, 0},
{0, 0, 0, RIGID_BLOCK,  0,              0,              0,              0,              BLACK_HOLE, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              GOLF_EXIT,      RIGID_BLOCK, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0},
{0, 0, 0, 0,            0,              0,              0,              0,              0, 0, 0, 0}
};
const int m_iLevelData2[GRID_COUNT][GRID_COUNT]={{0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, RIGID_BLOCK, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, GOLF_EXIT, RIGID_BLOCK, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, RIGID_BLOCK, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, RIGID_BLOCK, 0}
};
const int m_iLevelData3[GRID_COUNT][GRID_COUNT]={{0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, 0, 0},
{0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, RIGID_BLOCK},
{RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, GOLF_EXIT, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, 0, 0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},
{0, 0, 0, 0, BLACK_HOLE, RIGID_BLOCK, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR     lpCmdLine,
int       nCmdShow)
{// 初始化游戏引擎
if( !dInitGameEngine( hInstance, lpCmdLine ) )
return 0;
g_MiGameState=1;
g_iMoveState=0;
dDeleteSpriteGameInit();
dCreatGameInit();
dSetSpriteLinearVelocity( "ControlBall", 0.f, 0.f );
dSetSpriteVisible( "GolfArrow", 1 );
dCreatInitSpirt();// To do : 在此使用API更改窗口标题
dSetWindowTitle("Lesson");// 引擎主循环,处理屏幕图像刷新等工作
while( dEngineMainLoop() )
{// 获取两次调用之间的时间差,传递给游戏逻辑处理
float   fTimeDelta  =  dGetTimeDelta();
g_MiGameState=2;
// 执行游戏主循环
GameMainLoop( fTimeDelta );
if( 0 != g_iMoveState )
{// 先将控制球精灵坐标转换到二维格子数组索引
float   fPosX   =  dGetSpritePositionX( "ControlBall" );
float   fPosY   =  dGetSpritePositionY( "ControlBall" );
int     iIndexX =  SpritePosXToIndexX( fPosX );
int     iIndexY =  SpritePosYToIndexY( fPosY );
// 控制球已经出了边界,所以不需要再判断
if( iIndexX < 0 || iIndexX >= GRID_COUNT || iIndexY < 0 || iIndexY >= GRID_COUNT )
return 0;
float   fNextPosX   =  fPosX;
float   fNextPosY   =  fPosY;
if( 1 == g_iMoveState )
{fNextPosY -= g_fGridSize * 0.5f;
}
else if( 2 == g_iMoveState )
{fNextPosY += g_fGridSize * 0.5f;
}
else if( 3 == g_iMoveState )
{fNextPosX   -= g_fGridSize * 0.5f;
}
else if( 4 == g_iMoveState )
{fNextPosX   += g_fGridSize * 0.5f;
}
int iNextIndexX =  SpritePosXToIndexX( fNextPosX );
int iNextIndexY =  SpritePosYToIndexY( fNextPosY );
// 该边缘已经出了边界,不需要往下判断
if( iNextIndexX < 0 || iNextIndexX >= GRID_COUNT || iNextIndexY < 0 || iNextIndexY >= GRID_COUNT )
return 0;
//是方块
if( RIGID_BLOCK == g_iGridData[iNextIndexY][iNextIndexX] )
{// 清零移动状态
g_iMoveState = 0;
// 速度清零,显示指示箭头
dSetSpriteLinearVelocity( "ControlBall", 0.f, 0.f );
dSetSpriteVisible( "GolfArrow", 1 );
// 把球和指示箭头设置在本方块的中心
MoveSpriteToBlock( "ControlBall", iIndexX, iIndexY );
MoveSpriteToBlock( "GolfArrow", iIndexX, iIndexY );
}
//是黑洞
else if( BLACK_HOLE == g_iGridData[iNextIndexY][iNextIndexX] )
{// 将游戏状态设置为1,重新开始关卡
g_MiGameState   =  1;
}//是出口
else if( GOLF_EXIT == g_iGridData[iNextIndexY][iNextIndexX] )
{// 将游戏状态设置为1,开始新关卡
g_MiGameState   =  1;
// 往下一关卡,如果已经是最大值,则返回第一关
g_iCurLevel++;
if( g_iCurLevel > MAX_LEVEL )
g_iCurLevel = 1;
}}};// 关闭游戏引擎
dShutdownGameEngine();
return 0;
}

总结

难点是通过二维数组,进行存储当前关卡N*N的矩阵方块信息,其他的地图加载,以及方向移动,通过相应函数编写即可。
完整代码及游戏资源

基于Funcode设计C语言游戏–迷你高尔夫相关推荐

  1. python贪吃蛇设计目标_基于 pygame 设计贪吃蛇游戏

    基于 pygame 设计贪吃蛇游戏 贪吃蛇游戏通过玩家控制蛇移动,不断吃到食物增长,直到碰到蛇身或边界游戏结束.其运行效果如下所示: 游戏开始时,先导入可能需要用到的包. import time im ...

  2. 【C++FunCode】基于Funcode使用C++语言编写小游戏(小鲨鱼历险记)

    一.前言 大一暑假参加了山东省软件设计大赛,基于FunCode平台使用C++语言编写了大鱼吃小鱼游戏,其美名曰小鲨鱼历险记,哈哈.比赛成绩惨烈,只拿了一个省三,赛后也进行了分析总结,主要还是太不重视比 ...

  3. 基于控制台的C语言游戏数据存储

    一.结构 如果设计的游戏不需要保存数据,只是游戏的过程当中产生了数据变化,那么我们就可以用一种结构描述一个物体,用多种结构去描述多种物体,用多种结构的数据变化去描述物体间的行为. 假如你正在制作一款& ...

  4. 基于控制台的c语言游戏常用操作

    一.清屏 #include<stdlib.h>int main() {system("cls"); } 二.按任意键继续 #include<stdlib.h> ...

  5. python3.7魔塔游戏_基于Funcode平台的“火锅版魔塔”游戏开发与设计

    2019 年第 2 期 信息与电脑 China Computer & Communication 软件开发与应用 基于 Funcode 平台的"火锅版魔塔"游戏开发与设计 ...

  6. c语言迷宫求解毕业设计,毕业设计(论文)-基于Windows平台C语言实现迷宫游戏的设计.doc...

    基于Windows平台C语言实现迷宫游戏的设计 摘 要 随着科技的日益发展,计算机信息知识越来越被人们所认知和使用,在当今知识爆炸的时代计算机毫无疑问成为人们常用的日常工具,而Windows和C语言都 ...

  7. 基于Java的坦克大战游戏的设计与实现(论文+PPT+源码)

    幻灯片1 基于Java的坦克大战游戏的设计与实现 幻灯片2 CONTENTS 1 4 设计工具与相关技术 详细设计 2 5 系统分析 结论 3 总体设计 幻灯片3 PPT模板下载:http://www ...

  8. 基于Java的飞机大战游戏的设计与实现论文

    源码下载 http://www.byamd.xyz/hui-zong-1/ 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communicat ...

  9. 基于Java的飞机大战游戏的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的飞机大战游戏的设计与实现 摘   要 现如今,随着智能手机的兴起与普及,加上4G( ...

  10. 基于java的俄罗斯方块小游戏设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 题 目          小游戏开发 摘    要     俄罗斯方块是我们最常见的游戏之一,该 ...

最新文章

  1. php codeigniter 语言,php – codeigniter模板引擎,包括语言解析器
  2. linux怎么创建用户教程,在Linux中如何手动创建一个用户
  3. x509trustmanager怎么验证证书_GeoTrust通配符证书和多域名SSL证书对比评测
  4. log4j配置(转)
  5. php如何查询mysql数据库字符集_修改及查看mysql数据库的字符集_MySQL
  6. 三阶魔方与四阶魔方总结
  7. endl 和 \n 的区别
  8. 并发编程四:深入理解java线程
  9. java路径是什么意思_java路径是什么意思
  10. 利用Hudi Bootstrap转化现有Hive表的parquet/orc文件为Hudi表
  11. 解决[FireDAC][DatS]-32. Variable length column [Name] overflow. Value length - [26], column maximum le
  12. 《数值分析(原书第2版)》—— 2.4 PA=LU分解
  13. 静态资源交替成功失败500
  14. 富可视m310 android 4.4,富可视 M310 4.2.1 ROM刷机包 版本发布公告
  15. 国内外安全漏洞公共资源库
  16. 妲己机器人需要什么条件才能使用_回顾腾讯智能机器人妲己功能介绍
  17. TP4067是一款完整的单节锂电池充电器,世界首创带电池正负极反接保护、输入电源正负极反接保护的单芯片
  18. 吴恩达机器学习(十九)神经网络(I)
  19. 开启MicroPython多线程模式
  20. 【转载】小霸王游戏机 学习机 到底哪个是你以前玩的?屌丝,富二代

热门文章

  1. mybatis-plus自定义sql分页
  2. Java高级工程师必备技能
  3. 基于Socket网络编程
  4. 计算机辅助几何设计知识点,计算机辅助几何设计
  5. java 下载junit的jar包_junit jar包下载-Junit4 jar包下载 --pc6下载站
  6. android禁止电话功能,#Android# 启用“阻止模式”功能,避免半夜电话骚扰!
  7. 基于javaweb+SSM的药品管理系统(java+SSM+html+jQuery+Tomcat+mysql)
  8. 计算机设备硬件维护税收编码,自动化设备的税收编码是多少
  9. Android UUID.randomUUID()生成唯一数,1到100随机数
  10. 用Eclipse创建第一个JSP项目