源程序1
- 格式:doc
- 大小:37.50 KB
- 文档页数:4
C语言程序设计<一>1、程序运行从main()函数开始,也从main()函数结束。
2、函数是C程序的基本单位,由函数头和函数体组成。
3、C语言源程序是由函数组成,它们的数目可以有多个。
4、在C语言源程序中,是必须有一个函数名为main的函数。
main()后的小括号()没有任何内容,它不可以省略。
5、C程序中的语句用分号结束,在一个程序行上可以有多个语句,一个C 语句能写在多个程序行上。
6、函数体是由一对大括号围起来语句序列组成。
小括号是函数的标志。
二、C语言的组成元素1、命令、函数和变量等是组成程序的基本对象,每一个程序对象都需要一个名字来标识,程序对象的名称就是标识符。
2、在C语言中,标识符分为用户标识符和系统标识符。
3、用户标识符是指在程序中由程序员为变量、函数、数组等程序对象自行命名的标识符。
4、系统标识符是指C语言编译系统内部预定义的用于表示命令数据内型的标识符,又称保留字符。
5、基本字符集英文字母:a~z和A~Z。
阿拉伯数字:0~9。
其他字符:()、[ ]、+、-、*、/、%、<、>、<=、>=、==、!=、!、&&、‖、++、--、+=、-=、*=、/=、%=。
它们是由1~2个字符组成。
用作C语言的运算符;还包括:空格、换行符,回车符,单双引号,大括号,逗号,分号,反斜线,它们在程序中起到分隔和定界作用。
6、标识符:是用于标识命令;变量、函数,数组,数据类型等程序对象名称的字符序列。
7、组成标识符的合法字符有:字母,数字,下划线,三种,数字不能作首字符。
三、执行C语言程序1、单击“开始”——“程序”——“附件”——“命令提示符”。
2、按功能键<10>激活菜单,执行“File”——“NEW”(ALT+回车)全屏。
3、<F2>为保存,输入程序文件名。
4、<Ctrl>+<F9>运行有输入:等待输入→回车通过无输入:返回到编辑未通过:回车→F6→修改F3(打开)<二>一、对数据进行分类二、正确书写C语言中常量1、表示形式:小数形式:只有一个小数点,两边至少一边有数字。
int jumpx;//方向int idirec;//动画int iAniBegin;int iparam1;int iAniStyle;};#endif// bitmaptool.cpp// Finishing #include "stdafx.h"#include "bitmaptool.h"#include "gamemap.h"extern GAMEMAP gamemap;extern FILEREPORT f1;MYBITMAP::MYBITMAP(){}MYBITMAP::~MYBITMAP(){DeleteObject(hBm);}void MYBITMAP::Init(HINSTANCE hInstance,int iResource,int row,int col){BITMAP bm;inum=row;jnum=col;hBm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResour ce));GetObject(hBm,sizeof(BITMAP),&bm);width=bm.bmWidth/inum;height=bm.bmHeight/jnum;}void MYBITMAP::SetDevice(HDC hdest,HDC hsrc,int wwin,int hwin){hdcdest=hdest;hdcsrc=hsrc;screenwidth=wwin;screenheight=hwin;}void MYBITMAP::Show(int x,int y){xpos=x;ypos=y;SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY); }void MYBITMAP::ShowCenter(int y){xpos=(screenwidth-width)/2;ypos=y;SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY); }void MYBITMAP::ShowLoop(int left,int top,int right,int bottom,int iframe){int i,j;SelectObject(hdcsrc,hBm);for(j=top;j<bottom;j+=height){for(i=left;i<right;i+=width){BitBlt(hdcdest,i,j,width,height,hdcsrc,iframe*width,0,SRCCO PY);}}}void MYBITMAP::ShowNoBack(int x,int y,int iFrame){xpos=x;ypos=y;SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width, height/2,SRCAND);BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width, 0,SRCPAINT);}void MYBITMAP::ShowNoBackLoop(int x,int y,int iFrame,int iNum){int i;xpos=x;ypos=y;SelectObject(hdcsrc,hBm);for(i=0;i<iNum;i++){BitBlt(hdcdest,xpos+i*width,ypos,width,height/2,hdcsrc,iFram e*width,height/2,SRCAND);BitBlt(hdcdest,xpos+i*width,ypos,width,height/2,hdcsrc,iFram e*width,0,SRCPAINT); }}void MYBITMAP::ShowAni(){/* if(!iStartAni)return;SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,framenow*wid th,height/2,SRCAND);BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,framenow*wid th,0,SRCPAINT);framenow++;//播放结束if(framenow>=inum)iStartAni=0;*/}void MYBITMAP::SetAni(int x,int y){xpos=x;ypos=y;/*framenow=0;iStartAni=1;*/}void MYBITMAP::SetPos(int istyle,int x,int y){switch(istyle){case BM_CENTER:xpos=(screenwidth-width)/2;ypos=y;break;case BM_USER:xpos=x;ypos=y;break;}}void MYBITMAP::Draw(DWORD dwRop){SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,dwRop);}void MYBITMAP::Stretch(int x,int y){SelectObject(hdcsrc,hBm);StretchBlt(hdcdest,xpos,ypos,width*x,height*y,hdcsrc,0,0,width,height,SRCCOPY);}void MYBITMAP::Stretch(int x,int y,int id){SelectObject(hdcsrc,hBm);StretchBlt(hdcdest,xpos,ypos,width*x,height*y,hdcsrc,0,id*height,width,height,SRCCOPY);}///////////////////////// bitmap object animation////////////////// MYBKSKY::MYBKSKY(){xseparate=0;}MYBKSKY::~MYBKSKY(){}void MYBKSKY::MoveTo(int x,int y){xpos=x;ypos=y;}void MYBKSKY::MoveRoll(int x){xseparate+=x;xseparate%=width;if(xseparate<0){xseparate=width;}}void MYBKSKY::DrawRoll(){SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width-xseparate,height,hdcsrc,xseparate,0,SRCCOPY);BitBlt(hdcdest,xpos+width-xseparate,ypos,xseparate,height,hdcsrc,0,0,SRCCOPY);}void MYBKSKY::DrawRollStretch(int x,int y){SelectObject(hdcsrc,hBm);StretchBlt(hdcdest,xpos,ypos,(width-xseparate)*x,height*y,hdcsrc,xseparate,0,width-xseparate,height,SRCCOPY);StretchBlt(hdcdest,xpos+(width-xseparate)*x,ypos, xseparate*x,height*y,hdcsrc,0,0,xseparate,height,SRCCOPY);}void MYBKSKY::DrawRollStretch(int x,int y, int id) {SelectObject(hdcsrc,hBm);StretchBlt(hdcdest,xpos,ypos,(width-xseparate)*x,height*y,hdcsrc,xseparate,id*height,width-xseparate,height,SRCCOPY);StretchBlt(hdcdest,xpos+(width-xseparate)*x,ypos, xseparate*x,height*y,hdcsrc,0,id*height,xseparate,height,SRCCOPY);}///////////////////////// bitmap role////////////////// MYROLE::MYROLE(){}MYROLE::~MYROLE(){}void MYROLE::MoveTo(int x,int y){xpos=x;ypos=y;}void MYROLE::MoveOffset(int x,int y){if(x==0 && y==0)return;if(!gamemap.RoleCanMove(x,y))return;xpos+=x;ypos+=y;if(xpos<minx)xpos=minx;if(xpos>maxx)xpos=maxx;}void MYROLE::MoveStepTo(int x,int y){if(xpos<x)xpos+=ROLE_STEP;if(ypos<y)ypos+=8;if(ypos>y)ypos=y;}// 去背显示void MYROLE::Draw(){if(iAniBegin){PlayAni();}else{SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,height/2,SRCAND);BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,0,SRCPAINT);}}void MYROLE::Draw(int x,int y,int frame){SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,width,height/2,hdcsrc,frame*width,height/2,SRCAND);BitBlt(hdcdest,x,y,width,height/2,hdcsrc,frame*width,0,SRCPAINT);}void MYROLE::InitRole(int xleft,int xright){iFrame=0;iState=0;maxx=xright;minx=xleft;jumpheight=0;movex=0;movey=0;jumpx=0;idirec=0;iAniBegin=0;}void MYROLE::SetLimit(int xleft,int xright){maxx=xright;minx=xleft;}void MYROLE::Move(){if(0 == movey){//水平移动MoveOffset(movex, 0);}else{//跳动MoveOffset(jumpx, 0);MoveOffset(0, movey);}//帧控制if(movex<0 && iFrame<3){iFrame=3;}if(movex>0 && iFrame>=3){iFrame=0;}if(movex!=0){if(0==idirec)iFrame=1-iFrame;elseiFrame=7-iFrame;}if(movey!=0){iFrame=idirec*3;}if(movey<0){//upjumpheight+=(-movey);//根据重力影响,加速度减慢if(movey<-1){movey++;}//到达顶点后向下落if(jumpheight >= JUMP_HEIGHT * 32){jumpheight = JUMP_HEIGHT * 32;movey=4;}}else if(movey>0){jumpheight -= movey;//根据重力影响,加速度增大movey++;}}void MYROLE::Jump(){//上升过程MoveOffset(0, -4);}void MYROLE::ChangeFrame(){}void MYROLE::SetState(int i){iState=i;}void MYROLE::SetAni(int istyle){ iAniStyle=istyle;iparam1=0;iAniBegin=1;}//是否正在播放动画int MYROLE::IsInAni(){ return iAniBegin;}void MYROLE::PlayAni(){switch(iAniStyle){case ROLE_ANI_DOWN:if(iparam1>31){break;}//人物下降动画SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos+iparam1,width,height/2-iparam1,hdcsrc,iFrame*width,height/2,SRCAND);BitBlt(hdcdest,xpos,ypos+iparam1,width,height/2-iparam1,hdcsrc,iFrame*width,0,SRCPAINT);iparam1++;break;case ROLE_ANI_UP:if(iparam1>31){break;}//人物上升动画SelectObject(hdcsrc,hBm);BitBlt(hdcdest,xpos,ypos+32-iparam1,width,iparam1,hdcsrc,iFrame*width,height/2,SRCAND);BitBlt(hdcdest,xpos,ypos+32-iparam1,width,iparam1,hdcsrc,iFrame*width,0,SRCPAINT);iparam1++;if(iparam1>31){iAniBegin=0; //动画结束}default:break;}}/////////////////////////////////// my animation ///////////////////// MYANIOBJ::MYANIOBJ(){memset(wlist, 0, sizeof(wlist));memset(hlist, 0, sizeof(hlist));memset(ylist, 0, sizeof(ylist));iframeplay=0;}MYANIOBJ::~MYANIOBJ(){}void MYANIOBJ::DrawItem(int x,int y,int id,int iframe){SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframe*wlist[id],ylist[id]+hlist[id],SRCAND);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframe*wlist[id],ylist[id],SRCPAINT);}void MYANIOBJ::DrawItemNoMask(int x,int y,int id,int iframe) {SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframe*wlist[id],ylist[id],SRCCOPY);}void MYANIOBJ::DrawItemNoMaskWidth(int x,int y,int id,int w,int iframe){SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,w,hlist[id],hdcsrc,iframe*wlist[id],ylist[id],SRCCOPY);}void MYANIOBJ::PlayItem(int x,int y,int id){SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframeplay*wlist[id],ylist[id]+hlist[id],SRCAND);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframeplay*wlist[id],ylist[id],SRCPAINT);iframeplay=(iframeplay+1)%2;}void MYANIOBJ::InitAniList(int *pw,int *ph,int inum,int ismask) {int i;memcpy(wlist, pw, inum*sizeof(int));memcpy(hlist, ph, inum*sizeof(int));ylist[0]=0;for(i=1;i<inum;i++){//如果是mask,两张图片的间隔高度要乘以2ylist[i]=ylist[i-1]+hlist[i-1]*(ismask+1);}}void MYANIOBJ::InitAniList(int style,int a, int b){int i;switch(style){case BM_SQUARE:// a : 数量, b: 边长for(i=0;i<a;i++){wlist[i]=b;hlist[i]=b;ylist[i]=i*b;}break;default:break;}}/////////////////////////////////// my animation magic///////////////////// MYANIMAGIC::MYANIMAGIC(){memset(wlist, 0, sizeof(wlist));memset(hlist, 0, sizeof(hlist));memset(ylist, 0, sizeof(ylist));}MYANIMAGIC::~MYANIMAGIC(){}void MYANIMAGIC::DrawItem(int x,int y,int id,int iframe) {SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframe*wlist[id],ylist[id]+hlist[id],SRCAND);BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdcsrc,iframe*wlist[id],ylist[id],SRCPAINT);/*//先在临时DC上画出效果总图BitBlt(hdctemp,0,0,wlist[id],hlist[id],hdcsrc,0,ylist[id],SRCCOPY);//用MASK图作裁剪BitBlt(hdctemp,0,0,wlist[id],hlist[id],hdcsrc,iframe*wlist[id],ylist[id],SRCPAINT);//最后画到屏幕上BitBlt(hdcdest,x,y,wlist[id],hlist[id],hdctemp,0,0,SRCPAINT);*/}//带MASKvoid MYANIMAGIC::InitAniList(int *pw,int *ph,int inum) {int i;memcpy(wlist, pw, inum*sizeof(int));memcpy(hlist, ph, inum*sizeof(int));ylist[0]=0;for(i=1;i<inum;i++){ylist[i]=ylist[i-1]+hlist[i-1]*2;}}void MYANIMAGIC::SetDevice(HDC hdest, HDC hsrc, HDC htemp){hdcdest=hdest;hdcsrc=hsrc;hdctemp=htemp;}//filereport.h#ifndef __FILEREPORT#define __FILEREPORTclass FILEREPORT{public:FILEREPORT();FILEREPORT(char *p);~FILEREPORT();void put(char *p);void put(char *p,int a,int b);void putnum(int i,char *p);//////////void CheckDC(HDC h,char *p);//showvoid SetDevice(HDC h,int x,int y);void Output(char *p,int a,int b);void Show();private:FILE *fp;//计数器组int num[5];//showHDC hshow;int xpos;int ypos;char info[50];};#endif//filereport.cpp#include "stdafx.h"#include "filereport.h"#include "stdio.h"#include "stdlib.h"FILEREPORT::FILEREPORT(){fp=fopen("trace.txt","w");memset(num,0,sizeof(num));}FILEREPORT::FILEREPORT(char *p){fp=fopen(p,"w");memset(num,0,sizeof(num)); }FILEREPORT::~FILEREPORT(){fclose(fp);}void FILEREPORT::put(char *p){fwrite(p,sizeof(char),strlen(p),fp);fwrite("\n",1,1,fp);}//带计数器的跟踪void FILEREPORT::putnum(int i,char *p){char temp[50];sprintf(temp,"(%d) ",num[i]);fwrite(temp,sizeof(char),strlen(temp),fp);num[i]++;fwrite(p,sizeof(char),strlen(p),fp);fwrite("\n",1,1,fp);}void FILEREPORT::put(char *p,int a,int b){char temp[50];sprintf(temp,"%s : %d , %d",p,a,b);fwrite(temp,sizeof(char),strlen(temp),fp);fwrite("\n",1,1,fp);}void FILEREPORT::CheckDC(HDC h,char *p) {if(h==NULL){fwrite(p,sizeof(char),strlen(p),fp);fwrite("\n",1,1,fp);}}void FILEREPORT::SetDevice(HDC h,int x,int y) {hshow=h;xpos=x;ypos=y;}void FILEREPORT::Output(char *p,int a,int b) {sprintf(info,"%s:%d,%d",p,a,b);}void FILEREPORT::Show(){TextOut(hshow,xpos,ypos,info,strlen(info)); }//gamemap.h#ifndef __GAMEMAP#define __GAMEMAP#include "bitmaptool.h"struct MapObject{int x;int y;int w;int h;int id;int iframe;int iframemax;//最大帧数int show; //是否显示};struct ROLE{int x;int y;int w;int h;int id;int iframe;int iframemax;//最大帧数//移动局部int xleft;//左界限int xright;//右界限int movex;//人物属性int health;int show; //是否显示};struct MAPINFO{int iNextMap;int iSubMap;int xReturnPoint;int yReturnPoint;int iBackBmp;int viewmax;};class GAMEMAP{public:int LoadMap();void Init();void InitMatch();//入参,物体索引图void Show(MYANIOBJ & bmobj);//入参,背景物体索引图void ShowBkObj(MYANIOBJ & bmobj);//入参,动画物体索引图void ShowAniObj(MYANIOBJ & bmobj);void ShowInfo(HDC h);void ShowOther(HDC h);//键盘处理int KeyProc(int iKey);void KeyUpProc(int iKey);void MoveView();//设置视图起始坐标void SetView(int x);void SetViewState(int i);void SetGameState(int i);//hittestint RoleCanMove(int xoff, int yoff);int CheckRole(); int CheckAni(int itimeclip);void ClearEnemy(int i);void ClearCoin(int i);//动画帧控制void ChangeFrame(int itimeclip);//入参,时间片//逻辑检测int IsWin();void Fail();void Fail_Wait();//地图切换void ChangeMap();//错误检查void CodeErr(int i);//菜单控制void ShowMenu(MYANIOBJ & bmobj);GAMEMAP();~GAMEMAP();//dataint iMatch;int iLife;int iGameState;struct MapObject MapArray[MAX_MAP_OBJECT];int iMapObjNum;struct MapObject MapBkArray[MAX_MAP_OBJECT]; int iMapBkObjNum;struct ROLE MapEnemyArray[MAX_MAP_OBJECT]; int iMapEnemyCursor;struct MapObject MapCoinArray[MAX_MAP_OBJECT]; int iCoinNum;//MAP DA TAint iNextMap;// role dataint iMoney;int iAttack; //攻击方式//viewint viewx;int viewy;int iViewState;//地图数据struct MAPINFO mapinfo;//frame controlint ienemyframe;int ibkobjframe;//FIREstruct ROLE FireArray[MAX_MAP_OBJECT];int iFireNum;int iTimeFire;//两个子弹的时间间隔int iBeginFire;//bombstruct MapObject BombArray[MAX_MAP_OBJECT]; int iBombNum;//攻击对象提示char AttackName[20];int iAttackLife;int iAttackMaxLife;//菜单局部int iMenu;//屏幕缩放int iScreenScale;};#endif//gamemap.cpp// Finishing #include "stdafx.h"#include "gamemap.h"#include "myclock.h"#include "tool01.h"#include "texttool.h"extern int wwin,hwin;extern HWND hWndMain;//根本图像extern MYANIOBJ bmMap;//天空背景extern MYBKSKY bmSky;//角色extern MYROLE rmain;//计时器extern MYCLOCK c1;extern MYANIMAGIC bmMagic;extern struct MAPINFO allmapinfo[];extern struct ROLE gl_enemy_normal;//extern FILEREPORT f1;GAMEMAP::GAMEMAP(){iScreenScale=0;Init();}GAMEMAP::~GAMEMAP(){}int GAMEMAP::LoadMap(){FILE *fp;char temp[50]={0};int find=0;int i;memset(MapArray,0,sizeof(MapArray));iMapObjNum=0;memset(MapBkArray,0,sizeof(MapBkArray));iMapBkObjNum=0;memset(MapEnemyArray,0,sizeof(MapEnemyArray));memset(MapCoinArray,0,sizeof(MapCoinArray));iCoinNum=0; fp=fopen(PA TH_MAP,"r");if(!fp){return 0;}while(!find && !feof(fp)){FGetLine(temp,fp);if(temp[0]=='*' && temp[1]=='0'+iMatch){find=1;}}if(!find){return 0;}//找到了某一关的地图数据i=0;FGetLineJumpCom(temp,fp);while(temp[0]!='#' && !feof(fp)){//map datasscanf(temp,"%d %d %d %d %d",&MapArray[i].x,&MapArray[i].y,&MapArray[i].w,&MapArray[i].h,&MapArray[i].id);MapArray[i].show=0;iMapObjNum++;i++;FGetLineJumpCom(temp,fp);}i=0;FGetLineJumpCom(temp,fp);while(temp[0]!='#' && !feof(fp)){sscanf(temp,"%d %d %d %d %d",&MapBkArray[i].x,&MapBkArray[i].y,&MapBkArray[i].w,&MapBkArray[i].h,&MapBkArray[i].id);MapBkArray[i].show=0;MapBkArray[i].iframe=0;iMapBkObjNum++;i++;FGetLineJumpCom(temp,fp);}i=0;FGetLineJumpCom(temp,fp);while(temp[0]!='#' && !feof(fp)){sscanf(temp,"%d %d %d %d %d %d %d", &MapEnemyArray[i].x,&MapEnemyArray[i].y,&MapEnemyArray[i].w,&MapEnemyArray[i].h,&MapEnemyArray[i].id,&MapEnemyArray[i].xleft,&MapEnemyArray[i].xright);//动画元件,使用绝对坐标MapEnemyArray[i].x*=32;MapEnemyArray[i].y*=32;MapEnemyArray[i].w*=32;MapEnemyArray[i].h*=32;MapEnemyArray[i].xleft*=32;MapEnemyArray[i].xright*=32;MapEnemyArray[i].show=1;MapEnemyArray[i].movex=-ENEMY_STEP_X;MapEnemyArray[i].iframe=0;MapEnemyArray[i].iframemax=2;//设置生命值switch(MapEnemyArray[i].id){case ID_ANI_BOSS_HOUSE:MapEnemyArray[i].health=BOSS_HEALTH;break;case ID_ANI_BOSS_HOUSE_A:MapEnemyArray[i].health=BOSS_A_HEALTH;break;default:MapEnemyArray[i].health=1;break;}//将BOSS存储在数组的后半段if ( i<BOSS_CURSOR&& ( MapEnemyArray[i].id == ID_ANI_BOSS_HOUSE|| MapEnemyArray[i].id == ID_ANI_BOSS_HOUSE_A) ){//move data to BOSS_CURSORMapEnemyArray[BOSS_CURSOR]=MapEnemyArray[i];memset(&MapEnemyArray[i],0,sizeof(MapEnemyArray[i]));i=BOSS_CURSOR;}i++;FGetLineJumpCom(temp,fp);}i=0;FGetLineJumpCom(temp,fp);while(temp[0]!='#' && !feof(fp)){sscanf(temp,"%d %d %d %d %d",&MapCoinArray[i].x,&MapCoinArray[i].y,&MapCoinArray[i].w,&MapCoinArray[i].h,&MapCoinArray[i].id);MapCoinArray[i].show=1;MapCoinArray[i].iframe=0;//索引坐标转化为绝对坐标MapCoinArray[i].x*=32;MapCoinArray[i].y*=32;//设置这个动画元件的最大帧switch(MapCoinArray[i].id){case ID_ANI_COIN:MapCoinArray[i].iframemax=4;break;default:MapCoinArray[i].iframemax=2;break;}i++;iCoinNum++;FGetLineJumpCom(temp,fp);}fclose(fp);return 1;}void GAMEMAP::Init(){iGameState=GAME_PRE;iMatch=0;iLife=3;iMoney=0;//攻击种类iAttack=ATTACK_NORMAL;iMenu=0;viewx=0;InitMatch();}void GAMEMAP::InitMatch(){memset(MapArray,0,sizeof(MapArray));memset(MapBkArray,0,sizeof(MapBkArray));memset(MapEnemyArray,0,sizeof(MapEnemyArray));memset(MapCoinArray,0,sizeof(MapCoinArray));memset(FireArray,0,sizeof(FireArray));memset(BombArray,0,sizeof(BombArray));iMapObjNum=0;iMapBkObjNum=0;iBombNum=0;iCoinNum=0;//设置视图坐标viewy=0;ienemyframe=0;iFireNum=0;iTimeFire=0;iBeginFire=0;ibkobjframe=0;//获取地图信息mapinfo=allmapinfo[iMatch];//初始化攻击对象提示memset(AttackName,0,sizeof(AttackName));iAttackLife=0;iAttackMaxLife=0;iMapEnemyCursor=0;}//显示地图void GAMEMAP::Show(MYANIOBJ & bmobj){int i;int xstart,ystart;int j,k;for(i=0;i<iMapObjNum;i++){ystart=MapArray[i].y*32;switch(MapArray[i].id){//进出的下水道case ID_MAP_PUMP_IN:case ID_MAP_PUMP_OUT:xstart=MapArray[i].x*32;bmobj.DrawItemNoMask(xstart, ystart, MapArray[i].id, 0);break;default:for(j=0;j<MapArray[i].h;j++){xstart=MapArray[i].x*32;for(k=0;k<MapArray[i].w;k++){bmobj.DrawItemNoMask(xstart, ystart, MapArray[i].id, 0);xstart+=32;}ystart+=32;} // end of forbreak;}//end of switch}}void GAMEMAP::ChangeMap(){viewx=0;//iMatch=mapinfo.iSubMap;InitMatch();rmain.SetPos(BM_USER,mapinfo.xReturnPoint*32,mapinfo.y ReturnPoint*32);rmain.InitRole(0,GAMEW*32*MAX_PAGE-32);//设定视图位置if(rmain.xpos - viewx > 150){SetView(mapinfo.xReturnPoint*32-32);//往左让一格if(viewx>(mapinfo.viewmax-1)*GAMEW*32)viewx=(mapinfo.viewmax-1)*GAMEW*32;}//设定人物活动范围rmain.SetLimit(viewx, GAMEW*32*MAX_PAGE);//设定背景图片坐标bmSky.SetPos(BM_USER,viewx,0);LoadMap();}int GAMEMAP::KeyProc(int iKey){int i;switch(iGameState){case GAME_PRE:switch(iKey){case 0xd://enterswitch(iMenu){case 0:c1.ReStart(TIME_GAME_IN_PRE); //停顿两秒iGameState=GAME_IN_PRE;break;case 1:SetGameState(GAME_HELP);break;}break;case VK_UP:iMenu=(iMenu+1)%2;break;case VK_DOWN:iMenu=(iMenu+1)%2;break;}return 1;//重绘case GAME_HELP:switch(iKey){case 0xd: //enterSetGameState(GAME_PRE);break;}return 1;case GAME_IN://如果人物正在播放动画,拒绝键盘响应if(rmain.IsInAni()){break;}switch(iKey){case VK_RIGHT:if(rmain.movey!=0){rmain.jumpx=4;}rmain.movex=4;rmain.idirec=0;break;case VK_LEFT:if(rmain.movey!=0){rmain.jumpx=-4;}rmain.movex=-4;rmain.idirec=1;//朝左break;case VK_DOWN:for(i=0;i<iMapObjNum;i++){//下方线if( LINE_IN_LINE(rmain.xpos,rmain.ypos+32,32,MapArray[i].x*32,MapArray[i].y*32,MapArray[i].w*32)){if(MapArray[i].id == ID_MAP_PUMP_IN){//进入地图rmain.SetAni(ROLE_ANI_DOWN);iGameState=GAME_PUMP_IN;c1.ReStart(TIME_GAME_PUMP_WAIT);}}}break;case KEY_X: //跳if(rmain.movey!=0)break;rmain.movey=-SPEED_JUMP;rmain.jumpx=rmain.movex;//解决x键和方向键的响应问题break;case KEY_Z: //FIREif(iBeginFire)break;iTimeFire=0;iBeginFire=1;break;case 0x7a://f11iAttack=(iAttack+1)%ATTACK_MAX_TYPE;break;//直接通关rmain.xpos = MAX_PAGE*GAMEW*32;break;}break;}return 0;}void GAMEMAP::SetViewState(int i){iViewState=i;}void GAMEMAP::SetGameState(int i){iGameState=i;}void GAMEMAP::SetView(int x){viewx=x;}//移动视图//视图不能往右移void GAMEMAP::MoveView(){//只有一屏宽,不移动视图if(mapinfo.viewmax == 1)return;if(rmain.xpos - viewx > 150){viewx+=ROLE_STEP;if(viewx>(mapinfo.viewmax-1)*GAMEW*32)viewx=(mapinfo.viewmax-1)*GAMEW*32;//设置人物移动的最大范围rmain.SetLimit(viewx, GAMEW*32*MAX_PAGE);}bmSky.SetPos(BM_USER,viewx,0);}void GAMEMAP::ShowBkObj(MYANIOBJ & bmobj){int i;int xstart,ystart;for(i=0;i<iMapBkObjNum;i++){ystart=MapBkArray[i].y*32;xstart=MapBkArray[i].x*32;bmobj.DrawItem(xstart,ystart,MapBkArray[i].id,ibkobjframe);}}void GAMEMAP::ShowInfo(HDC h){char temp[50]={0};SetTextColor(h, TC_WHITE);SetBkColor(h, TC_BLACK);sprintf(temp, "LIFE : %d",iLife);TextOut(h, 220,100,temp,strlen(temp));sprintf(temp, "WORLD : %d",iMatch+1);TextOut(h, 220,130,temp,strlen(temp));}void GAMEMAP::ShowOther(HDC h){char temp[50]={0};int xstart;//show moneysprintf(temp,"MONEY: %d",iMoney);TextOut(h,viewx+20,20,temp,strlen(temp));//显示攻击对象生命值if(iAttackLife){TextOut(h,viewx+ATTACK_TO_TEXT_X,ATTACK_TO_TEXT_Y,AttackName,strlen(AttackName));//画生命条xstart=viewx+ATTACK_TO_X-iAttackMaxLife*10;bmMap.DrawItemNoMaskWidth(xstart-1,ATTACK_TO_Y-1,ID_MAP_HEALTH_BK,iAttackMaxLife*BMP_WIDTH_HEALTH, 0);bmMap.DrawItemNoMaskWidth(xstart,ATTACK_TO_Y,ID_MAP_HEALTH,iAttackLife*BMP_WIDTH_HEALTH, 0);}}void GAMEMAP::ShowAniObj(MYANIOBJ & bmobj){int i;int xstart,ystart;//显示金币,和其他物品for(i=0;i<iCoinNum;i++){ystart=MapCoinArray[i].y;xstart=MapCoinArray[i].x;bmobj.DrawItem(xstart,ystart,MapCoinArray[i].id, MapCoinArray[i].iframe);}//显示敌人for(i=0;i<MAX_MAP_OBJECT;i++){if (MapEnemyArray[i].show){bmobj.DrawItem(MapEnemyArray[i].x,MapEnemyArray[i].y, MapEnemyArray[i].id,MapEnemyArray[i].iframe);}}//显示子弹,魔法攻击for(i=0;i<MAX_MAP_OBJECT;i++){if (FireArray[i].show){ystart=FireArray[i].y;xstart=FireArray[i].x;switch(FireArray[i].id){case ID_ANI_FIRE:bmobj.DrawItem(xstart,ystart,FireArray[i].id,FireArray[i].ifra me);break;case ID_ANI_FIRE_MAGIC:bmMagic.DrawItem(xstart,ystart, 0, FireArray[i].iframe);break;default:bmobj.DrawItem(xstart,ystart,FireArray[i].id,FireArray[i].ifra me);break;}}}//显示爆炸效果for(i=0;i<MAX_MAP_OBJECT;i++){if (BombArray[i].show){ystart=BombArray[i].y;xstart=BombArray[i].x;bmobj.DrawItem(xstart,ystart,BombArray[i].id, BombArray[i].iframe);}}} // 返回0,不能走;1,能走int GAMEMAP::RoleCanMove(int xoff, int yoff){int canmove=1;int i;for(i=0;i<iMapObjNum;i++){if( RECT_HIT_RECT(rmain.xpos+xoff,rmain.ypos+yoff,32,32,MapArray[i].x*32,MapArray[i].y*32,MapArray[i].w*32,MapArray[i].h*32)){canmove=0;if(yoff<0){//碰到了上面的物体要向下落rmain.movey=1;}if(yoff>0){//碰到了下面的物体,要停止下落rmain.jumpheight=0;rmain.movey=0;rmain.ypos=MapArray[i].y*32-32;//纵坐标要修正}break;}}return canmove;}//检查人物水平移动过程中,是否走出地图物体边界int GAMEMAP::CheckRole(){int i;//角色的检查if(rmain.movey == 0 ){//在水平移动,//检测角色是否站在某个物体上for(i=0;i<iMapObjNum;i++){//下方线if( LINE_ON_LINE(rmain.xpos,rmain.ypos+32,32,MapArray[i].x*32,MapArray[i].y*32,MapArray[i].w*32)){return 1;}}//角色开始下落rmain.movey=1;rmain.jumpx=0;//此时要去除跳跃速度,否那么将变成跳跃,而不是落体return 0;}return 0;}void GAMEMAP::ChangeFrame(int itimeclip){int i;///////////// 帧控制////////////////if(0 == itimeclip% ENEMY_SPEED){//敌人移动for(i=0;i<MAX_MAP_OBJECT;i++){if(MapEnemyArray[i].show){//帧控制MapEnemyArray[i].iframe=(MapEnemyArray[i].iframe+1)% MapEnemyArray[i].iframemax;switch(MapEnemyArray[i].id){case ID_ANI_ENEMY_NORMAL:case ID_ANI_ENEMY_SWORD: MapEnemyArray[i].x+=MapEnemyArray[i].movex;//控制敌人移动if(MapEnemyArray[i].movex<0){if(MapEnemyArray[i].x<=MapEnemyArray[i].xleft){MapEnemyArray[i].movex=ENEMY_STEP_X;}}else{if(MapEnemyArray[i].x>=MapEnemyArray[i].xright){MapEnemyArray[i].movex=-ENEMY_STEP_X;}}break;}}}}if(0 == itimeclip% WATER_SPEED){ibkobjframe=1-ibkobjframe;for(i=0;i<MAX_MAP_OBJECT;i++){if(MapCoinArray[i].show){MapCoinArray[i].iframe=(MapCoinArray[i].iframe+1)%MapC oinArray[i].iframemax;}}}//子弹,攻击控制for(i=0;i<MAX_MAP_OBJECT;i++){if(FireArray[i].show){switch(FireArray[i].id){case ID_ANI_FIRE_MAGIC:FireArray[i].iframe++;if(FireArray[i].iframe == 2){FireArray[i].x+=FIRE_MAGIC_W;}if(FireArray[i].iframe>3){FireArray[i].show=0;}break;default:FireArray[i].iframe=1-FireArray[i].iframe;break;}}}//bomb frame controlfor(i=0;i<MAX_MAP_OBJECT;i++){if(BombArray[i].show){BombArray[i].iframe++;if(BombArray[i].iframe>3){BombArray[i].show=0;}}}}int GAMEMAP::CheckAni(int itimeclip){int i,j;int tempx,tempy;//检测子弹和敌人的碰撞〔包括魔法攻击〕for(i=0;i<MAX_MAP_OBJECT;i++){if(MapEnemyArray[i].show){for(j=0;j<MAX_MAP_OBJECT;j++){if (FireArray[j].show){if(RECT_HIT_RECT(FireArray[j].x+FIRE_XOFF,FireArray[j].y,FireArray[j].w,FireArray[j].h,MapEnemyArray[i].x,MapEnemyArray[i].y,MapEnemyArray[i].w,MapEnemyArray[i].h)){ClearEnemy(i);//魔法攻击时,攻击效果的消除由帧控制。
c 语言源代码开头
以下是一个简单的 C 语言源代码开头示例,包含了必要的头文件和程序的基本结构:```c
#include <stdio.h>
int main() {
// 在此处添加程序逻辑
return 0;
}
```
在上面的示例中,`#include <stdio.h>` 是一个必要的头文件,它包含了标准输入输出函数的声明,如 `printf()` 和 `scanf()`。
`int main()` 是程序的入口函数,每个 C 语言程序都必须包含一个 `main` 函数。
函数体由一对花括号 `{}` 包围,里面是程序的逻辑部分。
你可以在花括号内添加你的程序逻辑,例如变量声明、函数调用、条件判断和循环等。
根据你的需求,编写相应的代码来实现你的程序功能。
最后,`return 0;` 语句表示程序正常结束,并返回 0 作为状态码。
这只是一个简单的 C 语言源代码开头示例,你可以根据自己的需求进行扩展和修改。
请注意,C 语言是一种语法严谨的编程语言,需要遵循严格的语法规则和编程规范。
在编写代码时,请仔细检查语法错误,并确保代码的可维护性和可读性。
源程序是什么源程序是计算机程序的初始版本,是一种用特定的计算机语言编写的文本文件。
它包含了程序员使用编程语言编写的一系列指令和逻辑,用于告诉计算机如何执行特定的任务。
在计算机科学领域,源程序是开发软件的基础。
在本文中,我们将讨论源程序的定义、类型、作用以及与其他相关概念的区别。
源程序的定义源程序是根据某种特定的编程语言编写的计算机程序,是程序员用来表达计算机指令和逻辑的一种形式。
它是人类可读的文本文件,通常使用扩展名来标识其所使用的语言,例如C语言使用.c扩展名,Java语言使用.java扩展名等。
源程序由程序员创建,其中包含一系列的代码语句,定义了程序的行为、功能和逻辑。
源程序的类型源程序可以根据使用的编程语言进行分类。
目前,有许多不同的编程语言可供选择,例如C、C++、Java、Python等。
每种编程语言都具有不同的语法和语义规则,但它们都提供了一种方法来编写源程序。
每种编程语言都有其独特的特点和用途,适用于不同的应用领域。
源程序的作用源程序是开发软件的基础,它描述了计算机程序的行为和功能。
通过编写源程序,程序员可以实现特定任务的逻辑,并将其翻译成机器可以理解和执行的形式。
源程序通过编译器或解释器进行翻译和执行,最终生成可执行文件或在解释器环境中运行。
源程序的编写过程是软件开发中的重要环节。
在编写源程序之前,程序员需要了解所使用的编程语言的基本语法、数据类型、算法和逻辑结构。
他们需要考虑程序的设计目标、用户需求和系统约束,并选择合适的算法和数据结构。
源程序的编写需要程序员具备良好的编程技巧和逻辑思维,以及对所开发的应用领域的深入理解。
源程序与机器语言的关系源程序通常是以人类可读的形式编写的,而机器语言是计算机可以直接理解和执行的形式。
为了将源程序转化为机器语言,程序员需要使用编译器或解释器。
编译器将源程序一次性地转换为机器语言,并生成可执行文件。
解释器则将源程序一行一行地解释执行,无需生成可执行文件。
目录前言 (2)用C语言编写源程序建立LR(1)分析器 (3)一,设计目的,要求,算法与设计思想 (3)1.设计内容 (3)2.设计要求 (3)3.设计的基本原理 (3)1.CLOSURE(I)的构造 (3)2.GO(I,X)的构造 (3)3.FIRST集合的构造 (4)4.LR(1)分析表的构造 (4)二,LR(1)分析器 (4)1.LR(1)分析器的实现图: (4)2.LR分析器与逻辑结构及工作过程 (5)三,总体方案设计 (5)1. 各模块设计 (6)四,程序测试 (8)1.教科书的第142页文法的LR1分析器的构造和语法分析 (8)2.表达式文法的LR1分析器的构造和语法分析器 (9)五,源程序 (10)六,总结 (19)七,参考文献 (19)前言《编译原理》是计算机专业的一门重要的专业课程,其中包含大量软件设计细想。
通过课程设计,实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平具有十分重要的意义。
我选的是老师给的题,并予以扩充。
即对任意给定的问法G构造LR(1)项目集规范族,其中要实现CLOSURE(1),GO(I,X),FIRST集合符。
在此基础上,构造了LR(1)分析表。
然后对输入的句子进行语法分析,给出接受或出错报告。
程序采用文件输入输出方式。
其中包括两个输入文件:文法grammar.txt,以及输入串input.txt;两个输出文件:项目集items.txt和文法的LR(1)分析表action_table.txt。
由于语法分析的结果只给出接受或错误报告,比较简单。
所以直接在屏幕上输出,也便于用户查看。
在具体编写程序中,对文法操作的各个功能模块独立成为一个子程序,而对具体输入穿得分析则放在main()函数中进行。
各个变量奇函数的意义和用法我将在论述程序设计的通体方案中向西给出。
程序的通体算法细想来自《编译原理》课程。
具体实现有我独立完成。
#include <iostream>
using namespace std;
struct node //定义结点类型
{int exp; //指数为正整数
double coef; //系数为双精度型
node *next; //指针域
};
class Poly
{private : //数据成员
node *head; //循环链表表头
public: //成员函数
Poly(); //构造函数,建立空多项式链表~Poly(){}; //析构函数,释放多项式链表void in1_Poly(); // 键盘输入多项式
void in2_Poly(int,int[],double[]); //由数组复制多项式链表
void de1_Poly(); //释放多项式链表
void prt_Poly(); //输出多项式链表
Poly operator+(Poly&); //多项式相加
Poly operator*(Poly&); //多项式相乘
};
Poly::Poly()
{node *p;
p=new node; //申请一个表头结点
p->exp=-1; //指针域值为-1
p->next=p; //指针域指向表头结点自身
head=p; //头指针也指向表头结点
return;
}
void Poly::in1_Poly()
{node*p,*k;
int e;
double c;
k=head; //记住多项式链尾
cout<<"输入:系数<空格>指数。
输入指数-1结束!"<<endl;
cin>>c>>e;
while(e>=0)
{p=new node; //申请一个新结点
p->exp=e;p->coef=c; //填入指数与系数
p->next=head; //新结点链到临时多项式链尾k->next=p;
k=p;
cin>>c>>e;
}
return;
void Poly::in2_Poly(int n,int e[],double c[])
{int k;
node *p;
for(k=n-1;k>=0;k--)
{p=new node; //申请一个新结点
p->coef=c[k];p->exp=e[k]; //置系数与指数域
p->next=head->next; //新结点链接到表头
head->next=p;
}
return;
}
void Poly::de1_Poly()
{node *p,*q;
q=head->next;
while(q!=head)
{p=q->next;delete q;q=p;}
q->next=head;
return;
}
void Poly::prt_Poly()
{node *k;
if(head->next==head)
cout<<"空表"<<endl;
k=head->next;
while(k!=head)
{cout<<"("<<k->coef<<","<<k->exp<<")"<<endl;
k=k->next;
}
return;
}
Poly Poly::operator +(Poly &p2)
{Poly p;
node *k,*q,*m,*n;
int e;
double c;
k=p.head; //记住多项式链尾
m=head->next;
n=p2.head->next;
while((m->exp!=-1)||(n->exp!=-1))
{if(m->exp==n->exp) //两个链表当前结点指数相同{c=m->coef+n->coef; //系数相加
e=m->exp; //复抄指数
m=m->next;n=n->next;
else if (m->exp>n->exp)
{c=m->coef;e=m->exp; //复抄链表1中的系数与指数值m=m->next;
}
else
{c=n->coef;e=n->exp; //复抄链表2中的系数与指数值n=n->next;
}
if(c!=0) //相加后系数不为0
{q=new node; //申请一个新结点
q->exp=e;q->coef=c;
q->next=p.head;k->next=q;
k=q; //记住多项式链尾
}
}
return(p);
}
Poly Poly::operator *(Poly &p2)
{Poly p,p1,p3; //p,p1与p3为临时多项式
node *q,*k,*m,*n;
m=head->next;
while(m->exp!=-1)
{p3=p;
k=p1.head; //记住临时多项式p1链尾
n=p2.head->next;
while(n->exp!=-1)
{q=new node; //申请一个新结点
q->exp=m->exp+n->exp; //置新结点指数值
q->coef=(m->coef)*(n->coef); //置新节点系数值
q->next=p1.head; //新结点链接到临时多项式p1链尾k->next=q;
n=n->next;
k=q;
}
p=p3+p1; //累加
p1.de1_Poly(); //释放临时多项式p1
p3.de1_Poly(); //释放临时多项式p3
m=m->next;
}
return(p);
}
//#include"Poly.h"
int main()
{Poly p1,p2,add_p,mul_p;
int pe1[6]={10,8,5,4,1,0};
double pc1[6]={3.0,4.0,-5.0,2.0,-3.0,10.0};
int pe2[6]={14,8,6,1,0};
double pc2[6]={4.0,3.0,-7.0,-2.0,5.0,-6.0};
p1.in2_Poly(6,pe1,pc1);
p2.in2_Poly(6,pe2,pc2);
p1.in1_Poly(); //键盘输入多项式p1的系数和指数p2.in1_Poly(); //键盘输入多项式p2的系数和指数cout<<"输出多项式p1:"<<endl;
p1.prt_Poly();
cout<<"输出多项式p2:"<<endl;
p2.prt_Poly();
add_p=p1+p2; //多项式p1与多项式p2相加cout<<" 输出多项式p=p1+p2:"<<endl;
add_p.prt_Poly();
mul_p=p1*p2; //多项p1与多项式p2相乘cout<<"输出多项式p=p1*p2:"<<endl;
mul_p.prt_Poly();
p1.de1_Poly(); //释放多项式p1
cout<<"输出多项式p1:"<<endl;
p1.prt_Poly();
p2.de1_Poly(); //释放多项式pi
cout<<" 输出多项式p2:"<<endl;
p2.prt_Poly();
return 0;
}。