01-2016.07-小学期游戏开发《坦克大战》

本文介绍了使用C语言和funcode虚拟游戏引擎开发《坦克大战》游戏的过程,包括游戏功能描述、流程图、详细设计。玩家可选择单双人对战和地图,通过WASD和J键控制坦克移动和开炮。敌方坦克会自动开炮并变换方向。游戏包含暂停、继续、计分系统和BUFF效果。开发过程中,作者提升了编程技能,学会了问题解决和团队合作。
摘要由CSDN通过智能技术生成

《坦克大战》游戏整体设计及框架

1.游戏功能描述

按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左侧。

在游戏进入之前,可选单人对战or双人对战。

在游戏进入之前,可选地图1 or 2 or 3。

游戏时间到,比如30秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。

游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。墙为正方形,边长为4,坦克也是正方形,比墙略小一点。

玩家用WASD键控制坦克上、下、左、右运行,按J键开炮。玩家坦克碰到墙就停下来,需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。玩家没摧毁一辆敌方坦克,加1分。

玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。

每隔几秒钟,比如3秒,就会产生一辆敌方坦克。敌方坦克每隔一段时间,比如1秒,就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继续前进。每隔几秒钟,比如2秒,敌方坦克就会顺时针变换一个方向前进。

在开炮时,有开炮声音。

每隔12s出现一个BUFF,当玩家坦克吃到BUFF的时候,实现敌方坦克全屏清除,得分加10。若在BUFF出现后8s内玩家坦克没有吃到,则BUFF自动消失。

游戏进行中时,P键暂停游戏,O键继续游戏。

2. 游戏流程图

3. 详细设计

 

主函数模块main()函数模块

主要功能为启动游戏引擎,刷新时间循环,进入游戏主循环,关闭游戏引擎。

