10 C语言课程设计_坦克大战(提高篇)

合集下载

10 C语言课程设计_坦克大战(提高篇)

10 C语言课程设计_坦克大战(提高篇)

C语言课程设计--坦克大战一、游戏介绍玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时间到,一局游戏结束。

二、实验目的综合应用C语言知识和设计知识开发一款小游戏。

三、实验内容初始界面如下图。

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

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

游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。

墙为正方形,边长为4,坦克也是正方形,比墙略小一点。

玩家用WASD键控制坦克上、下、左、右运行,按J键开炮。

玩家坦克碰到墙就停下来,需要调转方向才能继续前进。

玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。

玩家没摧毁一辆敌方坦克,加1分。

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

每隔几秒钟,比如3秒,就会产生一辆敌方坦克。

敌方坦克每隔一段时间,比如1秒,就自动开炮。

敌方坦克遇到墙就会停下来。

停下来的坦克,前方的墙如果被摧毁了,又能继续前进。

每隔几秒钟,比如2秒,敌方坦克就会顺时针变换一个方向前进。

四、实验准备本实验中可能用到的C 语言标准库函数和FunCode API Stdio.hMath.hString.hFunCode API原图的角度获得的旋转角度即为两张图片的五、程序初步设计如果程序规模比较小的时候,我们习惯一上手就写代码,边写边调整。

但是当程序越来越大,代码越来越多的时候,如果我们还用这种方式编程,程序写到一半的时候,你可能会恨不得重写一遍。

此,我们在写代码之前,先把程序功能细化一下,并初步设计好程序结构,包括数据结构和自定义函数。

有了比较清晰的思路以后,再开始开发程序。

在本项目中,我们要操作的对象有6个:玩家坦克、敌方坦克、玩家子弹、敌方子弹、墙、玩家指挥部。

C语言完整游戏项目坦克大战详细代码

C语言完整游戏项目坦克大战详细代码

C语⾔完整游戏项⽬坦克⼤战详细代码话不多说我们今天就来创造出属于我们⾃⼰的《坦克⼤战》,GOGOGO直接开始吧这次的源码⽐较详细,我分了好⼏个cpp⽂件,思路更加的清晰,请耐⼼⽤⼼的观看⾸先就是我们载⼊图⽚的函数tupian.cpp# include "tanke.h"障碍物void LaoWang(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32 , 32 , &img, 32 * 5, 0 );}void tileHong(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 0, 0 );return;}void tileLv(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 2, 0 );return;}void tileBai(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 1, 0 );return;}IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 3, 0 ); }//物品void FaZhang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\fazhang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShouQiang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\shouqiang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShangDian(int *wupinx, int *wupiny){IMAGE img;loadimage(&img,_T("res\\shangdian.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void YaoShui(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\yaoshui.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void DunPai(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\dunpai.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void XieZi(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\ iezi.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void Boss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\boss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void BigBoss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\bigboss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }接下来是初始化的函数waiyuan.cpp# include "tanke.h"{setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾃⼰⽣命值:";outtextxy(0, 20, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *j) / 60.0);outtextxy(90, 20, c3);}void DShengMing(int * d,int *k){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "敌⼈⽣命值:";outtextxy(0, 0, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *d) / 60.0);outtextxy(90, 0, c3);char c4[40] = "恭喜~! 现在起⾦币到2200有惊喜!";//胜利 if ( *k >= 8000 ){setcolor(YELLOW);settextstyle(30, 0, ("宋体"));outtextxy(150, 0, c4);}}void Gold(int * gold){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾦币:";outtextxy(0, 40, c2);char c3[10] ;sprintf(c3, _T("%d"), *gold);outtextxy(40, 40, c3);}void start(void){initgraph(200, 130);TCHAR s1[10]="坦克⼤战";TCHAR s2[30]="按A 开始游戏按B 退出游戏";TCHAR s3[30]="按W S A D控制⽅向";TCHAR s4[20]="按J 发射⼦弹";TCHAR s5[20]="按C 看攻略";outtextxy(70, 0, s1);outtextxy(0, 110, s2);outtextxy(60, 90, s5);outtextxy(55, 30, s4);outtextxy(35, 60, s3);while (true){Sleep(500);if (GetAsyncKeyState('A')){BeginBatchDraw();closegraph();initgraph(640, 480);Sleep(200);Quit();return ;}if (GetAsyncKeyState('C'))GongLue();}}}void GongLue(void){initgraph(450, 300);TCHAR s1[20]="游戏攻略:";TCHAR s2[50]="再打坦克之前先吃法杖打掉⽩⾊砖块,";TCHAR s3[50]="这样敌坦克打⽩⾊就不能回⾎了,boss更应如此。

