求一个c语言编写的俄罗斯方块游戏,要带图形的,不要字符拼的,直接发一下cpp文件,[email protected]谢谢 求C语言编写的俄罗斯方块游戏的详细代码 ,一定要能成功运行的...

\u6c42\u4e00\u4e2a\u7b80\u5355\u7684c\u8bed\u8a00\u5199\u7684\u4fc4\u7f57\u65af\u65b9\u5757\u7a0b\u5e8f

\u671b\u91c7\u7eb3\uff01\uff01
\uff03i nclude
\uff03i nclude
\uff03i nclude
\uff03i nclude
\uff03i nclude

#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define MINBOXSIZE 15 /* \u6700\u5c0f\u65b9\u5757\u7684\u5c3a\u5bf8 */
#define BGCOLOR 7 /* \u80cc\u666f\u7740\u8272 */
#define GX 200
#define GY 10
#define SJNUM 10000 /* \u6bcf\u5f53\u73a9\u5bb6\u6253\u5230\u4e00\u4e07\u5206\u7b49\u7ea7\u52a0\u4e00\u7ea7*/

/* \u6309\u952e\u7801*/
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d

/* \u5b9a\u4e49\u4fc4\u7f57\u65af\u65b9\u5757\u7684\u65b9\u5411\uff08\u6211\u5b9a\u4e49\u4ed6\u4e3a4\u79cd\uff09*/
#define F_DONG 0
#define F_NAN 1
#define F_XI 2
#define F_BEI 3

#define NEXTCOL 20 /* \u8981\u51fa\u7684\u4e0b\u4e00\u4e2a\u65b9\u5757\u7684\u7eb5\u5750\u6807*/
#define NEXTROW 12 /* \u8981\u51fa\u7684\u4e0b\u4e00\u4e2a\u65b9\u5757\u7684\u6a2a\u4ece\u6807*/
#define MAXROW 14 /* \u6e38\u620f\u5c4f\u5e55\u5927\u5c0f*/
#define MAXCOL 20
#define SCCOL 100 /*\u6e38\u620f\u5c4f\u5e55\u5927\u663e\u793a\u5668\u4e0a\u7684\u76f8\u5bf9\u4f4d\u7f6e*/
#define SCROW 60



int gril[22][16]; /* \u6e38\u620f\u5c4f\u5e55\u5750\u6807*/
int col=1,row=7; /* \u5f53\u524d\u65b9\u5757\u7684\u6a2a\u7eb5\u5750\u6807*/
int boxfx=0,boxgs=0; /* \u5f53\u524d\u5bfa\u5757\u7684\u5f62\u58ee\u548c\u65b9\u5411*/
int nextboxfx=0,nextboxgs=0,maxcol=22;/*\u4e0b\u4e00\u4e2a\u65b9\u5757\u7684\u5f62\u58ee\u548c\u65b9\u5411*/
int minboxcolor=6,nextminboxcolor=6;
int num=0; /*\u6e38\u620f\u5206*/
int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* \u6e38\u620f\u7b49\u7ea7*/
/* \u4ee5\u4e0b\u6211\u7528\u4e86\u4e00\u4e2a3\u7ef4\u6570\u7ec4\u6765\u7eaa\u5f55\u65b9\u5757\u7684\u6700\u521d\u5f62\u72b6\u548c\u65b9\u5411*/
int boxstr[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}}

};

/* \u968f\u673a\u5f97\u5230\u5f53\u524d\u65b9\u5757\u548c\u4e0b\u4e00\u4e2a\u65b9\u5757\u7684\u5f62\u72b6\u548c\u65b9\u5411*/
void boxrad(){
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);
}
/*\u521d\u59cb\u5316\u56fe\u5f62\u6a21\u8bd5*/
void init(int gdrive,int gmode){
int errorcode;
initgraph(&gdrive,&gmode,"e:\\tc");
errorcode=graphresult();
if(errorcode!=grOk){
printf("error of: %s",grapherrormsg(errorcode));
exit(1);
}
}

/* \u5728\u56fe\u5f62\u6a21\u5f0f\u4e0b\u7684\u6e05\u5c4f */
void cls()
{
setfillstyle(SOLID_FILL,0);
setcolor(0);
bar(0,0,640,480);
}
/*\u5728\u56fe\u5f62\u6a21\u5f0f\u4e0b\u7684\u9ad8\u7ea7\u6e05\u5c4f*/
void clscr(int a,int b,int c,int d,int color){
setfillstyle(SOLID_FILL,color);
setcolor(color);
bar(a,b,c,d);
}
/*\u6700\u5c0f\u65b9\u5757\u7684\u7ed8\u5236*/
void minbox(int asc,int bsc,int color,int bdcolor){
int a=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);
}
}

/*\u6e38\u620f\u4e2d\u51fa\u73b0\u7684\u6587\u5b57*/
void txt(int a,int b,char *txt,int font,int color){
setcolor(color);
settextstyle(0,0,font);
outtextxy(a,b,txt);
}
/*windows \u7ed8\u5236*/
void win(int a,int b,int c,int d,int bgcolor,int bordercolor){
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);

}

