• 欢迎访问C语言网www.dotcpp.com 比赛栏每月有奖月赛!举办比赛联系QQ:2045302297
  • 问题反馈、粉丝交流 QQ群327452739 蓝桥杯训练群:113766799 申请群时请备注排名里的昵称
  • C语言研究中心 为您提供有图、有料、解渴的C语言专题! 欢迎讨论!

C语言实现俄罗斯方块(TC2.0)

项目源码 CTO 33018次浏览 10个评论

C语言实现俄罗斯方块游戏 TC2.0环境,主要用到TC提供的graphics来实现相关的绘图,实际运行效果如下:

C语言实现俄罗斯方块(TC2.0)

对应TC2.0下载http://www.dotcpp.com/wp/144.html

 

作者原创亲测,源码如下:

 

/********************************************************************/
// Name:俄-罗-斯-方-块 V1.0
// Author:Giant
// Time: 2015/5/17
/********************************************************************/
#include"graphics.h"
#include"time.h"
#include"math.h"
#include"dos.h"
#include"conio.h"
#define NULL 0
#define False 0
#define True  1
#define REVOLVE 5
#define DOWN 2
#define LEFT 3
#define RIGHT 4
#define TIMER 0x1c
#define ESC 27
#define DOWN_MAX 420
void interrupt (*oldtimer)(void);
static unsigned grade=0;
char msg[10]="Grade : ";
char msg1[10]="\0";
typedef struct boxes
{
	unsigned int box;
	int color;
	int next;
}DESIGN;
DESIGN a[19]={35008,2,1,	 /*  The 19 shapes of boxes ,includes size,color and the next number*/
		3712,2,2,
		50240,2,3,
		736,2,0,
		1100,YELLOW,5,
		2272,YELLOW,6,
		51328,YELLOW,7,
		3616,YELLOW,4,
		35904,4,9,
		1728,4,8,
		19584,12,11,
		3168,12,10,
		1248,5,13,
		35968,5,14,
		3648,5,15,
		19520,5,12,
		34952,6,17,
		3840,6,16,
		3264,10,18};
