- 声望
- 0 点
- 西工币
- 26 枚
- 贡献值
- 0 点
- 好评度
- 0 点
- 最后登录
- 2010-7-14
- 注册时间
- 2010-7-13
- 帖子
- 15
- 精华
- 0
- 积分
- 15
- 阅读权限
- 20
- UID
- 27187

该用户从未签到 - 西工币
- 26 枚
- 好评度
- 0 点
- 声望
- 0 点
- 注册时间
- 2010-7-13
- 帖子
- 15
- 积分
- 15
- UID
- 27187
|
本帖最后由 在校学生 于 2010-7-14 16:57 编辑
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include<time.h>
#include<string.h>
#include<dos.h>
#include<bios.h>
#define ESC 0x11b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define YES 0x1579
#define NO 0x316e
#define CELL 20
void randompoint();
void nextdraw();
void tempdraw();
void move();
void save();
void showdown();
void showleft();
void showright();
void showup(int select);
void cover();
void draw();
void initigrid();
void scangrid();
void repaint();
void getsave();
/******************dingyi quanju bianliang***********/
int arg[4][2]; //记录初始坐标
int arg2[4][2]={0}; //记录运动中坐标
int block[4][2]={0}; //运动中坐标
int block2[4][2]={0}; //记录下一个方块坐标
int cells[14][21]={0}; //游戏区域每个小方格状态
int top=19;
int key;
int blockid; //panduan dangqian de fangkuai xingzhuang
int blockid2; //record the size of the tempblock
int blockid1;
int flag=0; //jilu xuanzhuan cishu
/**********************han shu shen ming*******************/
int main(void)
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
initigrid();
/* initialize graphics, local variables
*/
initgraph(&gdriver, &gmode, "");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk)
/* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
/* terminate with an error code */
}
/* select drawing color */
setcolor(getmaxcolor());
/* select fill color */
setfillstyle(SOLID_FILL,LIGHTGRAY);
/* draw a border around the screen */
rectangle(60, 60, 300,460);
rectangle(56,56,304,464);
rectangle(400,60,480,140);
rectangle(396,56,484,144);
rectangle(340,260,500,340);
line(340,280,500,280);
line(340,310,500,310);
/* wait for a key */
getch();
/* fill in sunmain region */
floodfill(61,61 , getmaxcolor());//fill the main area color
setfillstyle(SOLID_FILL,LIGHTBLUE);
floodfill(401,61,getmaxcolor()); //set the upright area color
setwritemode(0);
/********draw little retangles************/
for(int i=0;i<20;i++)
line(60,i*CELL+60,300,i*CELL+60);
for(i=0;i<12;i++)
line(i*CELL+60,60,i*CELL+60,460);
/**********draw little retangles of the submain area*****/
for(i=0;i<4;i++)
line(400,i*CELL+60,480,i*CELL+60);
for(i=0;i<4;i++)
line(400+i*CELL,60,400+i*CELL,140);
/*****************************hanshu diaoyong*******************/
//shenqing yige leixing wei "moveobject" de duixiang
randomize();
randompoint(); //zai xiaoquyu hua xiayige xiaofangkuai
nextdraw();
randompoint();
tempdraw();
draw();
move();
if(i>=0)
{
for(i=0;i<4;i++)
{setfillstyle(SOLID_FILL,LIGHTBLUE);
floodfill(block[0]+200+1,block[1]+1,getmaxcolor()); }
randompoint();
nextdraw();
draw();
move();
}
/* clean up */
getch();
closegraph();
return 0;
}
/****************init draw rectangle****************/
void initigrid()
{
for(int i=0;i<21;i++)
{cells[0]=1;cells[13]=1;}
for(i=0;i<14;i++)
cells[20]=1;
for(i=1;i<13;i++)
for(int j=0;j<20;j++)
cells[j]=0;
}
void randompoint()
{
flag=0;
blockid= random(7);
blockid2=blockid;
switch(blockid)
{
case 0:
{arg[0][0]=160;arg[0][1]=60;
arg[1][0]=180;arg[1][1]=60;
arg[2][0]=160;arg[2][1]=80;
arg[3][0]=180;arg[3][1]=80;
break;}
case 1:
{arg[0][0]=140;arg[0][1]=60;
arg[1][0]=160;arg[1][1]=60;
arg[2][0]=180;arg[2][1]=60;
arg[3][0]=200;arg[3][1]=60;
break;}
case 2:
{arg[0][0]=160;arg[0][1]=60;
arg[1][0]=160;arg[1][1]=80;
arg[2][0]=180;arg[2][1]=80;
arg[3][0]=180;arg[3][1]=100;
break;}
case 3:
{arg[0][0]=180;arg[0][1]=60;
arg[1][0]=180;arg[1][1]=80;
arg[2][0]=160;arg[2][1]=80;
arg[3][0]=160;arg[3][1]=100;
break;}
case 4:
{arg[0][0]=160;arg[0][1]=60;
arg[1][0]=160;arg[1][1]=80;
arg[2][0]=160;arg[2][1]=100;
arg[3][0]=180;arg[3][1]=100;
break;}
case 5:
{arg[0][0]=180;arg[0][1]=60;
arg[1][0]=180;arg[1][1]=80;
arg[2][0]=160;arg[2][1]=100;
arg[3][0]=180;arg[3][1]=100;
break;}
case 6:
{arg[0][0]=180;arg[1][0]=60;
arg[1][0]=160;arg[1][1]=80;
arg[2][0]=180;arg[2][1]=80;
arg[3][0]=200;arg[3][1]=80;
break;}
}
}
void tempdraw()
{
for(int i=0;i<4;i++)
{
block[0]=arg2[0]=arg[0];
block[1]=arg2[1]=arg[1];
setfillstyle(SOLID_FILL,RED);
if(block[0]>=0&&block[0]<140&&block[1]>=0&&block[1]<240)
floodfill(block[0]+1,block[1]+1,getmaxcolor());
}
}
void nextdraw()
{
int i,j;
for(i=0;i<4;i++)
{ block[0]=arg[0];
block[1]=arg[1];}
setfillstyle(SOLID_FILL,BLACK);
for (i=400;i<480;i+=20)
{for (j=60;j<140;j+=20)
floodfill(i+1,j+1,getmaxcolor());}
for( i=0;i<4;i++)
{
setfillstyle(SOLID_FILL,RED);
floodfill(block[0]+261,block[1]+1,getmaxcolor());
}
}
void save()
{
for(int i=0;i<4;i++)
{
block2[0]=arg[0];
block2[1]=arg[1];
}
blockid1=blockid2;
}
void getsave()
{
for(int i=0;i<4;i++)
{
block[0]=block2[0];
block[1]=block2[1];
}
blockid2=blockid1;
}
void draw()
{
for(int i=0;i<4;i++)
{arg2[0]=block[0];
arg2[1]=block[1];
setfillstyle(SOLID_FILL,RED);
if(block[0]>=60&&block[0]<3000&&block[1]>=60&&block[1]<460)
floodfill(block[0]+1,block[1]+1,getmaxcolor());
}
}
void cover()
{
for(int i=0;i<4;i++)
{
arg2[0]=block[0];
arg2[1]=block[1];
setfillstyle(SOLID_FILL,LIGHTGRAY);
if(block[0]>=60&&block[0]<300&&block[1]>=60&&block[1]<460)
floodfill(block[0]+1,block[1]+1,getmaxcolor());
}
}
void move()
{
for (;;)
{
key=bioskey(0);
if (key)
{
switch(key)
{
case DOWN:{
showdown ();
break;
}
case UP:{
showup(blockid2);
break;
}
case LEFT:{
showleft();
break;
}
case RIGHT:{
showright();
break;
}
case ESC:{
exit(1);
}
}
}
}
}
void showdown()
{
int i,judge=0;
cover();
for(i=0;i<4;i++)
block[1]+=20;
for(i=0;i<4;i++)
if(cells[block[0]/20-2][block[1]/20-3]) judge=1;
if(judge)
{for(i=0;i<4;i++)
{ block[1]-=20;
cells[arg2[0]/20-2][arg2[1]/20-3]=1;}
if(bioskey(1)) bioskey(0);
draw();
scangrid();
getsave();
draw();
randompoint();
nextdraw();
save();
return;
}
draw();
}
void showleft()
{
int i,judge=0;
cover();
for( i=0;i<4;i++)
block[0]-=20;
for(i=0;i<4;i++)
if(cells[block[0]/20-2][block[1]/20-3]) judge=1;
if(judge)
for(i=0;i<4;i++){block[0]+=20;}
draw();
}
void showright()
{
int i,judge=0;
cover();
for(i=0;i<4;i++)
block[0]+=20;
for(i=0;i<4;i++)
if(cells[block[0]/20-2][block[1]/20-3]) judge=1;
if(judge)
for(i=0;i<4;i++){block[0]-=20;}
draw();
}
void showup(int select)
{
int i,j,judge=0;
cover();
flag++;
switch(select)
{
case 0: break;
case 1: // 以第二块为中心旋转
{flag =flag%2;
for(i=0; i<4; i++)
{
block[(flag+1)%2] =block[1][(flag+1)%2];
block[flag] =block[1][flag]+(i-1)*20;
}
break;}
case 2: //以三四块为中心旋转
{flag =flag%2;
if(flag==1)
{ block[0][1]+=40;block[1][0]+=40;}
if(flag==0)
{ block[0][1]-=40;block[1][0]-=40;}
break;}
case 3: //以三四块为中心旋转
{flag =flag%2;
if(flag==1)
{ block[0][1]+=40;block[1][0]-=40; }
if(flag==0)
{ block[0][1]-=40;block[1][0]+=40; }
break;}
case 4:
{flag=flag%4;
switch(flag)
{
case 0:
/*旋转到初始位置,在三次旋转的基础上修改就可 */
block[0][0] +=20; block[0][1]-=40;
block[3][0] +=60;
break;
case 1:
block[0][0] +=40; block[0][1] +=20;/*一次旋转,修改一二块 */
block[3][1] -=20;
break;
case 2:
block[0][0] -=40; block[0][1] -=20;/*二次旋转,在一次旋转的基础上修改. */
block[3][0] -=40; block[3][1] -=20;
break;
case 3: /*三次旋转,在二次旋转的基础上修改*/
block[0][0] -=20;block[0][1]+=40;
block[3][0] -=20;block[3][1]+=40;
break;
}
break;}
case 5:
{flag=flag%4;
switch(flag)
{
case 0:
block[0][0] -=20; block[0][1] -=60;
block[1][0] -=20; block[1][1] -=20;
break;
case 1:
block[0][0] +=20; block[0][1]+=40;
block[1][0] -=20;
break;
case 2:
block[0][0] -=40; block[0][1] +=40;
block[1][1] +=40;
break;
case 3:
block[0][0] +=40; block[0][1] -=20;
block[1][0] +=40; block[1][1] -=20;
break;
}
break;}
case 6:
{flag =flag%4;
switch(flag)
{
case 0:
block[1][1]+=20;
block[3][0]+=20; block[3][1]+=40;
break;
case 1:
block[1][0]+=20; block[1][1]+=20; break;
case 2:
block[1][0]-=20; block[1][1]-=40;
block[3][1]-=20;
break;
case 3:
block[3][0]-=20; block[3][1]-=20; break;
}
break;}
}
for(i=0;i<4;i++) if(cells[block[0]/20-2][block[1]/20-3]) judge=1;
if(judge)
{
flag+=3;
for(i=0;i<4;i++){block[0]=arg2[0];block[1]=arg2[1];}
}
draw();
}
void scangrid()
{
int i,j,lines,k;
for(i=0;i<4;i++)
if((block[1]/20-3)<top) /*如果现有图形低于原有的TOP所示行数,则更新TOP值.*/
top=block[1]/20-3;
if(top<1)
{
/*show_info(GAMELOSE);*/
exit(1); /*退出程序*/
}
i=19;
while((i-top)>=0)/*消行检测*/
{
lines =0;/*一个标记,用于指出某行是否有未填满的情况*/
/* 循环语句检查是否有某一行全部被【方格】都填满 */
for(j=1; j<=12; j++)
{ if(!cells[j])
{
lines=1; /*若i行未被填满,则置标记为1*/
i--;
break;
}
}
/* 若该行被填满,则将上一行的填充状态复制到该行,依此类推 */
if(!lines)
{
for(j=1;j<13; j++)
for(k=i; k>=top; k--)/*i行以上直到TOP+1行的标记全部下移!*/
cells[j][k]=cells[j][k-1];
repaint(); /*画静止方格*/
top++;
i=19;
/*showscore(10);*/ /*每消一行加10分*/
}
}
}
void repaint()
/*-------------------------------------------------------------
//重画游戏区域及静止方格
//------------------------------------------------------------*/
{
int i,j;
for(i=1;i<=12;i++)
for(j=3;j<=19;j++)
if(!cells[j])
{
setfillstyle(1,LIGHTGRAY);
floodfill(61+(i-1)*CELL,61+j*CELL,getmaxcolor());
}
else
{
setfillstyle(1,RED);
floodfill(61+(i-1)*CELL,61+j*CELL,getmaxcolor());
}
}
本来是还有一个word报告的,可能是这个附件加不上去,不知道是文件过大还是不支持offoce word 2010的格式.仅用于交流,有高见者可以给我留言或发邮件fred1564@qq.com
|
|