/* \u5f53\u524d\u65b9\u5757\u7684\u7ed8\u5236*/
void funbox(int a,int b,int color,int bdcolor){
int i,j;
int boxz[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);
}
/*\u4e0b\u4e00\u4e2a\u65b9\u5757\u7684\u7ed8\u5236*/
void nextfunbox(int a,int b,int color,int bdcolor){
int i,j;
int boxz[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);
}
/*\u65f6\u95f4\u4e2d\u65ad\u5b9a\u4e49*/
#define TIMER 0x1c
int TimerCounter=0;
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt newhandler(__CPPARGS){
TimerCounter++;
oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS)){
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
/*\u7531\u4e8e\u6e38\u620f\u7684\u89c4\u5219\uff0c\u6d88\u6389\u90fd\u6709\u6700\u5c0f\u65b9\u5757\u7684\u4e00\u884c*/
void delcol(int a){
int i,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);
}
}

/*\u6d88\u6389\u6240\u6709\u90fd\u6709\u6700\u5c0f\u65b9\u5757\u7684\u884c*/
void delete(){
int i,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);
}
/*\u65f6\u95f4\u4e2d\u65ad\u7ed3\u675f*/
void KillTimer(){
disable();
setvect(TIMER,oldhandler);
enable();
}
/* \u6d4b\u8bd5\u5f53\u524d\u65b9\u5757\u662f\u5426\u53ef\u4ee5\u5411\u4e0b\u843d*/
int downok(){
int i,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);
}
/* \u6d4b\u8bd5\u5f53\u524d\u65b9\u5757\u662f\u5426\u53ef\u4ee5\u5411\u5de6\u884c*/
int leftok(){
int i,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);
}
/* \u6d4b\u8bd5\u5f53\u524d\u65b9\u5757\u662f\u5426\u53ef\u4ee5\u5411\u53f3\u884c*/
int rightok(){
int i,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);
}
/* \u6d4b\u8bd5\u5f53\u524d\u65b9\u5757\u662f\u5426\u53ef\u4ee5\u53d8\u5f62*/
int upok(){
int i,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);
}
/*\u5f53\u524d\u65b9\u5757\u843d\u4e0b\u4e4b\u540e\uff0c\u7ed9\u5c4f\u5e55\u5750\u6807\u4f5c\u6807\u8bb0*/
void setgril(){
int i,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][j])
gril[col+i][row+j]=1;
col=1;row=7;
}
/*\u6e38\u620f\u7ed3\u675f*/
void gameover(){
int i,j;

for(i=20;i>0;i--)
for(j=1;j<15;j++)
minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);
txt(103,203,"Game Over",3,10);
}
/*\u6309\u952e\u7684\u8bbe\u7f6e*/
void call_key(int keyx){
switch(keyx){
case VK_DOWN: { /*\u4e0b\u65b9\u5411\u952e\uff0c\u6a2a\u5750\u6807\u52a0\u4e00\u3002*/
if(downok()){
col++;
funbox(0,0,minboxcolor,0);}
else{
funbox(0,0,minboxcolor,0);
setgril();
nextfunbox(NEXTCOL,NEXTROW,4,4);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
delete();
}
break;
}
case VK_UP: { /*\u4e0a\u65b9\u5411\u952e\uff0c\u65b9\u5411\u5f62\u72b6\u65cb\u8f6c90\u5ea6*/
if(upok())
boxfx++;
if(boxfx>3)
boxfx=0;
funbox(0,0,minboxcolor,0);
break;
}
case VK_LEFT:{ /*\u5de6\u65b9\u5411\u952e\uff0c\u7eb5\u5750\u6807\u51cf\u4e00*/
if(leftok())
row--;
funbox(0,0,minboxcolor,0);
break;
}
case VK_RIGHT:{ /*\u53f3\u65b9\u5411\u952e\uff0c\u7eb5\u5750\u6807\u52a0\u4e00*/
if(rightok())
row++;
funbox(0,0,minboxcolor,0);
break;
}
case VK_SPACE: /*\u7a7a\u683c\u952e\uff0c\u76f4\u63a5\u843d\u5230\u6700\u540e\u53ef\u4ee5\u843d\u5230\u7684\u4eec\u7f6e*/
while(downok())
col++;
funbox(0,0,minboxcolor,0);
setgril();
nextfunbox(NEXTCOL,NEXTROW,4,4);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
delete();
break;
default:
{
txt(423,53,"worng key!",1,4);
txt(428,80,"Plese Enter Anly Key AG!",1,4);
getch();
clscr(420,50,622,97,BGCOLOR);
}
}
}