List.cpp文件,游戏主循环

  • 游戏主循环:
  • // 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
    // 用以处理游戏的开始、进行中、结束等各种状态. 
    // 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
    void GameMainLoop( float	fDeltaTime )
    {	
    	dSetWindowTitle("TANKWAR");  // 设置游戏窗口标题
    	float	fTimeDelta	=	dGetTimeDelta();
    	switch( g_iGameState )
    	{
    		// 初始化游戏,清空上一局相关数据
    		case 1:
    		{
    			GameInit();
    			g_iGameState	=	2; // 初始化之后,将游戏状态设置为进行中
    		}
    		break;
    
    		// 游戏进行中,处理各种游戏逻辑
    		case 2:
    		{
    			// TODO 修改此处游戏循环条件,完成正确游戏逻辑*********************
    			if(g_bStart)
    			{
    				GameRun( fDeltaTime );
    			}
    			else
    			{
    				// 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态
    				g_iGameState	=	0;
    				GameEnd();
    			}
    		}
    		break;
    
    		// 游戏结束/等待按空格键开始
    		case 0:
    		default:
    			break;
    		}	
    	}
    
  • 游戏开始前初始化
  • // 每局开始前进行初始化,清空上一局相关数据
    void GameInit()
    {
    	CreatePlayer();
    	CreateSecondPlayer();
    	Loadmap();
    }
    
  • 游戏进行中
  • // 每局游戏进行中
    void GameRun( float fDeltaTime )
    {
    	if(pause)
    	{
    		g_fGameTime += fDeltaTime;
    		dSetTextValue("time", (int)g_fGameTime);
    		g_BuffTime+=fDeltaTime;
    		if(g_BuffTime>12.f)//12秒出现一个buff
    		{
    			dCloneSprite("boomtime","boomtime0");
    			dSetSpritePosition("boomtime0",dRandomRange(-25,25),dRandomRange(-21,21));
    			dSetSpriteCollisionReceive("boomtime0", true);
    			g_BuffTime=0;
    		}
    		if(g_BuffTime>8.f)
    			dDeleteSprite("boomtime0");
    
    		// 时间到,生成新一批敌方坦克
    		g_fCreateTime -= fDeltaTime;
    		if(g_fCreateTime < 0.f)
    		{
    			g_fCreateTime = CREATE_TANK_TIME;
    			CreateEnemyTanks();	
    			g_shuliang++;
    		}
    		// 链表节点指针
    		Weapon* pNode	= g_pHead;  
    		int num = GetListSize();  // 当前链表的节点数量
    		// 遍历当前链表,寻找敌方坦克节点
    		for(int i=0; i<num; i++)
    		{
    			if(pNode->iType == ENEMYTANK)  // 敌方坦克
    			{
    				// 到敌方坦克调转方向时间
    				pNode->fRotateTime -= fDeltaTime;
    				if(pNode->fRotateTime < 0.f)  
    				{
    					pNode->fRotateTime = ROTATE_TIME;
    					MoveEnemyTank(pNode->szName);
    				}
    					pNode->fFireTime -= fDeltaTime;
    					if(pNode->fFireTime < 0.f)
    				{
    					pNode->fFireTime = FIRE_TIME;
    					OnFire(pNode->szName, ENEMYBULLET);
    				}
    			}
    					pNode = pNode->pNext;
    		}		
    	}
    
    }
    

     

  • 游戏结束
  • // 本局游戏结束
    //删除地图
    void GameEnd()
    {
    	char szName[128];
    	for(int i=0; i<g_iWallCount; i++)
    	{sprintf(szName, "wall%d", i);dDeleteSprite(szName);}
    	for(int a=0; a<g_iGrassCount; a++)
    	{sprintf(szName, "grass%d", a);dDeleteSprite(szName);}
    	for(int b=0; b<g_iStockCount; b++)
    	{sprintf(szName, "stock%d", b);dDeleteSprite(szName);}
    	g_iWallCount = 0;
    	bLoad = true;
    	// 设置指挥所不可见
    	dSetSpriteVisible("goal", false);
    	DeleteList();
    	dSetSpriteVisible(g_pMyTank->szName, false);
    	dSetSpriteVisible(g_pMyTank2->szName, false);
    	dSetSpritePosition("gameover", 0, 0);dSetSpriteVisible("gameover",true);
    	dSetSpriteVisible("boomtime0", false);
    g_h_score=g_iScore+g_iScore2;
    dSetTextValue("historyscore",g_h_score);
    if(g_highestscore<=g_h_score)
    {
    	g_highestscore=g_h_score;
    dSetTextValue("highestscore",g_highestscore);
    }
    g_iScore=0;
    g_iScore2=0;
    }
    
  • 鼠标移动
  • // 鼠标移动
    // 参数 fMouseX, fMouseY:为鼠标当前坐标
    void OnMouseMove( const float fMouseX, const float fMouseY )
    {
    	if(g_xuanze==2)
    	{
    		if (dIsPointInSprite("single",fMouseX,fMouseY))
    				dSetSpriteVisible("baitiao2",true);
    		else
    				dSetSpriteVisible("baitiao2",false);
    		if (dIsPointInSprite("double",fMouseX,fMouseY))
    				dSetSpriteVisible("baitiao1",true);
    		else
    				dSetSpriteVisible("baitiao1",false);
    	}
    }
    
  • 鼠标点击
  • // 鼠标点击
    // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
    // 参数 fMouseX, fMouseY:为鼠标当前坐标
    void OnMouseClick( const int iMouseType, const float fMouseX, const float
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Funcode编程C++实现坦克大战游戏课程设计 1.内容 在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。 2.任务和要求 1).游戏有一个初始游戏页面。 2).按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。 3).敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。 4).敌方坦克共有20辆,每隔5秒,从屏幕上方的左、中、右三个位置依次出现。 5).当玩家被消灭或者我方基地被摧毁时,游戏结束。 二、设计思路 1.数据结构 CSprite* m_pSplash;//开始的静态图 CSprite* m_pStart;//开始的静态图画 CTankPlayer* m_pTankplayer;//指向我方坦克的指针 CBullet* m_pBullet;//指向子弹的指针 CWeapon* m_pAim_nor;//家 流程图: case 2 case1 case3 (此处略去部分文件内容) 2.算法 定义了四个类,他们分别是子弹类(用来描述子弹的移动,碰撞等),敌方坦克类(用来描述敌方坦克的移动,碰撞等),我方坦克类(用来描述我方坦克的移动,碰撞等),武器类(作为子弹类,敌方坦克类,我方坦克类的基类。) CGameMain::CGameMain()构造函数: 完成初始化工作: 1、为指针数据分配内存空间,普通数据设置初值。 2、初始化精灵类start,对应“空格开始”精灵。 CGameMain::GameMainLoop(float fDeltaTime ) 游戏的主循环,根据游戏的状态切换逻辑 1、当游戏状态为0时,主循环一直循环,但不做处理,而是等待空格键按下,开始游戏。 2、当游戏状态为1时,调用GameInit()方法初始化游戏,然后置游戏状态为2。 3、当游戏状态为2时: 1.调游戏进行中,处理各种游戏逻辑 2.修改游戏结束状态为结束 (查看超全完整文件请下载观看,良心文档谢谢您的支持!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值