int screeninarry[19][21]={0};
int TimerCounter=0;
void interrupt newtimer(void)
{
	(*oldtimer)();
	TimerCounter++;
}
void SetTimer(void interrupt(*IntProc)(void))
{
	oldtimer=getvect(TIMER);
	disable();
	setvect(TIMER,IntProc);
	enable();
}
void KillTimer()
{
	disable();
	setvect(TIMER,oldtimer);
	enable();
}
void background()
{
     int x1=getmaxx()/2-200,y1=60,x2=getmaxx()/2+200,y2=420; /* x,y is    maingameinterface  of coordinate*/
     int i;
     setlinestyle(0,1,3);
     /* set bkground */
     setfillstyle(1,BLUE);
     bar(0,0,getmaxx(),getmaxy());
     /*   maingameinterface  */
     setcolor(WHITE);
     setlinestyle(0,1,3);
     rectangle(x1,y1,x2,y2);  /*   18* 20  & 360 * 400 */
     setfillstyle(1,LIGHTBLUE);
     bar(x1,y1,x2,y2);
     /* set outbox left and right  */
     setcolor(WHITE);
     setlinestyle(0,1,3);
     rectangle(x2+20,80,x2+100,160);
     setfillstyle(1,LIGHTBLUE);              /*   setfill maingameinterface     */
     bar(x2+20,80,x2+100,160);             /*	  setfill occupation box	*/
     i=20;
     setlinestyle(0,1,3);
     while(i<80)
     {
	line(x2+20,80+i,x2+100,80+i);
	i=i+20;
     }
     i=20;
     while(i<80)
     {
	line(x2+20+i,80,x2+20+i,160);
	i=i+20;
     }
/* this is about of the game ,include opreta and author and so on*/
     setlinestyle(0,1,3);
     rectangle(x2+10,240,x2+110,DOWN_MAX);
     bar(x2+10,240,x2+110,DOWN_MAX);
     moveto(x2+10,250);
     outtext("Welcomeplay!");
     moveto(x2+10,270);
     outtext("'P' is pause");
     moveto(x2+10,290);
     outtext("'R' is renew");
     moveto(x2+10,310);
     outtext("'Esc' is exit");
     moveto(x2+10,340);
     outtext(" ----by Giant");
}
/*                               */
void box(unsigned int box,int color) /* box difine shape,color */
{
	int x=getmaxx()/2+200+20,y=80;   /* set dutum of x,y  */
	int i=getmaxx()/2+200+20,n;
	unsigned int max=box;
	unsigned int mask=32768;
	/* init boxes */
	int k=20;
	setfillstyle(1,LIGHTBLUE);
	bar(x,80,x+80,160);
	k=20;
	setcolor(WHITE);
	setlinestyle(0,1,3);
	while(k<80)
	{
		line(x,80+k,x+80,80+k);
		k=k+20;
	}
	k=20;
	while(k<80)
	{
		line(x+k,80,x+k,160);
		k=k+20;
	}
	/* boxes it is ok */
	setfillstyle(1,color);
	setlinestyle(0,1,3);
	for(n=0;n<16;n++) { if(mask & max) { rectangle(x,y,x+20,y+20); bar(x,y,x+20,y+20); } x=x+20; if(x-i==80) { x=(x-i)%80+i; y=y+20; } mask=mask>>1;
	}
}
double killfullline(int lasty)
{
	int vga=getmaxx()/2-200;
	int x=vga,y=lasty,yy=lasty;
	int n=0;
	int count=0,i=0;
	int color;
	int score=0;
	for(y=lasty;y>=lasty-60;y=y-20)   {
	count=0;
	x=vga;
	for(i=0;i<20;i++,x=x+20)
	{
		if(screeninarry[(y-60)/20][(x-vga)/20]==2)
		{
			count++;
		}
	}
	if(20==count)
	{
		n=0;
		score=0;
		x=vga;
		n++;
		score=score+10*pow(2,n);
		setfillstyle(1,LIGHTBLUE);
		setcolor(LIGHTBLUE);
		for(x=vga,i=0;i<20;x=x+20,i++) /* clean fullline */ { rectangle(x,y,x+20,y+20); bar(x,y,x+20,y+20); screeninarry[(y-60)/20][(x-vga)/20]=0; } for(x=vga,i=0,yy=y;yy>=60;x=x+20,i++)
	{
		if(i==20)
		{
			i=0;
			x=vga;
			/* killfullline(yy); */
			yy=yy-20;
		}
		if(screeninarry[(yy-20-60)/20][(x-vga)/20]==2)
		{
		color=getpixel(x+10,yy-10); 		/* get  color of this box*/
		screeninarry[(yy-20-60)/20][(x-vga)/20]=0;
		setfillstyle(1,LIGHTBLUE);
		bar(x,yy-20,x+20,yy);
		setcolor(LIGHTBLUE);
		rectangle(x,yy-20,x+20,yy);
		setfillstyle(1,color);
		setlinestyle(0,1,3);
		setcolor(WHITE);
		rectangle(x,yy,x+20,yy+20);
		bar(x,yy,x+20,yy+20);
		screeninarry[(yy-60)/20][(x-vga)/20]=2;
		}
	}
	y=y+20;
	}  /*if (20==count) */
	} /*	for	*/
return score;
} /*	killfullline	*/
int drawshape(int startx,int starty,int n,int flag)  /*  set start,coordinate of x,y */
{
	int x,y;
	int vga=getmaxx()/2-200;
	int  i=0;
	int var;
	int x1=getmaxx()/2-200,y1=60,x2=getmaxx()/2+200,y2=420;
	int bottom;
	unsigned int mask=32768;
	unsigned int max=a[n].box;
	setfillstyle(1,LIGHTBLUE);
	if(flag==0)
		var=1;
	else
		var=2;
	setfillstyle(1,BLUE);
			 	bar(getmaxx()/2-120,20,getmaxx()/2+120,50);
	settextstyle(1, 0, 3);
				outtextxy(getmaxx()/2-100,20,msg);
	/*setfillstyle(1,BLUE);
	bar(x1,0,x2,y1);*/
	setlinestyle(0,1,3);
	setcolor(WHITE);
	rectangle(x1,y1,x2,y2);
	x=startx,y=starty;
	for(i=0;i<16;i++) /* draw picture of shape */ { if(x-startx==80) { x=startx; y=y+20; } if(mask & max) { setfillstyle(1,a[n].color); setlinestyle(0,1,3); rectangle(x,y,x+20,y+20); bar(x,y,x+20,y+20); screeninarry[(y-60)/20][(x-vga)/20]=var; bottom=y; } x=x+20; mask=mask>>1;
	}
	/*setfillstyle(1,BLUE);
	bar(x1,0,x2,y1);*/
	setlinestyle(0,1,3);
	setcolor(WHITE);
	rectangle(x1,y1,x2,y2);
			 /*	delay	*/
	return bottom;
	  /* in */
}
void cleanshape(int startx,int starty,int n)
{
	int x=startx,y=starty;
	int vga=getmaxx()/2-200;
	int i=0;
	unsigned int max;
	unsigned int mask=32768;
	max=a[n].box;
	for(i=0;i<16;i++) /* clean shape to bk */ { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) { setfillstyle(1,LIGHTBLUE); bar(x,y,x+20,y+20); setcolor(LIGHTBLUE); rectangle(x,y,x+20,y+20); screeninarry[(y-60)/20][(x-vga)/20]=0; } x=x+20; mask=mask>>1;
	}
}
int checkshape(int startx,int starty,unsigned int shapebox,int direction)
{
	int i=0,x=startx,y=starty,tempx=startx,tempy=starty;
	int vga=getmaxx()/2-200;
	unsigned int mask=32768;
	unsigned int max=a[shapebox].box;
	/**/
	if(direction==LEFT)
	{
		for(x=startx,y=starty,i=0;i<16;x=x+20,i++)
		{
			if(x-startx==80)
			{
				x=startx;
				y=y+20;
			}
			if(x<vga || screeninarry[(y-60)/20][(x-vga)/20]==2)
                             return False;
 
 
                  mask=mask>>1; 
              }
	return True;
	}
	else if(direction==RIGHT)
	{
		mask=32768;
		for(x=startx,y=starty,i=0;i<16;x=x+20,i++) { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) if(x+20 > getmaxx()-vga || screeninarry[(y-60)/20][(x-vga)/20]==2)
					return False;
		mask=mask>>1;
		}
	return True;
	}
	else if(direction==DOWN)
	{
		mask=32768;
		for(x=startx,y=starty,i=0;i<16;x=x+20,i++) { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) if(y>=DOWN_MAX || screeninarry[(y-60)/20][(x-vga)/20]==2)
					return False;
		mask=mask>>1;
		}
	return True;
	}
	else if(direction==REVOLVE)
	{
		mask=32768;
		for(x=startx,y=starty,i=0;i<16;x=x+20,i++) { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) if(screeninarry[(y-60)/20][(x-vga)/20]==2 || y>=DOWN_MAX || x+20 > getmaxx()-vga || x<vga) return False; mask=mask>>1;
		}
	return True;
	}
	else
		printf("direction is error!\n ");
}
int main()
{
	int drive,mode;
	int i=0;
	int bottom=0;
	int xofshape,xofbox;
	int flag;
	int startx=150,starty=0;
	char ch,ch1;
	char direction;
	srand((unsigned)time(0));
	drive=DETECT;
	initgraph(&drive,&mode,"C:\\TC20\\BGI");
	/* srand((unsigned)time(0));  */
	background();
	memset(screeninarry,0,19*21*sizeof(int));
	SetTimer(newtimer);
	while(1) {
	setfillstyle(1,BLUE);
			 	bar(getmaxx()/2-120,20,getmaxx()/2+120,50);
	settextstyle(1, 0, 3);
				outtextxy(getmaxx()/2-100,20,msg);
	if(i==0)
	{
		xofshape=rand()%19;
		xofbox=rand()%19;
	}
	else
	{
		xofshape=xofbox;
		xofbox=rand()%19;
	}
	i++;
	box(a[xofbox].box,a[xofbox].color);
	startx=getmaxx()/2-200+120;
	starty=60;
	while(1)
	{
		if(bioskey(1))
		{
			direction=bioskey(0);
			if(direction==ESC )
			{
				setcolor(WHITE);
				settextstyle(1, 0, 3);
				moveto(getmaxx()/2-150,440);
				outtext("Are you sure to exit ?(y/n)");
				ch=getch();
				if(ch=='y' || ch== 'Y')
				exit(0);
				else
				{
					setfillstyle(1,BLUE);
					bar(getmaxx()/2-150,430,getmaxx()/2+180,500);
				}
			}
			if(direction=='r' || direction=='R')
			{
				setcolor(WHITE);
				settextstyle(1, 0, 3);
				moveto(getmaxx()/2-100,440);
				outtext("pausing......");
				ch=getch();
				setfillstyle(1,BLUE);
			 	bar(getmaxx()/2-120,430,getmaxx()/2+120,490);
			}
			if(direction=='a' || direction=='A')
			{
				if(checkshape(startx-20,starty,xofshape,LEFT))
				{
				cleanshape(startx,starty,xofshape);
				startx=startx-20;
				drawshape(startx,starty,xofshape,0);
				}
			}
			if(direction=='d' || direction=='D')
			{
				if(checkshape(startx+20,starty,xofshape,RIGHT))
				{
				cleanshape(startx,starty,xofshape);
				startx=startx+20;
				drawshape(startx,starty,xofshape,0);
				}
			}
			if(direction=='s' || direction=='S')
			{
				if(checkshape(startx,starty+20,xofshape,DOWN))
				{
					TimerCounter=TimerCounter+18;
				}
			}
			if(direction=='w' || direction=='W')
			{
 				if(checkshape(startx,starty,a[xofshape].next,REVOLVE) )
				{
					cleanshape(startx,starty,xofshape);
					xofshape=a[xofshape].next;
					drawshape(startx,starty,xofshape,0);
				}
			}
		}
			if(TimerCounter>=18)
			{
			if(checkshape(startx,starty+20,xofshape,DOWN) )
			{
				drawshape(startx,starty,xofshape,0);
				cleanshape(startx,starty,xofshape);
				starty=starty+20;
				drawshape(startx,starty,xofshape,0);
				TimerCounter=0;
			}
			else      /* can not down */
			{
				 if(starty<=60)
				{
					setcolor(WHITE);
					while(1)
					{
						if(bioskey(1))
							exit(1);
						moveto(getmaxx()/2-100,450);
			 			bar(getmaxx()/2-120,20,getmaxx()/2+120,50);
						settextstyle(1, 0, 3);
						outtextxy(getmaxx()/2-100,20,msg);
						outtext("Game  over ! ! !");
						delay(2000);
						setfillstyle(1,BLUE);
						bar(getmaxx()/2-120,440,getmaxx()/2+120,460);
					}
				}
				/*  down is ok var=2 */
				bottom=drawshape(startx,starty,xofshape,1);
				grade=grade+killfullline(bottom);
				itoa(grade,msg1,10);
				strcpy(msg+8,msg1);
				break;
			}
			}
	}
}
	closegraph();
	KillTimer();
}

C语言研究中心(www.dotcpp.com)

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

C语言网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言实现俄罗斯方块(TC2.0)
喜欢 (82)
[jinyangH@aliyun.com]
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
(10)个小伙伴在吐槽
  1. 好厉害啊啊啊!
    misillas2016-09-12 19:49 回复
    • 豪腻害吖吖吖!
      你猜猜2016-09-13 16:41 回复
  2. 好多头文件好多源码,刚开始学的小白膜拜一下大神
    冰封小天堂2016-11-19 21:04 回复
  3. 由于不太会用TC2.0能不能留个联系方式,赐教一下,实现原理
    孤尘2017-03-17 19:30 回复
    • TC的教程慢慢会出的,大家表急~~
      CTO2017-03-21 20:31 回复
  4. 楼上邮箱1164701506@qq.com,记得有空赐教啊
    孤尘2017-03-17 19:31 回复
  5. 第270行, if(x>1; 不全. TC2.0编译通不过
    cdk2017-04-09 09:54 回复
    • 已修复~
      CTO2017-04-11 11:43 回复
  6. 请问在VS上是不是不可以运行
    张棋垣2018-01-14 21:14 回复
  7. 我了个去!用C-FREE编译一下,109个错误!
    12345665542019-02-10 12:34 回复