/*\u65f6\u95f4\u4e2d\u65ad\u5f00\u59cb*/
void timezd(void){
int key;
SetTimer(newhandler);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
for(;;){
if(bioskey(1)){
key=bioskey(0);
funbox(0,0,BGCOLOR,BGCOLOR);
if(key==VK_ESC)
break;
call_key(key);
}
if(TimerCounter>gamedj[dj]){
TimerCounter=0;
if(downok()){
funbox(0,0,BGCOLOR,BGCOLOR);
col++;
funbox(0,0,minboxcolor,0);
}
else {
if(col==1){
gameover();
getch();
break;
}
setgril();
delete();
funbox(0,0,minboxcolor,0);
col=1;row=7;
funbox(0,0,BGCOLOR,BGCOLOR);
nextfunbox(NEXTCOL,NEXTROW,4,4);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
}
}
}
}

/*\u4e3b\u7a0b\u5e8f\u5f00\u59cb*/
void main(void){
int i,j;
char *nm="00000";
init(VGA,VGAHI);
cls();
/*\u5c4f\u5e55\u5750\u6807\u521d\u59cb\u5316*/
for(i=0;i<=MAXCOL+1;i++)
for(j=0;j<=MAXROW+1;j++)
gril[i][j]=0;
for(i=0;i<=MAXCOL+1;i++) {
gril[i][0]=1;
gril[i][15]=1;
}
for(j=1;j<=MAXROW;j++){
gril[0][j]=1;
gril[21][j]=1;
}
clscr(0,0,640,480,15);
win(1,1,639,479,4,15);
win(SCCOL+MINBOXSIZE-2,SCROW+MINBOXSIZE-2,SCCOL+15*MINBOXSIZE+2,SCROW+21*MINBOXSIZE+2,BGCOLOR,0);
nextboxgs=random(8);
nextboxfx=random(4);
sprintf(nm,"%d",num);
txt(456,173,"Number:",1,15);
txt(456,193,nm,1,15);
txt(456,243,"Next Box:",1,15);
timezd();
KillTimer();
closegraph();
}

#include
#include
#include
#define mDRAW 5
#define mLINE 6
#define mADOWN 7
#define mGEN 8
#define mLEFT 75
#define mRIGHT 77
#define mSPACE 57
#define mDOWN 80
#define mESC 1
#define TIMEINT 2
#define MAXX 9
#define MAXY 30
#define BACKCOLOR BLACK
#define WINX 50
#define WINY 470
#define GAP 6
#define AREAX (WINX+GAP)
#define AREAY (WINY-GAP)
#define BOXW 15

int oldarea[MAXY+1][MAXX];
int area[MAXY+1][MAXX];
int actW,actH,actX,actY;
int curX,curY,curColor,curW,curH;
int newX,newY,newColor,newW,newH;
int active;
int box[4][4];
int FORCOLOR;
int MESSAGE;
int BOX[7][4][4]={
{
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{1,0,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{0,0,1,0},
{0,0,0,0},
{0,0,0,0}

},{
{1,1,1,0},
{0,1,0,0},
{0,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,1,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}
}
};


void init();
void draw();
int genBox();
int getKey();
void lineFull();
int moveLeft();
int moveRight();
int moveDown();
int rotate();
int getW();
int getH();
void clearOldBox();
void putNewBox();
int collisionRotate(int box[][4]);
void getMessage();
void dispatchMessage();
int timeCome();
void fallDown();
int gameOver();

main()
{
int i;
init();
do
{
getMessage();
dispatchMessage();
}
while(!gameOver());

getch();
closegraph();
}

void getMessage()
{
if(MESSAGE) return;
if(timeCome())
{
MESSAGE=mADOWN;
return;
}
if(bioskey(1))
{
MESSAGE=bioskey(0)>>8;
return;
}
}

void dispatchMessage()
{
switch(MESSAGE)
{
case mLEFT: moveLeft();break;
case mRIGHT: moveRight();break;
case mADOWN: moveDown();break;
case mSPACE: rotate();break;
case mDOWN: fallDown(); break;
case mDRAW: draw();break;
case mLINE: lineFull();break;
case mGEN: genBox();break;
case mESC: closegraph(); exit(0);
default: MESSAGE=0;
}
}

void fallDown()
{
while(active)
{
moveDown(); draw();
}

MESSAGE=mLINE;
}

int timeCome()
{

static long tm, old;
tm=biostime(0,tm);
if(tm-old<TIMEINT) return 0;
else
{
old=tm; return 1;
}
}

void init()
{
int i,j,x1,y1,x2,y2;
int driver=DETECT, mode=0;
randomize();
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
cleardevice();
setfillstyle(SOLID_FILL,BLUE);
bar(0,0,639,479);
x1=AREAX;
y1=AREAY-BOXW*MAXY;
x2=AREAX+MAXX*BOXW;
y2=AREAY;
rectangle(--x1,--y1,++x2,++y2);
setfillstyle(SOLID_FILL,BLACK);
bar(++x1,++y1,--x2,--y2);
y1=AREAY-MAXY*BOXW; y2=AREAY;
setcolor(DARKGRAY);
for(i=0;i<MAXX;i++)
{
x1=AREAX+i*BOXW;
line(x1,y1,x1,y2);
}

x1=AREAX; x2=x1+MAXX*BOXW;
for(j=0;j<MAXY;j++)
{
y1=AREAY-j*BOXW;
line(x1,y1,x2,y1);
}
for(j=0;j<MAXY;j++)
for(i=0;i<MAXX;i++)
area[j][i]=oldarea[j][i]=0;
actX=0; actY=0; actW=MAXX-1; actH=MAXY-1;
draw();
MESSAGE=mGEN;
}

int genBox()
{
int i,j,boxidx;
boxidx=random(7); FORCOLOR=random(7)+1;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=BOX[boxidx][j][i];
curW=getW(); curH=getH();
curX=(MAXX+curW)/2;
if(curX+curW>=MAXX)curX=MAXX-1-curW;
curY=MAXY-1-curH;
newX=curX; newY=curY; actX=curX;actY=curY;
actW=newW=curW; actH=newH=curH;
active=1;
if(collision(box)) return 0;
putNewBox();
draw(); MESSAGE=0;
return 1;
}

void lineFull()
{
int row,col, rowEnd,full,i,j;
rowEnd=newY+newH;
if(rowEnd>=MAXY-1) rowEnd=MAXY-2;
for(row=newY; row<=rowEnd;)
{
full=1;
for(col=0;col<MAXX;col++)
if(!area[row][col]){full=0; break;}
if(!full){++row; continue;}
for(j=row; j<MAXY-1;j++)
for(i=0;i<MAXX;i++)
area[j][i]=area[j+1][i];
actX=0;actY=row; actW=MAXX-1; actH=MAXY-1-row;
draw(); rowEnd--;
}
MESSAGE=mGEN;
}

void draw()
{
int row,col,x1,y1,x2,y2;
for(row=actY;row<=actY+actH;row++)
for(col=actX;col<=actX+actW;col++)
if(area[row][col]!=oldarea[row][col])
{
if(area[row][col]==0)
setfillstyle(SOLID_FILL,BACKCOLOR);
else
setfillstyle(SOLID_FILL,FORCOLOR);

x1=AREAX+col*BOXW; x2=x1+BOXW;
y1=AREAY-(row+1)*BOXW; y2=y1+BOXW;
bar(++x1,++y1,--x2,--y2);
oldarea[row][col]=area[row][col];
}

MESSAGE=0;
}

int moveLeft()
{
newX=curX-1; clearOldBox();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return 0;
}
putNewBox();
actW=curW+1; actX=curX=newX;
MESSAGE=mDRAW;
return 1;
}

