贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码Word文档下载推荐.docx
《贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《贪吃蛇俄罗斯方块五子棋推箱子的C语言源代码Word文档下载推荐.docx(39页珍藏版)》请在冰豆网上搜索。
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;
=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;
case3:
snake.y[0]-=10;
case4:
snake.y[0]+=10;
for(i=3;
snake.node;
i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
if(snake.x[i]==snake.x[0]&
&
snake.y[i]==snake.y[0])
GameOver();
/*显示失败*/
snake.life=1;
if(snake.x[0]<
55||snake.x[0]>
595||snake.y[0]<
55||
snake.y[0]>
455)/*蛇是否撞到墙壁*/
/*本次游戏结束*/
/*蛇死*/
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
if(snake.x[0]==food.x&
snake.y[0]==food.y)/*吃到食物以后*/
setcolor(0);
/*把画面上的食物东西去掉*/
snake.x[snake.node]=-20;
snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;
/*蛇的身体长一节*/
/*画面上需要出现新的食物*/
score+=10;
/*输出新得分*/
setcolor(4);
/*画出蛇*/
for(i=0;
i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
/*用黑色去除蛇的的最后一节*/
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)/*如果蛇死就跳出循环*/
key=bioskey(0);
/*接收按键*/
if(key==ESC)/*按ESC键退出*/
else
if(key==UP&
snake.direction!
=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
if(key==RIGHT&
=2)
if(key==LEFT&
=1)
snake.direction=2;
if(key==DOWN&
=3)
snake.direction=4;
}/*endwhile
(1)*/
/*游戏结束*/
voidGameOver(void)
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)
closegraph();
-----------------------------------------------------------------------------
一下是俄罗斯方块的。
stdio.h>
conio.h>
#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},
{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},
{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,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}},
{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;
gdrive,&
gmode,"
D:
\\tc\\"
errorcode=graphresult();
if(errorcode!
=grOk){
printf("
errorof:
%s"
grapherrormsg(errorcode));
exit
(1);
/*在图形模式下的清屏*/
voidcls()
setfillstyle(SOLID_FILL,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){
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];
16;
boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];
4;
for(j=0;
j<
j++)
if(boxz[i][j]==1)
minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor);
/*下一个方块的绘制*/
voidnextfunbox(inta,intb,intcolor,intbdcolor){
boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];
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){
for(i=a;
1;
i--)
for(j=1;
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;
21;
i++){
zero=0;
if(gril[i][j]==0)
zero=1;
if(zero==0){
delcol(i);
delgx++;
num=num+delgx*delgx*10;
dj=num/10000;
sprintf(nm,"
num);
clscr(456,173,500,200,4);
txt(456,173,"
Number:
"
1,15);
txt(456,193,nm,1,15);
/*时间中断结束*/
voidKillTimer(){
setvect(TIMER,oldhandler);
/*测试当前方块是否可以向下落*/
intdownok(){
inti,j,k=1,a[4][4];
a[i/4][i%4]=boxstr[boxgs][boxfx][i];
if(a[i][j]&
gril[col+i+1][row+j])
k=0;
return(k);
/*测试当前方块是否可以向左行*/
intleftok(){
gril[col+i][row+j-1])
/*测试当前方块是否可以向右行*/
intrightok(){
gril[col+i][row+j+1])
/*测试当前方块是否可以变形*/
intupok(){
a[i/4][i%4]=boxstr[boxgs][boxfx+1][i];
=0;
for(j=3;
j>
j--)
gril[col+i][row+j])
/*当前方块落下之后,给屏幕坐标作标记*/
voidsetgril(){
inti,j,a[4][4];
funbox(0,0,minboxcolor,0);
if(a[i