贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码.docx
- 文档编号:7019463
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:39
- 大小:25.07KB
贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码.docx
《贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码.docx》由会员分享,可在线阅读,更多相关《贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码.docx(39页珍藏版)》请在冰点文库上搜索。
贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码
贪吃蛇/俄罗斯方块/五子棋/推箱子/的C语言源代码
贪吃蛇。
#defineN200
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
inti,key;
intscore=0;/*得分*/
intgamespeed=50000;/*游戏速度自己调整*/
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;
voidInit(void);/*图形驱动*/
voidClose(void);/*图形结束*/
voidDrawK(void);/*开始画面*/
voidGameOver(void);/*结束游戏*/
voidGamePlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
voidInit(void)
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49);/*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
/*玩游戏具体过程*/
voidGamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while
(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!
=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case1:
snake.x[0]+=10;break;
case2:
snake.x[0]-=10;break;
case3:
snake.y[0]-=10;break;
case4:
snake.y[0]+=10;break;
}
for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*显示失败*/ snake.life=1; break; } } if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到墙壁*/ { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ { setcolor(0);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10); snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes=1;/*画面上需要出现新的食物*/ score+=10; PrScore();/*输出新得分*/ } setcolor(4);/*画出蛇*/ for(i=0;i rectangle(snake.x[i],snake.y[i],snake.x[i]+10, snake.y[i]-10); delay(gamespeed); setcolor(0);/*用黑色去除蛇的的最后一节*/ rectangle(snake.x[snake.node-1],snake.y[snake.node-1], snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); }/*endwhile(! kbhit)*/ if(snake.life==1)/*如果蛇死就跳出循环*/ break; key=bioskey(0);/*接收按键*/ if(key==ESC)/*按ESC键退出*/ break; else if(key==UP&&snake.direction! =4) /*判断是否往相反的方向移动*/ snake.direction=3; else if(key==RIGHT&&snake.direction! =2) snake.direction=1; else if(key==LEFT&&snake.direction! =1) snake.direction=2; else if(key==DOWN&&snake.direction! =3) snake.direction=4; }/*endwhile (1)*/ } /*游戏结束*/ voidGameOver(void) { cleardevice(); PrScore(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAMEOVER"); getch(); } /*输出成绩*/ voidPrScore(void) { charstr[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,"score: %d",score); outtextxy(55,20,str); } /*图形结束*/ voidClose(void) { getch(); closegraph(); } ----------------------------------------------------------------------------- 一下是俄罗斯方块的。 #include #include #include #include #include #ifdef__cplusplus #define__CPPARGS... #else #define__CPPARGS #endif #defineMINBOXSIZE15/*最小方块的尺寸*/ #defineBGCOLOR7/*背景着色*/ #defineGX200 #defineGY10 #defineSJNUM10000/*每当玩家打到一万分等级加一级*/ /*按键码*/ #defineVK_LEFT0x4b00 #defineVK_RIGHT0x4d00 #defineVK_DOWN0x5000 #defineVK_UP0x4800 #defineVK_HOME0x4700 #defineVK_END0x4f00 #defineVK_SPACE0x3920 #defineVK_ESC0x011b #defineVK_ENTER0x1c0d /*定义俄罗斯方块的方向(我定义他为4种)*/ #defineF_DONG0 #defineF_NAN1 #defineF_XI2 #defineF_BEI3 #defineNEXTCOL20/*要出的下一个方块的纵坐标*/ #defineNEXTROW12/*要出的下一个方块的横从标*/ #defineMAXROW14/*游戏屏幕大小*/ #defineMAXCOL20 #defineSCCOL100/*游戏屏幕大显示器上的相对位置*/ #defineSCROW60 intgril[22][16];/*游戏屏幕坐标*/ intcol=1,row=7;/*当前方块的横纵坐标*/ intboxfx=0,boxgs=0;/*当前寺块的形壮和方向*/ intnextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ intminboxcolor=6,nextminboxcolor=6; intnum=0;/*游戏分*/ intdj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/*游戏等级*/ /*以下我用了一个3维数组来纪录方块的最初形状和方向*/ intboxstr[7][4][16]={{ {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}, {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}}, { {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}, {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}, { {1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0}, {1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0}, {0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}}, { {1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0}, {1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}, {1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}}, { {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}}, { {1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}, {1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}, {1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}, {1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}}, { {0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0}, {1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0}, {0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0}, {0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}} }; /*随机得到当前方块和下一个方块的形状和方向*/ voidboxrad(){ minboxcolor=nextminboxcolor; boxgs=nextboxgs; boxfx=nextboxfx; nextminboxcolor=random(14)+1; if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) nextminboxcolor=9; nextboxfx=F_DONG; nextboxgs=random(7); } /*初始化图形模试*/ voidinit(intgdrive,intgmode){ interrorcode; initgraph(&gdrive,&gmode,"D: \\tc\\"); errorcode=graphresult(); if(errorcode! =grOk){ printf("errorof: %s",grapherrormsg(errorcode)); exit (1); } } /*在图形模式下的清屏*/ voidcls() { setfillstyle(SOLID_FILL,0); setcolor(0); bar(0,0,640,480); } /*在图形模式下的高级清屏*/ voidclscr(inta,intb,intc,intd,intcolor){ setfillstyle(SOLID_FILL,color); setcolor(color); bar(a,b,c,d); } /*最小方块的绘制*/ voidminbox(intasc,intbsc,intcolor,intbdcolor){ inta=0,b=0; a=SCCOL+asc; b=SCROW+bsc; clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color); if(color! =BGCOLOR){ setcolor(bdcolor); line(a+1,b+1,a-1+MINBOXSIZE,b+1); line(a+1,b+1,a+1,b-1+MINBOXSIZE); line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); } } /*游戏中出现的文字*/ voidtxt(inta,intb,char*txt,intfont,intcolor){ setcolor(color); settextstyle(0,0,font); outtextxy(a,b,txt); } /*windows绘制*/ voidwin(inta,intb,intc,intd,intbgcolor,intbordercolor){ clscr(a,b,c,d,bgcolor); setcolor(bordercolor); line(a,b,c,b); line(a,b,a,d); line(a,d,c,d); line(c,b,c,d); } /*当前方块的绘制*/ voidfunbox(inta,intb,intcolor,intbdcolor){ inti,j; intboxz[4][4]; for(i=0;i<16;i++) boxz[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(boxz[i][j]==1) minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); } /*下一个方块的绘制*/ voidnextfunbox(inta,intb,intcolor,intbdcolor){ inti,j; intboxz[4][4]; for(i=0;i<16;i++) boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(boxz[i][j]==1) minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor); } /*时间中断定义*/ #defineTIMER0x1c intTimerCounter=0; voidinterrupt(*oldhandler)(__CPPARGS); voidinterruptnewhandler(__CPPARGS){ TimerCounter++; oldhandler(); } voidSetTimer(voidinterrupt(*IntProc)(__CPPARGS)){ oldhandler=getvect(TIMER); disable(); setvect(TIMER,IntProc); enable(); } /*由于游戏的规则,消掉都有最小方块的一行*/ voiddelcol(inta){ inti,j; for(i=a;i>1;i--) for(j=1;j<15;j++){ minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR); gril[i][j]=gril[i-1][j]; if(gril[i][j]==1) minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0); } } /*消掉所有都有最小方块的行*/ voiddelete(){ inti,j,zero,delgx=0; char*nm="00000"; for(i=1;i<21;i++){ zero=0; for(j=1;j<15;j++) if(gril[i][j]==0) zero=1; if(zero==0){ delcol(i); delgx++; } } num=num+delgx*delgx*10; dj=num/10000; sprintf(nm,"%d",num); clscr(456,173,500,200,4); txt(456,173,"Number: ",1,15); txt(456,193,nm,1,15); } /*时间中断结束*/ voidKillTimer(){ disable(); setvect(TIMER,oldhandler); enable(); } /*测试当前方块是否可以向下落*/ intdownok(){ inti,j,k=1,a[4][4]; for(i=0;i<16;i++) a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j]&&gril[col+i+1][row+j]) k=0; return(k); } /*测试当前方块是否可以向左行*/ intleftok(){ inti,j,k=1,a[4][4]; for(i=0;i<16;i++) a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j]&&gril[col+i][row+j-1]) k=0; return(k); } /*测试当前方块是否可以向右行*/ intrightok(){ inti,j,k=1,a[4][4]; for(i=0;i<16;i++) a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j]&&gril[col+i][row+j+1]) k=0; return(k); } /*测试当前方块是否可以变形*/ intupok(){ inti,j,k=1,a[4][4]; for(i=0;i<4;i++) for(i=0;i<16;i++) a[i/4][i%4]=boxstr[boxgs][boxfx+1][i]; for(i=3;i>=0;i--) for(j=3;j>=0;j--) if(a[i][j]&&gril[col+i][row+j]) k=0; return(k); } /*当前方块落下之后,给屏幕坐标作标记*/ voidsetgril(){ inti,j,a[4][4]; funbox(0,0,minboxcolor,0); for(i=0;i<16;i++) a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 俄罗斯方块 五子棋 箱子 语言 源代码