int moveRight()
{
newX=curX+1; clearOldBox();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return 0;
}
putNewBox();
actW=curW+1; actX=curX; curX=newX;
MESSAGE=mDRAW;
return 1;
}

int moveDown()
{
int i,j;
newY=curY-1;
clearOldBox();
if(collision(box))
{
newY=curY;
putNewBox();
active=0;
MESSAGE=mLINE;
return 0;
}
putNewBox();
actH=curH+1; actY=newY; curY=newY;
MESSAGE=mDRAW;
return 1;
}

int rotate()
{
int newBox[4][4];
int i,j;
clearOldBox();

for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[j][i]=0;

for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[curW-i][j]=box[j][i];
newW=curH; newH=curW;
if(collisionRotate(newBox))
{
newW=curW; newH=curH; newX=curX; newY=curY;
putNewBox();
MESSAGE=0;
return 0;
}

for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=newBox[j][i];
putNewBox();
actH=newH>curH? newH:curH;
actW=curX+actH-newX;
actX=newX; actY=newY; curX=newX;
curY=newY; curW=newW; curH=newH;
MESSAGE=mDRAW;
return 1;
}

int getW()
{
int i,j;
for(i=3;i>0;i--)
for(j=0;j<4;j++)
if(box[j][i]) return i;
return 0;
}

int getH()
{
int i,j;
for(j=3;j>0;j--)
for(i=0;i<4;i++)
if(box[j][i]) return j;
return 0;
}


void clearOldBox()
{
int i,j;
for(j=0;j<=curH; j++)
for(i=0;i<=curW; i++)
if(box[j][i])
area[curY+j][curX+i]=0;
}

void putNewBox()
{
int i,j;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(box[j][i])
area[newY+j][newX+i]=FORCOLOR;
}

int collision(int cbox[][4])
{
int i,j;
if(newX<0) return 1;
if(newX+newW>=MAXX) return 1;
if(newY<0) return 1;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(area[newY+j][newX+i]&&cbox[j][i]) return 1;
return 0;
}

int collisionRotate(int cbox[][4])
{
int i,j;
if(newX+newW>=MAXX) newX=MAXX-1-newW;
if(newY+newH>=MAXY) newY=MAXY-1-newH;
if(collision(cbox)) return 1;
for(i=0;i<=newW;i++)
for(j=0;j<=newH;j++)
if(area[newY+j][newX+i])
{
newX-=newW-i+1; goto L;
}
L: return collision(cbox);
}

int gameOver()
{
if(!active &&(curY+curH>MAXY-3)) return 1;
else return 0;
}
\u5305\u4f60\u80fd\u73a9\uff0c\u4e0d\u80fd\u73a9\u6211\u8d54\u94b1\u3002

