同求funcode平台下拼图游戏的C语言代码 100
做了好几天,写了好多回就是不对,彻底崩溃。。#include"CommonAPI.h"//#include"LessonX.h"#include<stdio.h>#def...
做了好几天,写了好多回就是不对,彻底崩溃。。
#include "CommonAPI.h"
//#include "LessonX.h"
#include<stdio.h>
#define BLOCK_COUNT 4
int g_iGameState;
intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];
charg_szBlockName[BLOCK_COUNT*BLOCK_COUNT][64];
const float g_fBlockStartX = -40.625f;
const float g_fBlockStartY = -28.125f;
const float g_fBlockSize = 18.75f;
int XYToOneIndex( const int iIndexX, constint iIndexY )
{
return(iIndexY * BLOCK_COUNT + iIndexX);
}
void MoveSpriteToBlock( const char *szName,const int iIndexX, const int iIndexY )
{
floatfPosX = g_fBlockStartX + iIndexX * g_fBlockSize;
floatfPosY = g_fBlockStartY + iIndexY * g_fBlockSize;
dSetSpritePosition(szName, fPosX, fPosY );
}
int OneIndexToX( const int iIndex )
{
return(iIndex % BLOCK_COUNT);
) 展开
#include "CommonAPI.h"
//#include "LessonX.h"
#include<stdio.h>
#define BLOCK_COUNT 4
int g_iGameState;
intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];
charg_szBlockName[BLOCK_COUNT*BLOCK_COUNT][64];
const float g_fBlockStartX = -40.625f;
const float g_fBlockStartY = -28.125f;
const float g_fBlockSize = 18.75f;
int XYToOneIndex( const int iIndexX, constint iIndexY )
{
return(iIndexY * BLOCK_COUNT + iIndexX);
}
void MoveSpriteToBlock( const char *szName,const int iIndexX, const int iIndexY )
{
floatfPosX = g_fBlockStartX + iIndexX * g_fBlockSize;
floatfPosY = g_fBlockStartY + iIndexY * g_fBlockSize;
dSetSpritePosition(szName, fPosX, fPosY );
}
int OneIndexToX( const int iIndex )
{
return(iIndex % BLOCK_COUNT);
) 展开
2个回答
2016-07-07
展开全部
//第一题:#includevoidfun(char*a[],char*b[]){intl;/*获取较短数组的长度*/if(strlen(*a)usingnamespacestd;classCircle{public:voidinput(double);//输入voidprint();//输出doublegetArea();//计算半径private:doubler;//半径};voidCircle::input(doublea){r=a;}doubleCircle::getArea(){returnr*r*3.14159;}voidCircle::print(){cout>a;c.input(a);c.print();return0;}
追问
这是什么鬼。。
享知信息
2023-09-21 广告
2023-09-21 广告
敏捷开发是一种快速响应变化的方法,旨在提高软件开发的效率和灵活性。以下是一些常用的免费敏捷开发工具:1. Trello:一款灵活的看板工具,可用于敏捷项目管理和任务跟踪。2. JIRA Agile:一款功能强大的敏捷项目管理工具,支持看板和...
点击进入详情页
本回答由享知信息提供
2018-06-14
展开全部
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "CommonAPI.h"
#include "LessonX.h"
extern int g_iGameState;
char szName[10];
// 二维数组,存储N*N的矩阵方块信息
int g_iBlockState[4][4];
// 一维数组,存储上面二维数组中的方块精灵的名字。
char g_szBlockName[4 * 4][64];
// 按方块大小,在编辑器里摆放的第一块方块的起始坐标
const float g_fBlockStartX = -40.625f;
const float g_fBlockStartY = -28.125f;
// 屏幕高度75 / 4块 = 18.75每块的大小.编辑器里预先摆放好的方块宽和高 // 必须与此值一致
const float g_fBlockSize = 18.75f;
int XYToOneIndex( const int iIndexX, const int iIndexY )
{
return (iIndexY * 4 + iIndexX);
}
void MoveSpriteToBlock( const char *szName, const int iIndexX, const int iIndexY )
{
float fPosX = g_fBlockStartX + iIndexX * g_fBlockSize;
float fPosY = g_fBlockStartY + iIndexY * g_fBlockSize;
dSetSpritePosition( szName, fPosX, fPosY );
}
// 一维数组索引转换到二维数组索引X,注意这2个数组大小必须一致
int OneIndexToX( const int iIndex )
{
return (iIndex % 4);
}
// 一维数组索引转换到二维数组索引Y,注意这2个数组大小必须一致
int OneIndexToY( const int iIndex )
{
return (iIndex / 4);
}
// 引擎捕捉键盘弹起消息后,将调用到本函数
int IsGameWin()
{
int iLoopX = 0, iLoopY = 0;
int iResult = 1;
for( iLoopY = 0; iLoopY < 4; iLoopY++ )
{
for( iLoopX = 0; iLoopX < 4; iLoopX++ )
{
// 数组的最后一个
if( 4 - 1 == iLoopX && 4 - 1 == iLoopY )
break;
// 其中一个值不等于,那么就没有胜利
if( g_iBlockState[iLoopY][iLoopX] != iResult )
return 0;
iResult++;
}
}
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////
//
// 主函数入口
//
//////////////////////////////////////////////////////////////////////////////////////////
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 初始化游戏引擎
if( !dInitGameEngine( hInstance, lpCmdLine ) )
return 0;
int iLoopX = 0, iLoopY = 0, iLoop = 0;
int iOneIndex = 0, iRandIndex = 0;
int iDataCount = 4 * 4 - 1;
int iRandData[4 * 4 - 1] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
// To do : 在此使用API更改窗口标题
dSetWindowTitle("puzzle");
for( iLoopY = 0; iLoopY < 4; iLoopY++ )
{
for( iLoopX = 0; iLoopX < 4; iLoopX++ )
{
iOneIndex = XYToOneIndex( iLoopX, iLoopY );
// 数组的最后一个
if( 4 - 1 == iLoopX && 4 - 1 == iLoopY )
{
g_iBlockState[iLoopY][iLoopX] = 0;
g_szBlockName[iOneIndex][0] = '\0';
}
else
{
// 在当前剩余未使用到的数值里随机一个出来,赋值给二维数组
iRandIndex = dRandomRange( 0, iDataCount - 1 );
g_iBlockState[iLoopY][iLoopX] = iRandData[iRandIndex];
/* 给对应的名字数组赋值。该名字的方块已经预先在地图里摆放好,因 此只需要生成对应的名字即可,不用创建精灵 */
strcpy( g_szBlockName[iOneIndex], dMakeSpriteName( "PictureBlock", g_iBlockState[iLoopY][iLoopX] ) );
// 将该精灵移动到对应的位置
MoveSpriteToBlock( g_szBlockName[iOneIndex], iLoopX, iLoopY );
for( iLoop = iRandIndex; iLoop < iDataCount - 1; iLoop++ )
{
iRandData[iLoop] = iRandData[iLoop + 1];
}
// 剩余有效值总数减一
iDataCount--;
}
}
}
// 引擎主循环,处理屏幕图像刷新等工作
while( dEngineMainLoop() )
{
// 获取两次调用之间的时间差,传递给游戏逻辑处理
float fTimeDelta = dGetTimeDelta();
// 执行游戏主循环
GameMainLoop( fTimeDelta );
};
// 关闭游戏引擎
dShutdownGameEngine();
return 0;
}
//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void dOnMouseMove( const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
// 只处理游戏进行中的鼠标响应
extern int g_iGameState;
if( 2 != g_iGameState )
return;
int iClickIndex = -1;
int iLoop = 0;
for( iLoop = 0; iLoop < 4 * 4; iLoop++ )
{
if( '\0' == g_szBlockName[iLoop][0] )
continue;
// 使用API dIsPointInSprite 判断指定坐标是否位于某个名字的精灵内部
if( dIsPointInSprite( g_szBlockName[iLoop], fMouseX, fMouseY ) )
{
iClickIndex = iLoop;
break;
}
}
// 判断鼠标是否点中方块
if( -1 == iClickIndex )
return;
// 将该一维数组的Index转换成二维数组的X,Y
int iIndexX = OneIndexToX( iClickIndex );
int iIndexY = OneIndexToY( iClickIndex );
// TODO 在二维数组里查找鼠标点击的方块上下左右4个方向上是否有空位:
// 注意边界判断,否则数组访问会越界。比如判断左边时,需要判断是否已经是 //最左边的索引(iIndexX == 0)
// 如果有空位(值为0),则将该空位的索引赋值给下面这2个变量
int iEmptyIndexX = -1, iEmptyIndexY = -1;
// X 左方向(4个方向均需要判断是否是位于边缘,iIndexX > 0 即起此作用)
if( iIndexX > 0 )
{
if( 0 == g_iBlockState[iIndexY][iIndexX - 1] )
{
iEmptyIndexX = iIndexX - 1;
iEmptyIndexY = iIndexY;
}
}
// X 右方向
if( -1 == iEmptyIndexX && iIndexX < 4 - 1 )
{
if( 0 == g_iBlockState[iIndexY][iIndexX + 1] )
{
iEmptyIndexX = iIndexX + 1;
iEmptyIndexY = iIndexY;
}
}
// Y 上方向
if( -1 == iEmptyIndexY && iIndexY > 0 )
{
if( 0 == g_iBlockState[iIndexY - 1][iIndexX] )
{
iEmptyIndexX = iIndexX;
iEmptyIndexY = iIndexY - 1;
}
}
// Y 下方向
if( -1 == iEmptyIndexY && iIndexY < 4 - 1 )
{
if( 0 == g_iBlockState[iIndexY + 1][iIndexX] )
{
iEmptyIndexX = iIndexX;
iEmptyIndexY = iIndexY + 1;
}
}
// 判断是否找到空位
if( -1 == iEmptyIndexX || -1 == iEmptyIndexY )
return;
// 有空位,在二维数组里,将该索引对应的值进行交换
g_iBlockState[iEmptyIndexY][iEmptyIndexX] = g_iBlockState[iIndexY][iIndexX];
g_iBlockState[iIndexY][iIndexX] = 0;
// 对应的名字也进行交换
int iOneIndex = XYToOneIndex( iEmptyIndexX, iEmptyIndexY );
strcpy( g_szBlockName[iOneIndex], g_szBlockName[iClickIndex] );
g_szBlockName[iClickIndex][0] = '\0';
// 将该精灵移动到对应的位置
MoveSpriteToBlock( g_szBlockName[iOneIndex], iEmptyIndexX, iEmptyIndexY );
}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
void dOnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// iAltPress iShiftPress iCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{
extern int g_iGameState;
if(iKey==KEY_SPACE&&g_iGameState==0)
{
g_iGameState=1;
dSetSpriteVisible("GameBegin",0);
}
}
void dOnKeyUp( const int iKey )
{
// 可以在此添加游戏需要的响应函数
}
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
}
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// iColSide : 0 左边,1 右边,2 上边,3 下边
void dOnSpriteColWorldLimit( const char *szName, const int iColSide )
{
}
//
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "CommonAPI.h"
#include "LessonX.h"
extern int g_iGameState;
char szName[10];
// 二维数组,存储N*N的矩阵方块信息
int g_iBlockState[4][4];
// 一维数组,存储上面二维数组中的方块精灵的名字。
char g_szBlockName[4 * 4][64];
// 按方块大小,在编辑器里摆放的第一块方块的起始坐标
const float g_fBlockStartX = -40.625f;
const float g_fBlockStartY = -28.125f;
// 屏幕高度75 / 4块 = 18.75每块的大小.编辑器里预先摆放好的方块宽和高 // 必须与此值一致
const float g_fBlockSize = 18.75f;
int XYToOneIndex( const int iIndexX, const int iIndexY )
{
return (iIndexY * 4 + iIndexX);
}
void MoveSpriteToBlock( const char *szName, const int iIndexX, const int iIndexY )
{
float fPosX = g_fBlockStartX + iIndexX * g_fBlockSize;
float fPosY = g_fBlockStartY + iIndexY * g_fBlockSize;
dSetSpritePosition( szName, fPosX, fPosY );
}
// 一维数组索引转换到二维数组索引X,注意这2个数组大小必须一致
int OneIndexToX( const int iIndex )
{
return (iIndex % 4);
}
// 一维数组索引转换到二维数组索引Y,注意这2个数组大小必须一致
int OneIndexToY( const int iIndex )
{
return (iIndex / 4);
}
// 引擎捕捉键盘弹起消息后,将调用到本函数
int IsGameWin()
{
int iLoopX = 0, iLoopY = 0;
int iResult = 1;
for( iLoopY = 0; iLoopY < 4; iLoopY++ )
{
for( iLoopX = 0; iLoopX < 4; iLoopX++ )
{
// 数组的最后一个
if( 4 - 1 == iLoopX && 4 - 1 == iLoopY )
break;
// 其中一个值不等于,那么就没有胜利
if( g_iBlockState[iLoopY][iLoopX] != iResult )
return 0;
iResult++;
}
}
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////
//
// 主函数入口
//
//////////////////////////////////////////////////////////////////////////////////////////
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 初始化游戏引擎
if( !dInitGameEngine( hInstance, lpCmdLine ) )
return 0;
int iLoopX = 0, iLoopY = 0, iLoop = 0;
int iOneIndex = 0, iRandIndex = 0;
int iDataCount = 4 * 4 - 1;
int iRandData[4 * 4 - 1] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
// To do : 在此使用API更改窗口标题
dSetWindowTitle("puzzle");
for( iLoopY = 0; iLoopY < 4; iLoopY++ )
{
for( iLoopX = 0; iLoopX < 4; iLoopX++ )
{
iOneIndex = XYToOneIndex( iLoopX, iLoopY );
// 数组的最后一个
if( 4 - 1 == iLoopX && 4 - 1 == iLoopY )
{
g_iBlockState[iLoopY][iLoopX] = 0;
g_szBlockName[iOneIndex][0] = '\0';
}
else
{
// 在当前剩余未使用到的数值里随机一个出来,赋值给二维数组
iRandIndex = dRandomRange( 0, iDataCount - 1 );
g_iBlockState[iLoopY][iLoopX] = iRandData[iRandIndex];
/* 给对应的名字数组赋值。该名字的方块已经预先在地图里摆放好,因 此只需要生成对应的名字即可,不用创建精灵 */
strcpy( g_szBlockName[iOneIndex], dMakeSpriteName( "PictureBlock", g_iBlockState[iLoopY][iLoopX] ) );
// 将该精灵移动到对应的位置
MoveSpriteToBlock( g_szBlockName[iOneIndex], iLoopX, iLoopY );
for( iLoop = iRandIndex; iLoop < iDataCount - 1; iLoop++ )
{
iRandData[iLoop] = iRandData[iLoop + 1];
}
// 剩余有效值总数减一
iDataCount--;
}
}
}
// 引擎主循环,处理屏幕图像刷新等工作
while( dEngineMainLoop() )
{
// 获取两次调用之间的时间差,传递给游戏逻辑处理
float fTimeDelta = dGetTimeDelta();
// 执行游戏主循环
GameMainLoop( fTimeDelta );
};
// 关闭游戏引擎
dShutdownGameEngine();
return 0;
}
//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void dOnMouseMove( const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
// 只处理游戏进行中的鼠标响应
extern int g_iGameState;
if( 2 != g_iGameState )
return;
int iClickIndex = -1;
int iLoop = 0;
for( iLoop = 0; iLoop < 4 * 4; iLoop++ )
{
if( '\0' == g_szBlockName[iLoop][0] )
continue;
// 使用API dIsPointInSprite 判断指定坐标是否位于某个名字的精灵内部
if( dIsPointInSprite( g_szBlockName[iLoop], fMouseX, fMouseY ) )
{
iClickIndex = iLoop;
break;
}
}
// 判断鼠标是否点中方块
if( -1 == iClickIndex )
return;
// 将该一维数组的Index转换成二维数组的X,Y
int iIndexX = OneIndexToX( iClickIndex );
int iIndexY = OneIndexToY( iClickIndex );
// TODO 在二维数组里查找鼠标点击的方块上下左右4个方向上是否有空位:
// 注意边界判断,否则数组访问会越界。比如判断左边时,需要判断是否已经是 //最左边的索引(iIndexX == 0)
// 如果有空位(值为0),则将该空位的索引赋值给下面这2个变量
int iEmptyIndexX = -1, iEmptyIndexY = -1;
// X 左方向(4个方向均需要判断是否是位于边缘,iIndexX > 0 即起此作用)
if( iIndexX > 0 )
{
if( 0 == g_iBlockState[iIndexY][iIndexX - 1] )
{
iEmptyIndexX = iIndexX - 1;
iEmptyIndexY = iIndexY;
}
}
// X 右方向
if( -1 == iEmptyIndexX && iIndexX < 4 - 1 )
{
if( 0 == g_iBlockState[iIndexY][iIndexX + 1] )
{
iEmptyIndexX = iIndexX + 1;
iEmptyIndexY = iIndexY;
}
}
// Y 上方向
if( -1 == iEmptyIndexY && iIndexY > 0 )
{
if( 0 == g_iBlockState[iIndexY - 1][iIndexX] )
{
iEmptyIndexX = iIndexX;
iEmptyIndexY = iIndexY - 1;
}
}
// Y 下方向
if( -1 == iEmptyIndexY && iIndexY < 4 - 1 )
{
if( 0 == g_iBlockState[iIndexY + 1][iIndexX] )
{
iEmptyIndexX = iIndexX;
iEmptyIndexY = iIndexY + 1;
}
}
// 判断是否找到空位
if( -1 == iEmptyIndexX || -1 == iEmptyIndexY )
return;
// 有空位,在二维数组里,将该索引对应的值进行交换
g_iBlockState[iEmptyIndexY][iEmptyIndexX] = g_iBlockState[iIndexY][iIndexX];
g_iBlockState[iIndexY][iIndexX] = 0;
// 对应的名字也进行交换
int iOneIndex = XYToOneIndex( iEmptyIndexX, iEmptyIndexY );
strcpy( g_szBlockName[iOneIndex], g_szBlockName[iClickIndex] );
g_szBlockName[iClickIndex][0] = '\0';
// 将该精灵移动到对应的位置
MoveSpriteToBlock( g_szBlockName[iOneIndex], iEmptyIndexX, iEmptyIndexY );
}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
void dOnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// iAltPress iShiftPress iCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{
extern int g_iGameState;
if(iKey==KEY_SPACE&&g_iGameState==0)
{
g_iGameState=1;
dSetSpriteVisible("GameBegin",0);
}
}
void dOnKeyUp( const int iKey )
{
// 可以在此添加游戏需要的响应函数
}
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
}
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// iColSide : 0 左边,1 右边,2 上边,3 下边
void dOnSpriteColWorldLimit( const char *szName, const int iColSide )
{
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询