(汇编代码)微机原理课程设计之TANK坦克大战

(汇编代码)微机原理课程设计之TANK坦克大战
测试报告
测试游戏功能是否正常
检查游戏性能是否达标
调试游戏中的错误和问题
优化游戏性能和体验
游戏测试:成功运 行,无严重错误
调试过程:定位并 修复了若干问题
测试结果:性能稳 定,符合预期
结论:游戏测试和 调试工作顺利完成
游戏优化和改进
优化算法:采用更高效的算法,减 少计算量,提高游戏运行速度。
完 成 TA N K 坦 克 大 战 游 戏 的 程 序设计和实现
学会使用汇编语言进行编程
掌握游戏的基本规则和玩法
游戏规则和玩法
游戏目标:击败所有敌人,保护基地 角色设定:玩家扮演坦克,有生命值和弹药量限制 武器装备:多种武器可供选择,不同武器有不同的攻击力和射程 游戏地图:多个关卡,每个关卡有不同的地形和敌人配置
添加标题
游戏状态管理:游戏状态包括开始、进行中和结束三个状态。在开 始状态下,玩家可以开始游戏;在进行中状态下,玩家可以操作坦 克移动和射击;在结束状态下,游戏结束并给出评价。
添加标题
游戏角色行为:游戏角色包括玩家坦克和敌方坦克。玩家坦克的行 为包括移动和射击;敌方坦克的行为包括移动和攻击。
游戏界面布局:简洁明了,易于操作 角色设计:形象生动,符合游戏主题 场景设计:丰富多样,增加游戏趣味性 特效设计:绚丽多彩,提升游戏体验感
添加标题
添加标题
添加标题
添加标题
敌方角色:游戏中的敌方坦克种类多 样,包括轻型坦克、重型坦克、自行 火炮等,具有不同的攻击和防御能力, 对玩家构成威胁。
游戏辅助角色:游戏中的一些辅助角 色,如地图、弹药补给点等,为玩家 提供地图信息和弹药补给服务,帮助 玩家更好地进行游戏。
游戏程序设计和实 现
游戏整体架构:包 括游戏的主要功能 模块和各模块之间 的关系

C++实例编程:简单坦克大战_C/C++_IT哇咔_IT技术爱好者之家