N = 20;//行数

WIDTH = 20;//方块边长

level = 0;//开始等级(下落速度)

ret = new Array();//当前出现的方块

nextret = new Array();//下一个出现的方块

bg = new Array();//背景数组

createEmptyMovieClip("panel", 1048575);//所有方块都在此mc里

for (i = 0; i < 5; i++) {

//初始化方块数组,2*5格式,前四行代表每个方块的4个小块的位置坐标,最后一行第一列是方块形状,第二列是方块旋转方向

ret.push(new Array(2));

nextret.push(new Array(2));

}

for (i = 0; i < 20; i++) {//初始化背景数组,10*20格式

bg.push(new Array(10));

}

X = Y = panel._x = panel._y = 0;//换为X、Y表示

function reach(x:Number, y:Number, ret:Object) {

//x、y为方块位置,ret为方块形状,若方块ret下落一格碰到边界或者方块返回1

var i:Number, j:Number, k:Number;

for (i = 0; i < N; i++) {

for (j = 0; j < 10; j++) {

if (bg[i][j] == 219) {

for (k = 0; k < 4; k++) {

if (x + ret[k][0] == j && y + ret[k][1] + 1 == i) {

return 1;

}

}

}

}

}

return 0;

}

function lrnotout(lorr:Number, a:Object) {

//lorr==-1代表a往左边一格可行性的判断,lorr==1代表右边一格可行性的判断,lorr==0代表a的位置合理性的判断,出现不合理则返回0

var i:Number;

if (lorr == -1) {

for (i = 0; i < 4; i++) {

if (x + a[i][0] - 1 < 0 || reach(x - 1, y - 1, a)) {

return 0;

}

}

}

if (lorr == 1) {

for (i = 0; i < 4; i++) {

if (x + a[i][0] + 1 > 9 || reach(x - 1, y + 1, a)) {

return 0;

}

}

}

if (lorr == 0) {

for (i = 0; i < 4; i++) {

if (x + a[i][0] < 0 || x + a[i][0] > 9) {

return 0;

}

}

}

return 1;

}

function rv(a:Object, ret:Object) {

//方块赋值,将a方块赋值到ret方块

var i:Number;

for (i = 0; i < 5; i++) {

ret[i][0] = a[i][0], ret[i][1] = a[i][1];

}

}

