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

article/2025/9/3 4:26:02

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的矩阵方块信息,其他的地图加载,以及方向移动,通过相应函数编写即可。
完整代码及游戏资源


http://chatgpt.dhexx.cn/article/PNjLqKhW.shtml

相关文章

2021年Funcode游戏制作二等奖作品

之前发的有关funcode游戏更多的则是对游戏流程有一个大概的了解&#xff0c;以及如何编写游戏循环&#xff0c;判定游戏的各种触发条件&#xff0c;较为简陋。 这一次看到有人问funcode游戏的制作&#xff0c;就把搁置了许久的 项目拿给大家作为参考建议。 素材来源&#xff1a…

【致敬童年】Funcode实现坦克大战

【2023年5月26日】 带10个需求的资源已上传至Funcode实现坦克大战&#xff08;十个需求&#xff09; 【效果图】 【写在前面的话】 1、虚函数哪里很难受&#xff0c;最后在Commclass里面加了一个无参构造才搞定 2、bug很多&#xff0c;比如世界边界&#xff0c;子弹都有问题。…

Funcode游戏设计C语言小飞虫

Funcode游戏制作 文章目录 Funcode游戏制作前言一、基于Funcode的小飞虫二、使用步骤1.游戏效果图2.游戏代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&…

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

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

Funcode实现坦克大战(十个需求)

【写在前言】 1、操作 先按数字&#xff08;1~0&#xff09;10个 表示选择某一需求&#xff08;对应文件的需求&#xff09; 再按K 表示执行该需求&#xff08;控制台有输出&#xff09; 2、写此文为方便大家的学习&#xff0c;希望不要一抄了事&#xff0c;真心希望&#xff0…

Funcode海底世界c++(vc6)

海底有五条鱼&#xff0c;其中四条来回随机游动&#xff0c;由玩家用键盘W A S D控制另外一条游动。 要求如下&#xff1a; 游戏初始界面如下图。来回游动的四条鱼&#xff0c;从屏幕左边游进来&#xff0c;均已一个随机速度水平游动。从屏幕右侧游出去&#xff0c;很快又从屏…

Funcode实现打飞虫1

简介&#xff1a; “拍飞蝇”是一款非常受欢迎的小游戏&#xff0c;这个游戏的玩法非常简单&#xff0c;玩家需要控制一个拍子来打飞来的苍蝇。每次打死一只苍蝇&#xff0c;就能够获得一定的分数。同时&#xff0c;也会有不同种类的苍蝇出现&#xff0c;它们的移动速度和得分也…

进击系列2.0:进击的骑士-----用funcode与C语言实现射击游戏制作

funcode实现射击游戏----进击的骑士 相关程序&#xff1a;https://download.csdn.net/download/hidden_sword/86237168 制作软件funcode funcode为一款可以进行二维游戏制作的软件&#xff0c;可以兼容vc6.0及codeblocks等C语言编译器。funcode可实现动画制作&#xff0c;地…

Funcode实现黄金矿工

前言&#xff1a; 一步步按照下面的步骤走&#xff0c;肯定是可以运行的。 此文优化了文档中的一些Bug 代码不是很重要&#xff0c;最重要的还是学习编程的思想。毕竟funcode并不是一个常用的软件 如果有问题&#xff0c;欢迎在下面留言&#xff0c;我会竭尽所能进行解答 一、准…

Funcode学习笔记:完成Run、Jump、Idle等动作【后续更新Roll、Attack动作的实现】【By Myself】

先来实现Run和Idle动作吧&#xff1b; 【以下是本菜在写游戏时犯下的一些错误&#xff0c;以及一些灵感&#xff0c;即如何解决逻辑错误的&#xff1b;】 首先&#xff0c;先大概说一下我们的愿景是什么&#xff0c;当我们按下A键时&#xff0c;人物向左边运动&#xff0c;且…

funcode小游戏暑假大作业,开源,新颖,游戏名:凿空,免费。

Funcode小游戏暑期大作业新颖制作 &#x1f601;里面有五个关卡&#xff0c;每个关卡玩法不同&#xff0c;虽然技术含量不高&#xff0c;但是绝对够新颖。 &#x1f602;本款游戏名叫凿空&#xff0c;小组合作制品&#xff0c;当时对代码没那么了解&#xff0c;所以写起来比较乱…

手把手教你做多重线性逐步回归

1.案例背景与分析策略 1.1 案例背景介绍 某研究收集到美国50个州关于犯罪率的一组数据&#xff0c;包括人口、面积、收入、文盲率、高中毕业率、霜冻天数、犯罪率共7个指标&#xff0c;现在我们想考察一下州犯罪率和哪些指标有关。数据上传SPSSAU后&#xff0c;在 “我的数据…

讲讲逐步回归

总第178篇/张俊红 01.前言 前面我们讲过了多元线性回归。这一篇我们来讲讲逐步回归。什么是逐步回归呢&#xff1f;就是字面意思&#xff0c;一步一步进行回归。 我们知道多元回归中的元是指自变量&#xff0c;多元就是多个自变量&#xff0c;即多个x。这多个x中有一个问题需要…

多重共线性产生原因及处理办法+R语言+糖尿病数据案例分析+逐步回归法

1、多重共线性 多重共线性一般是在&#xff08;1&#xff09;时间序列数据和&#xff08;2&#xff09;横截面数据中会发生。 产生的影响 &#xff08;1&#xff09;OLS得到的回归参数估计值很不稳定 &#xff08;2&#xff09;回归系数的方差随共线性强度增加而增长 &#…

SPSS多元线性回归及逐步回归教程

点击分析->回归->线性会出来如图 选择自变量&#xff0c;因变量。点击左侧然后点击即可选择变量并将它添加到自变量、因变量。 点击统计&#xff0c;需要额外勾选共线性诊断和然后点击继续&#xff0c;点击 设置成如图 。 解释&#xff1a;---------------------------…

Python OLS 双向逐步回归

算法基本思路&#xff1a;首先需要确定一个因变量y以此构建一元回归方程&#xff0c;再找到已通过显著性检验的一元线性回归方程中F值最大的解释变量x0&#xff0c;将其并入回归方程中&#xff0c;再分别将剩余的解释变量与解释变量x0作为OLS函数的自变量集拟合回归方程&#x…

逐步回归分析

逐步回归分析 在实际问题中,首先碰到的问题是如何确定自变量。通常是根据所研究的问题,结合经济理论,罗列出对因变量可能有影响的一些因素作为自变量。 因此,我们需要挑选出对因变量有显著影响的自变量,构造最优的回归方程。 逐步回归的基本思想是:将变量一个一个引入,…

向前逐步回归

向前逐步回归 我们在进行拟合的时候&#xff0c;没有必要将所有变量都引入到我们的函数之中&#xff0c;这种操作往往会导致过拟合&#xff0c;而过拟合带来的致命影响就是泛化能力差&#xff0c;最小二乘法估计参数的时候无法终止学习的过程。向前逐步回归的引入则可以控制学…

SPSSAU中逐步回归法——探索分析单支股票数据(实践)

数据说明&#xff1a; 还是选择万兴科技的股票数据来做回归分析&#xff0c;和《股票时序分析和时序模型&#xff08;实践&#xff09;》这篇文章使用数据一致。需要说明由于spssau免费账号最多输入50项数据&#xff0c;所以使用的都是近50期数据。 spssau上的相关分析图 pyth…