C++实例编程:简单坦克大战_C/C++_IT哇咔_IT技术爱好者之家
case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/
}
}
void DrawAmy(int x,int y,int i)/*画敌人*/
{
if(amy[i].color==12)
bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
}
void DrawBrick(int x,int y)/*画砖*/
{
setfillstyle(SOLID_FILL,6);
bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
setcolor(15);
line(100+x*20-9,50+y*20-4,100+x*20+9,50+y*20-4);
line(100+x*20-9,50+y*20+4,100+x*20+9,50+y*20+4);
line(100+x*20-4,50+y*20-9,100+x*20-4,50+y*20+9);
setcolor(12);
else if(amy[i].color==13)
setcolor(13);
else/*这里是判断三种颜色的坦克*/
setcolor(14);
circle(100+x*20,50+y*20,7);

新世纪坦克大战课程设计报告

新世纪坦克大战课程设计报告

计算机学院计算机科学与技术专业《程序设计综合课程设计》报告(2010/2011学年第一学期)学生姓名:学生班级:学生学号:指导教师:2011年 1 月9 日新世纪坦克大战目录《程序设计基础》课程设计 (1)——《新世纪坦克大战》 (1)一.课程设计目的和要求 (1)二.课程设计任务内容 (1)三.详细设计说明 (1)(1)需求分析 (1)(2)算法设计 (2)(3)数据结构设计 (2)(5)功能函数设计 (4)(6)函数调用流程 (4)(7)编码和实现 (4)(8)调试和运行 (5)四.软件使用说明 (9)五.课程设计心得与体会 (9)附录1:参考文献 (10)附录2:程序清单 (11)《程序设计基础》课程设计——《新世纪坦克大战》一.课程设计目的和要求1.熟悉c++的各种编译技巧和注意事项。

2.能就实际问题提出问题并给予分析。

3.学会分析程序所具备的功能,并把各个功能分类处理。

4.提高使用c++处理实际问题的能力。

5.提高c++编程的实践能力。

二.课程设计任务内容在DOS界面上实现一个简单的《新世纪坦克大战》小游戏。

要求能够自主调整射程,随机给出爆炸效果,判断胜负,画面颜色丰富,基本实现动画效果。

三.详细设计说明(1)需求分析1.游戏规则、特色以及作者版权的介绍。

2.游戏主要背景的输出。

3.背景以及前景的颜色设置。

4.玩家坦克射程的判断。

5.敌对坦克的射程的随机给出以及判断。

6.爆炸效果画面的选取调用以及输出。

7.胜负的判断以及相关函数的调用以及输出。

8.实现游戏回合制的循环。

(2)算法设计将游戏画面底部作为一条数轴,划分为22个部分。

玩家输入射击仰角n,根据仰角n的不同,出现不同的爆炸效果(包括击中对方获胜)。

程序给出一个随机数m,作为敌对坦克的射击仰角,根据仰角m,出现不同的爆炸效果(包括击中玩家致使玩家失败)。

(3)数据结构设计坦克输出画面函数:void picture00(){cout<<" ### ***"<<'\n';cout<<" ####### *******"<<'\n';cout<<" ##### *****"<<'\n';cout<<"#######*******"<<'\n';cout<<"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"<<'\n';}随机数生成函数:srand(time(0));m=rand()%20-1;(5)功能函数设计1.不同的效果画面,包括背景颜色的输出。

c语言坦克大战最新代码

c语言坦克大战最新代码
} key=bioskey(0);
judge_tank_my(map,key);/*判断己方坦克运动函数*/
} aaa: ; } void map_all(int map[15][15])/*初始化地图函数*/ { int i,j; for(i=0;i<15;i++)
for(j=0;j<15;j++) switch(map[j][i]) { case 0: break; case 5:map_wall(i,j);break;/*地形*/ case 6:map_steel(i,j);break; case 7:map_water(i,j);break; case 8:map_border(i,j);break; case 9:map_base(i,j);break; }
void uptank(int i,int j,int color);/*画坦克函数*/ void downtank(int i,int j,int color); void lefttank(int i,int j,int color); void righttank(int i,int j,int color);
/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h"
#define a_UP 0x4800/*定义A坦克按键*/ #define a_DOWN 0x5000 #define a_LEFT 0x4b00 #define a_RIGHT 0x4d00 #define a_shoot 0x1c0d
void judge_moveshootway(int map[15][15],int i);/*炮弹运动时判断炮弹方 向函数*/ void judge_shoot(int m,int map[15][15],int i);/*判断炮弹打中的物体函数 */ void judge_shootway(int map[15][15],int i);/*炮弹打中物体时判断方向函 数*/

c语言坦克大战源代码

c语言坦克大战源代码

c语言坦克大战源代码/*游戏的整体思路大概是这样的?首先是欢迎界面,然后进入游戏界面,最后是gameover的界面。

本来打算做单人游戏,后来发现让敌人自主移动比较困难,所以改成了双人游戏?layer1控制按键是up,down,left,right,enter,player2控制按键是a,s,d,w,space。

*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<graphics.h>/*定义鼠标键值常量*/#define ESC 0x011b/*玩家1坦克按键*/#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ENTER 0x1c0d#define up 0x1177/*玩家2坦克按键*/#define down 0x1f73#define left 0x1e61#define right 0x2064#define fire 0x246a/*定义游戏常量*//*双人游戏*/#define NUM 2/*坦克宽度*/#define WIDTH 20/*坦克的数量,宽度*//*定义global变量*******************************************//*子弹的属性*/struct myboom{/*如果子弹life为0则代表子弹没有发射*/int life;int x,y;int direction;};/*子弹们的初始属性*/struct myboom iboom[NUM]={{0},{0}};/*坦克的属性*/struct mytank{int life;int x,y;int direction;};/*坦克们的初始属性*/struct mytank itank[NUM]={{3,10*WIDTH,22*WIDTH},{1,440,40}};pre[NUM][2]={{10*WIDTH,22*WIDTH},{440,40}};/*xy[0]代表自己的坦克; xy[1]及以后代表敌军; 坦克坐标*//*存被子弹覆盖的图像*/void *boom_save[NUM];/*malloc开辟图像空间的大小*/int size;/*动画显示*/void *save[NUM];/*后来加上的。

C大作业坦克大战

C大作业坦克大战

#include<iostream> #include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h> usingnamespacestd;HANDLEMutex=CreateMutex(NULL,FALSE,NULL);/互/ 斥对象intGameOver=0;intlevel=0;intmap[23][23];// 坦克种类,Normal 为玩家坦克#defineNormal0#defineRed1#defineBlue2#defineGreen3// 方向的宏定义#defineUp0#defineDown1#defineLeft2#defineRight3// 地图标记的宏定义#defineEmpty0#definePlayer1#definePlayerBullet2#defineEnemyBullet3#defineEnemy4intKill;intKillRed;intKillGreen;intEnemyExist;voidSetPos(inti,intj)// 设定光标位置{COORDpos={i,j};HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos);}voidHideCurSor(void)// 隐藏光标{CONSOLE_CURSOR_INFOinfo={1,0};HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(Out,&info);}intsharp[4][12]={0,1,1,0,1,1,1,2,2,0,2,2},{0,0,0,2,1,0,1,1,1,2,2,1},{0,1,0,2,1,0,1,1,2,1,2,2},{0,0,0,1,1,1,1,2,2,0,2,1},};// 此数组用来保存坦克各个方向的形状信息DWORDWINAPIBulletfly(LPVOIDlpParameter);// 子弹函数申明voidUpdata();// 更新界面信息函数申明classTank// 坦克类{private:intDirection;// 方向inthotpoint[2];// 活动点intSpeed;// 速度intFirePower;// 火力public:Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)// 构造函数{Direction=dir;hotpoint[0]=hot1;hotpoint[1]=hot2; }Type=typ;Speed=spe;FirePower=firepow;}intType;// 坦克的种类(详见宏定义) intID;// 坦克在MAP中的标记(详见宏定义) intFireEnable;// 是否可以开火intLife;// 生命值voidRunning();// 运行函数intJudge(intx,inty,intID);// 判断是否可以绘制坦克voidDrawTank();// 重绘坦克voidRedraw();// 擦除坦克intGetSpeed()// 获取速度{returnSpeed;}intGetFire()// 获取火力{returnFirePower;}intGetDirection()// 获取方向{returnDirection;}intGetHotX()// 获取活动点坐标{returnhotpoint[0];}intGetHotY(){returnhotpoint[1];}voidIncreaseFire()// 火力+{FirePower++;}voidIncreaseSpeed()// 速度+{Speed++;}voidChangeDirection(intnewD)//改变方向{Direction=newD;}voidChangePos(intx,inty)// 改变活动点{hotpoint[0]=x;hotpoint[1]=y;}};Tankplayer(Right,0,0,Normal,1,1);// 玩家Tankenemy(Left,20,0,Red,1,1);// 敌人voidTank::DrawTank()// 绘制坦克{inti;intnx,ny;if(Type==Red)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);elseif(Type==Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE);elseif(Type==Green)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);elseif(Type==Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREG R OUND_BLUE);for(i=0;i<6;i++){nx=hotpoint[0]+sharp[Direction][i*2]; ny=hotpoint[1]+sharp[Direction][i*2+1];SetPos((ny+1)*2,nx+1);// 利用sharp 数组相对于点x,y 绘制形状map[nx][ny]=ID;cout<<" ■ ";}}voidTank::Redraw()// 擦除坦克,原理同上{inti;intnx,ny;}for(i=0;i<6;i++){ nx=hotpoint[0]+sharp[Direction][i*2]; ny=hotpoint[1]+sharp[Direction][i*2+1];map[nx][ny]=Empty;SetPos((ny+1)*2,nx+1); cout<<"";}}intTank::Judge(intx,inty,intdir)// 判断当前是否可以绘制坦克{inti;intnx,ny;for(i=0;i<6;i++){ nx=x+sharp[dir][i*2]; ny=y+sharp[dir][i*2+1];if(nx<0||nx>=23||ny<0||ny>=23||map[nx][ny]!=Empty)// 不能绘制,返回 1 return1;return0;}voidTank::Running()// 坦克运行函数{intnewD;// 坦克的运行while(1){if(Life==0){EnemyExist=0;// 敌人不存在return;} if(GameOver==1)return;if(FireEnable==1&&GameOver==0)// 如果可以开火{WaitForSingleObject(Mutex,INFINITE);// 线程拥有互斥对象FireEnable=0;// 设为不可开火HANDLEbullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);/ / 创建子弹线程}}}CloseHandle(bullet); ReleaseMutex(Mutex);// 释放互斥对象Sleep(100);}WaitForSingleObject(Mutex,INFINITE);// 线程拥有互斥对象srand((int)time(0));newD=rand()%4;if(newD==Up)// 随机出新的方向并重新绘制坦克{Redraw();if(Judge(hotpoint[0]-1,hotpoint[1],newD)==0){hotpoint[0]--;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0) Direction=newD;elseif(newD==Down){Redraw();if(Judge(hotpoint[0]+1,hotpoint[1],newD)==0) {hotpoint[0]++; Direction=newD;}else{ if(Judge(hotpoint[0],hotpoint[1],newD)==0)Direction=newD;}}elseif(newD==Left){Redraw();if(Judge(hotpoint[0],hotpoint[1]-1,newD)==0) {hotpoint[1]--; Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0) Direction=newD; }}elseif(newD==Right){Redraw();if(Judge(hotpoint[0],hotpoint[1]+1,newD)==0){hotpoint[1]++;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0) Direction=newD; }}if(GameOver==0&&Life!=0)DrawTank();ReleaseMutex(Mutex);// 释放互斥对象 Sleep(500-80*Speed);}}/*********************DWORDWINAPIBulletfly(LPVOIDlpParameter){int*ID=(int*)lpParameter;//ID 用来获取发射子弹坦克的 intPos[2];// 子弹活动点 intdirection; intSpeed; inttype;inthit=0;// 击中标记intoldx,oldy;// 旧活动点 intflag=0;// 子弹是否有移动的标记 if(*ID==Player)// 如果是玩家坦克 {type=PlayerBullet; direction=player.GetDirection(); Speed=player.GetFire(); Pos[0]=player.GetHotX(); Pos[1]=player.GetHotY();子弹线程函数IDelseif(*ID==Enemy)// 如果是敌人坦克{type=EnemyBullet;direction=enemy.GetDirection();Speed=enemy.GetFire();Pos[0]=enemy.GetHotX();Pos[1]=enemy.GetHotY();}if(direction==Up)// 根据坦克的位置和方向确定子弹的初始坐标{Pos[0]--;Pos[1]++;}elseif(direction==Down){Pos[0]+=3;Pos[1]++;}elseif(direction==Left)Pos[0]++;Pos[1]--;}elseif(direction==Right){{Pos[0]++;Pos[1]+=3;}// 子弹的运行while(1){WaitForSingleObject(Mutex,INFINITE);//这个不再注释了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

int
strcmp(const char
*s1,const char * s2);
比较字符串 s1 和 s2。 当 s1<s2 时,返回值<0 当 s1=s2 时,返回值=0 当 s1>s2 时,返回值>0
strcmp(szName, “feichong_0”) == 0 说 明 szName 与 feichong_0 相 等
struct Weapon{
char
szName[128];
//
// 精灵坐标
float
fSpeedX, fSpeedY; // X 和 Y 方向上速度
float
fFireTime;
// 敌方坦克距下一次开炮的剩余时间
int iHp;
// 生命值
int iDir;
功能与返回值 获取屏幕左边界值 获取屏幕右边界值 获取屏幕上边界值 获取屏幕下边界值 获取精灵中心点的 X 坐标值
获取精灵中心点的 Y 坐标值
设置精灵中心点的 X 坐标值
设置精灵中心点的 Y 坐标值
设置精灵中心点的 X 和 Y 坐标值,用来将精 灵放置在某个指定位 置。
设置精灵 X 轴方向速 度
设置精灵 Y 轴方向速 度
属性。不仅复制图片,还复制
0 – 复制失败。地图 属性。
中没有找到对应名称 szSrcName – 作 为 模 板 的 精
的精灵用于复制。 灵
szTarName – 新的精灵名称
设置精灵的世界边界, fLeft - 左边界值
精灵碰到边界时,会激 fTop - 上边界值
发精灵与边界的碰撞 fRight - 右边界值
char szName[128];
int i=0;
sprintf(szName,

feichong_%d”, i);
将 字 符 串 ” feichong_0 ” 写 入
到 szName 中
Math.h
函数原型 double atan2( double y, double x );
功能与返回值 计算 y/x 的反正切值。 返回值:以弧度表示并介于 -pi 到 pi 之 间 ( 不 包 括 -pi )。如 需 使 用 角 度 ,需 要 转换。
void
dSetSpriteVisible(const
char*
szName,
bool
bVisible);
void dShowCursor(const bool
bShow);
void dDeleteSprite(const
char* szName);
bool
dIsPointInSprite(const
词来表示这种数字的含义。
enum Direction{
UP
= 0,
// 上方
RIGHT = 1,
// 右方
DOWN = 2,
// 下方
LEFT };
=3
// 左方
enum Role
{
MYTANK
= 0,
// 我方坦克
ENEMYTANK = 1,
// 敌方坦克
MYBULLET = 2,
// 我方子弹
参数说明与应用举例
找出 str2 字符串在 str1 字 strstr(szName,
符 串 中 第 一 次 出 现 的 位 置 “feichong”) != NULL
(不包括 str2 的串结束符)。 说明 szName 中包含 feichong
返回值:返回该位置的指针,
如找不到,返回空指针。
extern
ENEMYBULLET = 3
// 敌方子弹
};
除此之外,我们还需要定义一些全局变量来控制程序,根据程序需求,我们目前能考虑
到表示游戏状态的变量、表示游戏得分的变量、游戏剩余时间变量以及距离下一辆坦克产生
的时间等变量;
// 游戏地图,0 表示此处为空,1 表示此处有墙。根据游戏空间大小、墙以及坦克大小,
FunCode API
函数原型 float dGetScreenLeft(); float dGetScreenRight(); float dGetScreenTop(); float dGetScreenBottom(); float dGetSpritePositionX(const char* szName);
五、程序初步设计
如果程序规模比较小的时候,我们习惯一上手就写代码,边写边调整。但是当程序越来
越大,代码越来越多的时候,如果我们还用这种方式编程,程序写到一半的时候,你可能会
恨不得重写一遍。
此,我们在写代码之前,先把程序功能细化一下,并初步设计好程序结构,包括数据结
构和自定义函数。有了比较清晰的思路以后,再开始开发程序。
四、实验准备
本实验中可能用到的 C 语言标准库函数和 FunCode API
Stdio.h
函数原型 int sprintf( char *buffer, const char *format, [ argument] … ) ;
功能与返回值 把格式化的数组写入某个字 符串。 返回值:字符串长度
参数说明与应用举例
float dGetSpriteRotation(const char* szName);
获取精灵的旋转角度
原图的角度
float dSetSpriteRotation(const char* szName, float fRot); void dSetTextValue(const char* szName, int iVal);
参数说明与应用举例 float ftan = atan2( (y1-y0), (x1-x0) ); 计算通过点(x1,y1)到点(x0,y0) 的连成的直线与 X 轴之间的夹 角。
String.h
函数原型 extern *strstr(char char *str2);
char *str1,
功能与返回值
C 语言课程设计--坦克大战
一、游戏介绍
玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时 间到,一局游戏结束。
二、实验目的
综合应用 C 语言知识和设计知识开发一款小游戏。
三、实验内容
初始界面如下图。 按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左 侧。 游戏时间到,比如 30 秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游 戏结束,游戏回到初始界面,并显示上一局的分数。 游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。 墙为正方形,边长为 4,坦克也是正方形,比墙略小一点。 玩家用 WASD 键控制坦克上、下、左、右运行,按 J 键开炮。玩家坦克碰到墙就停下来, 需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。玩 家没摧毁一辆敌方坦克,加 1 分。 玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。 每隔几秒钟,比如 3 秒,就会产生一辆敌方坦克。敌方坦克每隔一段时间,比如 1 秒, 就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继 续前进。每隔几秒钟,比如 2 秒,敌方坦克就会顺时针变换一个方向前进。
const
EWorldLimit Limit, const
float fLeft, const float
fTop, const float fRight,
const float fBottom)
void
dSpriteMoveTo(const
char *szName, const float
fPosX, const float fPosY,
void dSetSpriteLinearVelocityX( const char* szName, const float fVelX); void dSetSpriteLinearVelocityY( const char* szName, const float fVelY); void dSetSpriteLinearVelocity(c onst char* szName, const float fVelX, const float fVelY);
float dGetSpritePositionY(const char* szName); float dSetSpritePositionX(const char* szName); float dSetSpritePositionY(const char* szName); void dSetSpritePosition(const char* szName, const float fPosX, const float fPosY);
设置图片的旋转角度
调整后的角度 获得的旋转角度即为两张图片的 角度差 fRot>0,图片顺时针旋转; fRot<0,图片逆时针旋转。
设置文字精灵的整数 数值
设置精灵可见或不可 见
dSetTextValue( “ score ” , 100); 名称为 score 的文字精灵显示 100 bVisible 为 true,可见; 为 false,不可见。
在本项目中,我们要操作的对象有 6 个:玩家坦克、敌方坦克、玩家子弹、敌方子弹、
墙、玩家指挥部。
其中,墙和指挥部都比较简单,主要是前 4 种,而且它们有共通性:名称、速度、位置,
因此,可以考虑用一个结构体来表示。此外,我们需要用一种数据结构来管理它们。由于敌
方坦克、子弹的数量都无法事先确定,所以我们选择链表而不是数组来管理它们。
// 我们把地图分成 11 行,13 列,每格大小刚好放一块墙。
相关文档
最新文档