function rotate(ret:Object) {

//根据方块ret最后一行(分别是形状指示变量和旋转方向变量)为ret的前四行赋以具体形状值

switch (ret[4][0]) {

case 0 ://方形

a = [[1, 0], [2, 0], [1, 1], [2, 1], [0, 0]];

rv(a, ret);

return;

case 1 ://长形

switch (ret[4][1]) {

case 1 :

a = [[0, 0], [1, 0], [2, 0], [3, 0], [1, 0]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 0 :

a = [[1, 0], [1, 1], [1, 2], [1, 3], [1, 1]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

}

case 2 ://Z形

switch (ret[4][1]) {

case 1 :

a = [[0, 1], [1, 1], [1, 2], [2, 2], [2, 0]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 0 :

a = [[2, 0], [1, 1], [2, 1], [1, 2], [2, 1]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

}

case 3 ://反Z形

switch (ret[4][1]) {

case 1 :

a = [[1, 1], [2, 1], [0, 2], [1, 2], [3, 0]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 0 :

a = [[1, 0], [1, 1], [2, 1], [2, 2], [3, 1]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

}

case 4 ://T形

switch (ret[4][1]) {

case 3 :

a = [[1, 0], [0, 1], [1, 1], [2, 1], [4, 0]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 0 :

a = [[1, 0], [0, 1], [1, 1], [1, 2], [4, 1]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 1 :

a = [[0, 1], [1, 1], [2, 1], [1, 2], [4, 2]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 2 :

a = [[1, 0], [1, 1], [2, 1], [1, 2], [4, 3]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

}

case 5 ://倒L形

switch (ret[4][1]) {

case 3 :

a = [[1, 0], [2, 0], [1, 1], [1, 2], [5, 0]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 0 :

a = [[0, 1], [0, 2], [1, 2], [2, 2], [5, 1]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 1 :

a = [[2, 0], [2, 1], [1, 2], [2, 2], [5, 2]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 2 :

a = [[0, 1], [1, 1], [2, 1], [2, 2], [5, 3]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

}

case 6 ://L形

switch (ret[4][1]) {

case 3 :

a = [[1, 0], [2, 0], [2, 1], [2, 2], [5, 0]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 0 :

a = [[0, 1], [1, 1], [2, 1], [0, 2], [5, 1]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 1 :

a = [[1, 0], [1, 1], [1, 2], [2, 2], [5, 2]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

case 2 :

a = [[2, 1], [0, 2], [1, 2], [2, 2], [5, 3]];

if (lrnotout(0, a) && !reach(x, y - 1, a)) {

rv(a, ret);

}

return;

}

}

}

function generate(ret:Object) {//随机产生方块函数(可进一步修正)

ret[4][0] = Math.floor(Math.random() * 7);

ret[4][1] = Math.floor(Math.random() * 4);

rotate(ret);//完成方块ret的具体形状的赋值

}

function init() {//初始化背景、方块、运动函数

var i:Number, j:Number;

for (i = 0; i < N; i++) {//初始化背景,边界为219,其余为' '

for (j = 0; j < 10; j++) {

if (i == N - 1) {

bg[i][j] = 219;

} else {

bg[i][j] = ' ';

}

}

}

for (i = 0; i < 5; i++) {//为当前方块赋初值0

ret[i][0] = ret[i][1] = 0;

}

generate(ret);//产生当前方块

generate(nextret);//产生下一个方块

y = 0, x = 3, score = lines = 0, level=0;//当前位置坐标和计分系统初始化

_tetris.removeTextField();//如果从结束过的游戏恢复,删除结束标志

display();//显示画面

frameflag = 0;//标示下落时间间隔

onEnterFrame = function () {

frameflag++;

if (10 - frameflag < level) {//根据等级level确定下落时间间隔

frameflag = 0;

go();//下落及判断

}

};

}

function drawblock(a, b, c, d) {//绘制方块的小块

with (panel) {

beginFill(0x000FFF, 100);

lineStyle(1, 0xFF00FF);

moveTo(panel._x + a, panel._y + b);

lineTo(panel._x + c, panel._y + b);

lineTo(panel._x + c, panel._y + d);

lineTo(panel._x + a, panel._y + d);

lineTo(panel._x + a, panel._y + b);

endFill();

}

}

function erase() {//删除一行方块

var n:Number = 0, i:Number, j:Number, k:Number, l:Number;

for (i = 0; i < N - 1; i++) {

for (j = 0; j < 10; j++) {

if (bg[i][j] == ' ') {//如果该行有空,则开始判断下一行

i++, j = -1;

if (i == N - 1) {//行N-1为底线,不判断

break;

}

} else if (j == 9) {//判断到该行最后一列都没有空

for (k = i; k >= 1; k--) {//上方方块下落

for (l = 0; l < 10; l++) {

bg[k][l] = bg[k - 1][l];

}

}

for (l = 0; l < 10; l++) {//删除该行

bg[0][l] = ' ';

}

n++;//此次删除行数变量增一

if ((lines + n) % 30 == 0) {//删除行数总数到30的倍数则等级上升

level = (level + 1) % 10;

}

}

}

}

lines += n, score += (n * n + n) * 50;//总行数增n,计算得分

}

function display() {

//显示函数,采用全部清除再重绘制的方法(因为这个程序本来是在Turbo C 2.0的文本环境下完成的)

var i:Number, j:Number;

panel.clear();

with (panel) {//画边界

lineStyle(1, 0x0000FF);

moveTo(panel._x, panel._y);

lineTo(panel._x + WIDTH * 10, panel._y);

lineTo(panel._x + WIDTH * 10, panel._y + WIDTH * (N - 1));

lineTo(panel._x, panel._y + WIDTH * (N - 1));

lineTo(panel._x, panel._y);

}

for (i = 0; i < 4; i++) {//当前方块占据的地方赋值为边界类型219

bg[y + ret[i][1]][x + ret[i][0]] = 219;

}

for (i = 0; i < N - 1; i++) {//绘制背景方块

for (j = 0; j < 10; j++) {

if (bg[i][j] == 219) {

drawblock(j * WIDTH + X, i * WIDTH + Y, j * WIDTH + WIDTH + X, i * WIDTH + WIDTH + Y);

}

}

}

for (i = 0; i < 4; i++) {//绘制当前方块

drawblock(nextret[i][0] * WIDTH + 14 * WIDTH + X, nextret[i][1] * WIDTH + 12 * WIDTH + Y, nextret[i][0] * WIDTH + WIDTH + 14 * WIDTH + X, nextret[i][1] * WIDTH + WIDTH + 12 * WIDTH + Y);

}

for (i = 0; i < 4; i++) {//当前方块绘制完毕,重新将当前位置改为' '

bg[y + ret[i][1]][x + ret[i][0]] = ' ';

}

createTextField("_lvltxt", 1, 270, 100, 100, 20);//绘制计分系统

createTextField("_scrtxt", 2, 270, 130, 100, 20);

createTextField("_lnstxt", 3, 270, 160, 100, 20);

_lvltxt.text = "Level: " + level;

_scrtxt.text = "Score: " + score;

_lnstxt.text = "Lines: " + lines;

}

function go() {//下落函数

var sss:Number = reach(x, y, ret);//当前方块下落一格是否碰到边界或方块

var ii:Number;

if (!sss) {

y++;//如果当前方块下落一格没有碰到边界或方块则下落一格

}

display();//重新绘制

if (sss) {//碰到边界或方块

score += 10;//得10分

display();//重新绘制

for (ii = 0; ii < 4; ii++) {//修改背景数组,将当前方块的位置改为边界类型

bg[y + ret[ii][1]][x + ret[ii][0]] = 219;

}

erase();//删除行判断及执行

rv(nextret, ret);//将下一个方块赋值为当前方块

y = 0, x = 3;//重置方块位置

generate(nextret);//生成下一个方块

display();//重新绘制

if (reach(x, y, ret)) {//如果下一格碰到方块则游戏结束

createTextField("_tetris", 100000, WIDTH * 3.3, WIDTH * N / 3, 70, 20);

_tetris._x += 200;

_tetris._y += 50;

_tetris._xscale = 300;

_tetris._yscale = 300;

_tetris.background = true;

_tetris.text = "Game Over!";

onEnterFrame = function () {//停止下落

};

}

}

}

function key() {

if (Key.isDown(Key.UP)) {

rotate(ret);

display();

}

if (Key.isDown(Key.LEFT)) {

if (lrnotout(-1, ret)) {//左移可行性判断

x--;

display();

}

}

if (Key.isDown(Key.RIGHT)) {

if (lrnotout(1, ret)) {//右移可行性判断

x++;

display();

}

}

if (Key.isDown(Key.DOWN)) {//键盘控制下落

go();

}

if (Key.isDown(Key.SPACE)) {//一键下落到底

while (!reach(x, y, ret)) {

y++;

}

go();

}

if (Key.isDown(82)) { //重新开始游戏

init();

}

}

init();//初始化

setInterval(key, 80);//每个80毫秒执行一次键盘事件函数

createTextField("hinttxt",33324,200,20,300,50);

hinttxt.text="键盘键:上,下,左,右,R(reset),空格";

 

 

 



要求还挺高啊、、、小样

  • pic18f452鐨勪縿缃楁柉鏂瑰潡c璇█绋嬪簭
    绛旓細{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; // T// 瀹氫箟褰撳墠鏂瑰潡銆佷笅涓涓柟鍧鐨勪俊鎭 struct BLOCKINFO { byte id; // 鏂瑰潡 ID char x, y; // 鏂瑰潡鍦ㄦ父鎴忓尯涓殑鍧愭爣 byte dir:2; // 鏂瑰悜 } g_CurBlock, g_NextBlock;// 瀹氫箟娓告垙鍖 BYTE g_World[WIDTH][HEIGHT] = {0}; ...
  • 姹備竴浠鐢–璇█缂栧啓鐨勪縿缃楁柉鏂瑰潡鐨勬簮浠g爜!
    绛旓細姹備竴浠鐢–璇█缂栧啓鐨勪縿缃楁柉鏂瑰潡鐨勬簮浠g爜! 涓轰粈涔堝湪c-free閲岄潰璋冭瘯,#include<graphics.h>杩欎竴鍙ラ兘鏄湁闂殑鍟?杩樻湁#include<bios.h>杩欎釜涔熸槸鏈夐棶棰樼殑?... 涓轰粈涔堝湪c-free閲岄潰璋冭瘯,#include <graphics.h>杩欎竴鍙ラ兘鏄湁闂殑鍟?杩樻湁#include <bios.h> 杩欎釜涔熸槸鏈夐棶棰樼殑? 灞曞紑  鎴戞潵绛 5涓洖绛 #鐑#...
  • #楂樻墜寰杩欑湅#鐢╟璇█缂栧啓淇勭綏鏂柟鍧浠g爜,瑕佽兘鍦╟odeblocks涓婅繍琛...
    绛旓細#楂樻墜寰杩欑湅#鐢╟璇█缂栧啓淇勭綏鏂柟鍧浠g爜,瑕佽兘鍦╟odeblocks涓婅繍琛岀殑銆 100  鎴戞潵绛 3涓洖绛 #璇濋# 鎵撳伐浜虹殑鈥滄儴鈥濊皝鏄姜榄佺ジ棣?鍖垮悕鐢ㄦ埛 2020-06-30 灞曞紑1鍏ㄩ儴 main.c閲岄潰#include <stdio.h>#include <stdlib.h>#include "fangkuai.h"#include int main(){Manager manager;Control control;init...
  • c璇█ 缂栧啓淇勭綏鏂柟鍧鐨勭▼搴 瑕佹眰鏈夎缁嗙殑涓枃娉ㄩ噴
    绛旓細c璇█ 缂栧啓淇勭綏鏂柟鍧鐨勭▼搴 瑕佹眰鏈夎缁嗙殑涓枃娉ㄩ噴 鏈濂芥湁娴佺▼鍥惧姞涓枃娉ㄩ噴瓒婅灏借秺濂芥湰浜烘槸鍒濆鑰呭お闅句篃鐪嬩笉鎳傜畝鍗曠偣灏卞ソ鎷滄墭鍚勪綅楂樻墜鍟..濡傛灉婊℃剰浼氳拷鍔100鍒... 鏈濂芥湁娴佺▼鍥 鍔犱腑鏂囨敞閲 瓒婅灏借秺濂 鏈汉鏄垵瀛﹁ 澶毦涔熺湅涓嶆噦 绠鍗曠偣灏卞ソ 鎷滄墭鍚勪綅楂樻墜鍟..濡傛灉婊℃剰浼氳拷鍔100鍒 灞曞紑  鎴戞潵绛 4涓...
  • c璇█淇勭綏鏂柟鍧浠g爜
    绛旓細#define VK_ESC 0x011b #define VK_ENTER 0x1c0d /* 瀹氫箟淇勭綏鏂柟鍧鐨勬柟鍚(鎴戝畾涔変粬涓4绉)*/ #define F_DONG 0 #define F_NAN 1 #define F_XI 2 #define F_BEI 3 #define NEXTCOL 20 /* 瑕佸嚭鐨勪笅涓涓柟鍧楃殑绾靛潗鏍*/ #define NEXTROW 12 /* 瑕佸嚭鐨勪笅涓涓柟鍧楃殑妯粠鏍*/ #define MAX...
  • 鐢╟璇█缂栧啓淇勭綏鏂柟鍧绋嬪簭 姹傝瑙
    绛旓細姣忎竴涓瓧鑺傛槸8浣嶏紝鐢ㄦ瘡4浣嶈〃绀烘柟鍧椾腑鐨勪竴琛)unsigned int rockShapeBits ;int nextRockIndex ; //涓涓涓柟鍧锛屽湪鏁扮粍涓殑涓嬫爣 } RockType ;杩欐牱锛屽綋鎴戜滑鎸変笅涓婃柟鍚戦敭鏃讹紝鎶婁紶鍏ュ嚱鏁癉rawRock涓殑rockIndex鍙樹负褰撳墠鏂瑰潡缁撴瀯浣撲腑鐨刵extRockIndex鍗冲彲銆傚弬鑰冭祫鏂欙細C璇█鍥惧舰鐣岄潰绡 ...
  • 淇勭綏鏂柟鍧梒璇█鐨浠g爜
    绛旓細淇勭綏鏂柟鍧梒璇█鐨浠g爜 闄や簡绠鍗曠殑鍩烘湰瑕佹眰澶栬繕鏈:1.骞冲彴vc6.02.鑳藉瀹炵幇璁╂柟鍧椾笂鏈夋垜鎯宠鎹㈢殑鐓х墖3.鑳藉鎻掑叆鎴戞兂瑕佽缃殑澹伴煶甯屾湜2鍜3杩欎袱鐐瑰鐨勪唬鐮佷笂娓歌缁嗙殑瑙i噴... 闄や簡绠鍗曠殑鍩烘湰瑕佹眰澶栬繕鏈:1.骞冲彴vc6.0 2.鑳藉瀹炵幇璁╂柟鍧椾笂鏈夋垜鎯宠鎹㈢殑鐓х墖 3.鑳藉鎻掑叆鎴戞兂瑕佽缃殑澹伴煶 甯屾湜2鍜3杩欎袱鐐瑰鐨勪唬鐮佷笂娓歌缁...
  • 瀵绘眰c璇█鐗鐨勪縿缃楁柉鏂瑰潡绋嬪簭
    绛旓細c=bioskey(1); if(c!=0) c=bioskey(0); } main() { int dotx[4],doty[4],score; /*dotx[]doty[]琛ㄧず涓涓柟鍧涓偣鐨勫潗鏍*/ int ddx,ddy; int rzt1,rzt2,i,u,t=1; int a[5],b[11],o,p,an,bn; int rotx[4],roty[4],spd=0; begin: system("cls"); /*娓告垙鍒濆鍖栭樁娈*/ ...
  • 姹備釜鑳藉湪VC涓嬭繍琛鐨勪縿缃楁柉鏂瑰潡鐨C璇█浠g爜,涓嶇敤GRAPHIC鐨勫ご鏂囦欢鐨
    绛旓細鍥炵瓟锛氫笅杞芥枃浠:VC 淇勭綏鏂柟鍧绋嬪簭婧愮爜.rar| 浣犲ソ!! 甯屾湜鑳藉府鍒颁綘,婊℃剰璇烽噰绾
  • 鎬ユ眰VC6.0涓鐢–璇█缂栧啓鐨勪縿缃楁柉鏂瑰潡鐨勬簮浠g爜,鎬!!!
    绛旓細{0,1,1,0,1,1}, {0,-1,1,0,1,-1}, {-1,0,0,-1,-1,-1}, {-1,0,-1,1,0,1},{0,1,0,2,0,3}, {1,0,2,0,3,0}, {0,-1,0,-2,0,-3}, {-1,0,-2,0,-3,0} };void gotoxy(int x,int y){//gotoxy鍦═C涓槸鍦╯ystem.h搴撴枃浠堕噷鐨勪竴涓嚱 COORD c;...
  • 扩展阅读:免费版俄罗斯方块下载 ... 俄罗斯方块怀旧版免费 ... 俄罗斯方块全免费 ... 俄罗斯方块经典版 ... 俄罗斯方块游戏免费版 ... 俄罗斯方块消消乐 ... 俄罗斯方块苹果版下载 ... 俄罗斯转盘带套吗 ... 俄罗斯方块怎么玩 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网