c语言extract(20 4),C语言贪吃蛇游戏2

/***************************************

* 程序名称:贪吃蛇游戏                      *

* 编译环境:vs2008                          *

* 作者相关:往事随风<1034882113>*

* 修改时间:2013-04-13                      *

***************************************/#include#include#include#include#include#include#include//引用 Windows Multimedia API#pragmacomment(lib,"Winmm.lib")/***********宏定义区******************/#defineX    500//保存蛇节点坐标的个数#defineY 500intlen =640;intwide =480;MCI_PLAY_PARMS mciplay;//定义播放参数mciplay/***********结构定义区****************/structfood{intx;//横坐标inty;//纵坐标intflag;//食物状态 1: 有食物; 0:没有食物}food;structsnake{intx[X];//蛇身横坐标inty[Y];intlife;//生命状态intnode;//蛇的长度chardirection;//蛇的方向intscore;//分数intgrade;//难度intspeed;//速度}snake;/*************函数声明区**************/voidinitsnake();//初始化一条蛇voidprint_wall();//输出围墙voidout_food();//出现食物voidGameover();//结束游戏voidGamebegin();//开始游戏voiddead_case();//死亡情况(撞墙 撞自身)voideat_food();//吃掉食物voidinit_data();//初始化数据voidget_direction(charch);//得到方向voidprint_snake();//输出蛇voidprint_score();//输出分数voidset_grade();//设置等级voidRealseMusic(LPCTSTR strResName,char*DeviceStr);//播放资源文件中的音乐voidpass();//通关函数/****************************************************///提取指定模块中的资源文件//参数://strDstFile:        目标文件名。提取的资源将保存在这里;//strResType:        资源类型;//strResName:        资源名称;//返回值://true: 执行成功;//false: 执行失败。/****************************************************/boolExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName);//提取资源到临时文件/************函数定义区***************/voidpass(){if(snake.speed ==20){EndBatchDraw();IMAGE img;loadimage(&img,"IMAGE","PASS",len,wide,true);//s输出通关图片putimage(0,0,&img);_getch();exit(0);}}boolExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName){//创建文件HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY, NULL);if(hFile == INVALID_HANDLE_VALUE)returnfalse;//查找资源文件中、加载资源到内存、得到资源大小HRSRC    hRes    = ::FindResource(NULL, strResName, strResType);HGLOBAL    hMem    = ::LoadResource(NULL, hRes);DWORD    dwSize    = ::SizeofResource(NULL, hRes);//写入文件DWORD dwWrite =0;//返回写入字节::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);::CloseHandle(hFile);returntrue;}voidRealseMusic(LPCTSTR strResName,char*DeviceStr){//产生临时文件的文件名TCHAR tmpmp3[_MAX_PATH];::GetTempPath(_MAX_PATH, tmpmp3);_tcscat_s(tmpmp3,strResName);//VC 请用 _tcscat函数//将 MP3 资源提取为临时文件ExtractResource(tmpmp3,"MP3",strResName);//打开音乐TCHAR mcicmd[300];_stprintf_s(mcicmd,"open \"%s\" alias %s",tmpmp3,DeviceStr);mciSendString(mcicmd, NULL,0, NULL);//播放音乐//mciSendString("play mymusic", NULL, 0, NULL);}voidset_grade(){intgrade =0;if(snake.speed >30){grade = snake.score /100+1;if(snake.grade != grade){snake.grade = grade;//最高只有7级snake.speed -=30;}}}voidprint_score(){charscore[10] ="0";chargrade[3] ="0";intx =0, y1 =0,y2 =0;x =( len /3+ len %3) *2;y1 = wide /5;y2 = wide /3;set_grade();_itoa_s(snake.score,score,10);_itoa_s(snake.grade,grade,10);setbkmode(TRANSPARENT);//设置文字背景透明setcolor(RGB(255,255,0));//设置文字颜色outtextxy(x + len /10,y1,"分数:");outtextxy(x + len /6,y1,score);outtextxy(x + len /10,y2,"操作说明");outtextxy(x + len /10,y2 +20,"a:向左走");outtextxy(x + len /10,y2 +40,"d:向右走");outtextxy(x + len /10,y2 +60,"w:向上走");outtextxy(x + len /10,y2 +80,"s:向下走");outtextxy(x + len /10,y1 *4,"等级:");outtextxy(x + len /10+40,y1 *4,grade);outtextxy(x + len /10+50,y1 *4,"级");}voidprint_snake(){inti;setfillcolor(BLACK);//设置当前填充色为黑色/*输出蛇*/for(i =0; i < snake.node; i++)fillrectangle(snake.x[i],snake.y[i],snake.x[i] +10,snake.y[i] +10);for(i = snake.node; i >0; i--)//蛇体坐标除了蛇头都读取前一位坐标{snake.x[i] = snake.x[i -1];snake.y[i] = snake.y[i -1];}}voidget_direction(charch){/*排除反方向*/if(snake.direction !='a'&&  ch =='d')snake.direction ='d';elseif(snake.direction !='d'&&  ch =='a')snake.direction ='a';elseif(snake.direction !='w'&&  ch =='s')snake.direction ='s';elseif(snake.direction !='s'&&  ch =='w')snake.direction ='w';/*蛇移动过程中的方向*/switch(snake.direction){case'a': snake.x[0] -=10;break;case'd': snake.x[0] +=10;break;case'w': snake.y[0] -=10;break;case's': snake.y[0] +=10;break;}}voidinit_data(){/***初始化***/snake.score =0;snake.x[0] =20,snake.y[0] =30;snake.node =1;snake.life =1;//1表示活着food.flag =0;snake.grade =1;snake.speed =200;}voideat_food(){mciplay.dwFrom =0;/*吃掉食物*/if(snake.x[0] == food.x && snake.y[0] == food.y){//播放吃的音乐mciSendString("seek AteMusic to 0",0,0,0);mciSendString("play AteMusic",NULL,0,0);setfillcolor(RGB(219,49,0));fillrectangle(food.x,food.y,food.x +10,food.y +10);//擦掉食物snake.node++;//蛇长加1food.flag =0;//改变食物状态snake.score +=10;//改变分数}}voiddead_case(){inti =0;intx =0;x =( len /3+ len %3) *2;/*判断撞到自身*/for(i =2; i < snake.node; i++){if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0]){snake.life =0;break;}}/*判断是否撞墙*/if(snake.x[0] > x || snake.x[0] <10|| snake.y[0] <10|| snake.y[0] >470)snake.life =0;}voidGamebegin(){IMAGE image;MOUSEMSG msg;//初始化RealseMusic("BeginMusic.mp3","BeginMusic");RealseMusic("AteMusic.mp3","AteMusic");//播放开始的音乐mciSendString("play BeginMusic", NULL,0, NULL);loadimage(&image,"IMAGE","StartCover",len,wide,true);//s输出开始图片putimage(0,0,&image);//setbkmode(TRANSPARENT);//设置文字背景透明//setcolor(RGB(255,255,0));//设置文字颜色//outtextxy(len / 3 + 50,wide * 4 / 5,"按任意键继续");while(1)//等待鼠标点击{msg = GetMouseMsg();if(msg.uMsg ==WM_LBUTTONDOWN)break;}mciSendString("close BeginMusic",NULL,0,NULL);//关闭开始音乐setbkcolor(RGB(219,49,0));//设置屏幕背景色为褐色cleardevice();print_wall();//输出围墙}voidGameover(){cleardevice();//清屏IMAGE image;//定义图片对像charscore[10] ="0";//临时存储成绩loadimage(&image,"IMAGE","End",len,wide,true);//获取图片putimage(0,0,&image);//输出图片setcolor(RED);_itoa_s(snake.score,score,10);//转换分数为自符outtextxy(270,160,"分数:");//输出分数outtextxy(320,160,score);outtextxy(270,180,"GAME OVER");}voidout_food(){intx =0;x =( len /3+ len %3) *2;srand((unsigned)time(NULL));if(food.flag ==0)//获取食物坐标{food.x = rand() % (x -30) +10;//避免出现在围墙范围food.y = rand() %450+10;food.flag =1;}while(food.x %10!=0)//保证食物在格子里面要不吃不到food.x++;while(food.y %10!=0)food.y++;setfillcolor(RED);if(food.flag ==1)//输出食物fillrectangle(food.x,food.y,food.x +10,food.y +10);}/*画出围墙*/voidprint_wall(){inti =0;intx =0;x =( len /3+ len %3) *2;setfillcolor(RGB(220,115,10));//设置围墙填充色for(i =0; i < wide; i +=10){fillrectangle(0,i,10,i +10);//左边围墙fillrectangle(x,i,x +10,i +10);//中间围墙fillrectangle(len -10,i,len,i +10);//右边围墙}for(i =0; i < len; i +=10){fillrectangle(i,0,i +10,10);//上边围墙fillrectangle(i,wide -10,i +10,wide);//下边围墙}}voidsnake_game(){charch ='0';init_data();print_score();setfillcolor(BLACK);//设置当前填充色为黑色/*开始时显示一个点蛇头*/solidrectangle(snake.x[0],snake.y[0],snake.x[0] +10,snake.y[0] +10);snake.direction = _getch();//得到方向BeginBatchDraw();while(ch !=27)//按下esc键就退出循环{print_wall();out_food();//输出食物if(_kbhit())ch = _getch();get_direction(ch);print_snake();dead_case();//蛇是否撞墙或者撞到自身/*判断生命状态*/if(snake.life ==0)break;eat_food();print_score();FlushBatchDraw();Sleep(snake.speed);cleardevice();pass();//判断通关}EndBatchDraw();}voidmain(){initgraph(len,wide);Gamebegin();snake_game();Gameover();_getch();closegraph();}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值