俄罗斯方块的c语言基本实现
来源:互联网 发布:安卓应用商店 知乎 编辑:程序博客网 时间:2024/05/01 02:01
大二写的小游戏,没有完成,但大体上可以用来了,也厚颜无耻的贴上来了。
部分显示的函数c里面好像没有(也可能是我不知道),需要建立cpp文件。
需要要建立cpp文件。
代码如下:
#include<stdio.h>#include<conio.h>#include<time.h>#include<stdlib.h>#include<string.h>#include<windows.h>HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);/*---------------------结构体声明-----------------------*//*组成单元结构体*/typedef struct cell{ int color; int state; int style; int event;} unit;/*位置结构体*/typedef struct location{ int i; int j;} place;/*----------------------全局变量------------------------*/int longth=24,high=23,x0=0,y0=0,xs=0,ys=0,color=240,jmax=0,imax=0,pmax=0,xn=0,yn=0,scoremax=0,score=0,speed=600;unit now,*p=NULL;place w[5];unit ready,nowone;/*----------------------函数声明------------------------*/void textcolor(int color); /*字体颜色*/void gotoxy(int x, int y); /*移动光标*/void ycgb(void); /*隐藏光标*/void xsgb(void); /*显示光标*/void qk(void); /*无回显清空函数*/void window(int color, int xw, int yw, int longth, int hight); /*界面函数*/int rand(int r_min,int r_max); /*返回随机数*/void clean(unit* u0,int color); /*单元清零*/unit* c(int i,int j); /*二维转一维地址*/int ts(int i,int j); /*数组到屏幕坐标转换*/int eliminate(void); /*判断并消去一行*/void nowscreen(void); /*显示当前情形*/void newobject(void); /*创建下落物体*/void clc(void); /*还原原选定元素的值并从屏幕中清除*/void fz(void); /*给新的选定元素赋值并在屏幕上显示*/int change(void); /*对当前数组中的形状进行变换*/void mainchange(void); /*判断并变形*/int goleft(void); /*向左移动*/int goright(void); /*向右移动*/void stop(void); /*停止本次下落*/int fall(void); /*下落*/void cleanall(void); /*全部清零*/int judge(void); /*游戏判断*/int appear(void); /*赋值当前物块的位置并显示*/void check(void); /*辅助纠错函数*/void begain(void); /*开始界面*//*----------------------辅助函数------------------------*//*字体颜色*/void textcolor(int color){ SetConsoleTextAttribute(hOutput, color);}/*移动光标*/void gotoxy(int x, int y){ COORD coordScreen = {0, 0}; coordScreen.X = x; coordScreen.Y = y; SetConsoleCursorPosition(hOutput, coordScreen);}/*隐藏光标*/void ycgb(void){ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut, &cci); cci.bVisible = FALSE; SetConsoleCursorInfo(hOut, &cci);}/*显示光标*/void xsgb(void){ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut, &cci); cci.bVisible = 1; SetConsoleCursorInfo(hOut, &cci);}/*无回显清空函数*/void qk(void){ while (_kbhit()) { getch(); } return ;}/*返回随机数*/int rand(int r_min,int r_max){ int r=(int)((r_max+1-r_min)* rand() / (RAND_MAX*1.0)); return r+r_min;}/*二维转一维地址*/unit* c(int i,int j){ return p+i*jmax+j;}/*数组到屏幕坐标转换*/int ts(int i,int j){ if(i<=3) return 0; xs=j*2+x0+2; ys=i-4+y0+1; return 1;}/*判断并消去一行*/int eliminate(void){ int i=0,j=0,k=0,scorebefore=score; for(i=imax-1; i>=0; i--) { for(j=0; j<jmax; j++) { if(c(i,j)->state!=-1) break; } if(j==jmax) { ++score; for(k=i; k>0; --k) { for(j=0; j<jmax; j++) *c(k,j)=*c(k-1,j); } for(j=0; j<jmax; j++) clean(c(0,j),color); ++i; } } if(score>scoremax) scoremax=score; return scorebefore-score;}/*还原原选定元素的值并从屏幕中清除*/void clc(void){ int k=0; textcolor(color); for(k=1; k<5; k++) //还原原选定元素的值 { clean(c(w[k].i,w[k].j),color); if(w[k].i>=4) { ts(w[k].i,w[k].j); gotoxy(xs,ys); printf(" "); } } return ;}/*给新的选定元素赋值并在屏幕上显示*/void fz(void){ int k=0; textcolor(nowone.color); for(k=1; k<5; k++) { *c(w[k].i,w[k].j)=nowone; if(w[k].i>=4) { ts(w[k].i,w[k].j); gotoxy(xs,ys); printf("█"); } } return ;}/*对当前数组中的形状进行变换,基本坐标关于判断的标准 1.变形后最右方元素是否发生数组越界 2.四个方块将要所在的位置是否可用w[0].j<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j)->state>=0关于赋值:四个全部赋值注意不要在此基础之上做无把握的化简优化,否则将影响其它功能。 w[1].i=w[0].i; w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j; w[3].i=w[0].i; w[3].j=w[0].j; w[4].i=w[0].i; w[4].j=w[0].j; */int change(void){ int style=0,k=0; if(nowone.state==1) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0) { nowone.style=style=1; clc(); w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j; w[4].i=w[0].i-1; w[4].j=w[0].j+1; fz(); return 1; } } else if(nowone.state==2) { if(nowone.style==1) style=2; else if(nowone.style==2) style=1; if(style==1) //长条1:竖 { if(w[0].j<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-2,w[0].j)->state>=0&&c(w[0].i-3,w[0].j)->state>=0) //判断上方是否空间足够 { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 for(k=1; k<=4; k++) //选定新的元素 { w[k].i=w[0].i-k+1; w[k].j=w[0].j; } fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //长条2:横条 { if(w[0].j+3<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i,w[0].j+3)->state>=0) //判断右方空间是否足够 { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 for(k=1; k<=4; k++) //选定新的元素 { w[k].i=w[0].i; w[k].j=w[0].j+k-1; } fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==3) { if(nowone.style==1) style=2; else if(nowone.style==2) style=1; if(style==1) //z型1:左 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i; w[2].j=w[0].j+2; w[3].i=w[0].i-1; w[3].j=w[0].j; w[4].i=w[0].i-1; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //z型2:上 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==4) { if(nowone.style==1) style=2; else if(nowone.style==2) style=1; if(style==1) //s型1:右 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //s型2:上 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else { style=nowone.style; ++style; if(style>4) style=1; if(nowone.state==5) //凸形 { if(style==1) //凸形1:上 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i; w[3].j=w[0].j+2; w[4].i=w[0].i-1; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) ////凸形2:右 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==3) //凸形3:下 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==4) //凸形4:左 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==6) //左L形 { if(style==1) //左L形1:左 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //左L形2:正躺 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i; w[3].j=w[0].j+2; w[4].i=w[0].i-1; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==3) //左L形3:向下 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-2,w[0].j)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-2; w[3].j=w[0].j; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==4) //左L形4:倒躺 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+2; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==7) //右L形 { if(style==1) //右L形1:向上 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-2,w[0].j)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j; w[4].i=w[0].i-2; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //右L形2:倒躺 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==3) //右L形3:向下 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j+1; w[3].i=w[0].i-2; w[3].j=w[0].j; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==4) //右L形4:正躺 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { nowone.style=style; //更改形式 clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i; w[3].j=w[0].j+2; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } } return 0;}/*赋值当前物块的位置并显示*/int appear(void){ int k=0,style=nowone.style; if(nowone.state==1&&nowone.style==1) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0) { clc(); w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j; w[4].i=w[0].i-1; w[4].j=w[0].j+1; fz(); return 1; } } else if(nowone.state==2) { if(style==1) //长条1:竖 { if(w[0].j<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-2,w[0].j)->state>=0&&c(w[0].i-3,w[0].j)->state>=0) //判断上方是否空间足够 { clc(); //还原原选定元素的值并在屏幕上清除 for(k=1; k<=4; k++) //选定新的元素 { w[k].i=w[0].i-k+1; w[k].j=w[0].j; } fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //长条2:横条 { if(w[0].j+3<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i,w[0].j+3)->state>=0) //判断右方空间是否足够 { clc(); //还原原选定元素的值并在屏幕上清除 for(k=1; k<=4; k++) //选定新的元素 { w[k].i=w[0].i; w[k].j=w[0].j+k-1; } fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==3) { if(style==1) //z型1:左 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i; w[2].j=w[0].j+2; w[3].i=w[0].i-1; w[3].j=w[0].j; w[4].i=w[0].i-1; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //z型2:上 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==4) { if(style==1) //s型1:右 { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) //s型2:上 { if(w[0].j+1<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else { style=nowone.style; if(nowone.state==5) { if(style==1) { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i; w[3].j=w[0].j+2; w[4].i=w[0].i-1; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==3) { if(w[0].j+2<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==4) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==6) { if(style==1) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i; w[3].j=w[0].j+2; w[4].i=w[0].i-1; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==3) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-2,w[0].j)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-2; w[3].j=w[0].j; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==4) { if(w[0].j+2<jmax&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+2; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } else if(nowone.state==7) { if(style==1) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-2,w[0].j)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i-1; w[3].j=w[0].j; w[4].i=w[0].i-2; w[4].j=w[0].j; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==2) { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i-1,w[0].j)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i-1; w[2].j=w[0].j; w[3].i=w[0].i-1; w[3].j=w[0].j+1; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==3) { if(w[0].j+1<jmax&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i-1,w[0].j+1)->state>=0&&c(w[0].i-2,w[0].j)->state>=0&&c(w[0].i-2,w[0].j+1)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j+1; w[2].i=w[0].i-1; w[2].j=w[0].j+1; w[3].i=w[0].i-2; w[3].j=w[0].j; w[4].i=w[0].i-2; w[4].j=w[0].j+1; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } else if(style==4) { if(w[0].j+2<jmax&&c(w[0].i,w[0].j)->state>=0&&c(w[0].i,w[0].j+1)->state>=0&&c(w[0].i,w[0].j+2)->state>=0&&c(w[0].i-1,w[0].j+2)->state>=0) { clc(); //还原原选定元素的值并在屏幕上清除 w[1].i=w[0].i; //选定新的元素 w[1].j=w[0].j; w[2].i=w[0].i; w[2].j=w[0].j+1; w[3].i=w[0].i; w[3].j=w[0].j+2; w[4].i=w[0].i-1; w[4].j=w[0].j+2; fz(); //给新的选定元素赋值并在屏幕上显示 return 1; } } } } return 0;}/*游戏主体*/void maingame(){ int i=0,j=0,str=0; long time=clock(); cleanall(); appear(); while(1) { if(clock()-time>speed) //clock()%speed==0 { time=clock(); //check(); if(fall()) { eliminate(); //getchar(); nowscreen(); //刷新屏幕 if(judge()==-1) { gotoxy(0,23); textcolor(color); printf("You Lost!"); return ; } nowone=ready; newobject(); if(appear()==0) { gotoxy(0,23); textcolor(color); printf("You Lost!"); return ; } } // 等级判断 显示预判图形 } else { if(_kbhit()) { str=getch(); if(str==224) { str=getch(); if(str==72) //方向键上: 变形 { mainchange(); } else if(str==80) //方向键下:快速下落 { if(fall()) { eliminate(); nowscreen(); if(judge()==-1) { gotoxy(0,23); textcolor(color); printf("You Lost!"); return ; } nowone=ready; newobject(); if(appear()==0) { gotoxy(0,23); textcolor(color); printf("You Lost!"); return ; } } } else if(str==75) //方向键左:向左移动 { goleft(); } else if(str==77) //方向键右:向右移动 { goright(); } } else if(str=='\r') //回车暂停 { getch(); } else if(str==' ') //直接下落 { while(!fall()); eliminate(); nowscreen(); if(judge()==-1) { gotoxy(0,23); textcolor(color); printf("You Lost!"); return ; } nowone=ready; newobject(); if(appear()==0) { gotoxy(0,23); textcolor(color); printf("You Lost!"); return ; } } else if(str==27) //ESC:退出 { return ; } else if(str=='c'||str=='C') //C键纠错帮助:查看数组以及此时关键变量的值 { check(); } else if(str=='s'||str=='S') //S键纠错帮助:查看此时真正应显示的结果 { nowscreen(); getch(); } else if(str=='r'||str=='R') //R键 { cleanall(); appear(); str=0; } } //check(); } } return ;}/*创建下落物体*/void newobject(void){ unit newone; newone.color=rand(240,254); newone.event=0; //后期可添加功能的项 newone.state=rand(1,7); if(newone.state==1) { newone.style=1; } else if(newone.state==2||newone.state==3||newone.state==4) { newone.style=rand(1,2); } else if(newone.state==5||newone.state==6||newone.state==7) { newone.style=rand(1,4); } /* w.i=3; w.j=(jmax-1)/2; */ ready=newone; return ;}/*判断并变形*/void mainchange(void){ int style=0,l=0,k=0,jbefore=0; jbefore=w[0].j; if(nowone.state==1) { change(); } else if(nowone.state==2) { if(nowone.style==1&&w[0].j>=jmax-3&&w[0].j<=jmax-1) { w[0].j=jmax-4; if(!change()) { w[0].j=jbefore; } } else { change(); } } else if(nowone.state>=3&&nowone.state<=7) { if(w[0].j==jmax-2) { --w[0].j; if(!change()) { ++w[0].j; } } else { change(); } } return ;}/*向左移动*/int goleft(void){ int i=0; if(w[0].j>0&&c(w[1].i,w[1].j-1)->state>=0&&c(w[2].i,w[2].j-1)->state>=0&&c(w[3].i,w[3].j-1)->state>=0&&c(w[4].i,w[4].j-1)->state>=0) { clc(); for(i=0; i<5; i++) --w[i].j; fz(); return 1; } return 0;}/*向右移动*/int goright(void){ int i=0; if(w[0].j+1>=jmax) return 0; for(i=1; i<5; i++) { if(w[i].j+1>=jmax||c(w[i].i,w[i].j+1)->state<0) return 0; } clc(); for(i=0; i<5; i++) ++w[i].j; fz(); return 1;}/*停止本次下落*/void stop(void){ int i=0; for(i=1; i<=4; i++) { c(w[i].i,w[i].j)->state=-1; } w[0].i=4; w[0].j=(jmax-1)/2; for(i=1; i<5; i++) w[i]=w[0]; return ;}/*下落*/int fall(void){ int i=0; if(w[0].i+1>=imax) { stop(); return 1; } for(i=1; i<5; i++) { if(w[i].i+1>=imax||c(w[i].i+1,w[i].j)->state<0) break; } if(i<5) { stop(); return 1; } else { clc(); for(i=0; i<5; i++) { ++w[i].i; } fz(); return 0; }}/*游戏判断*/int judge(void){ int i=0,j=0; for(i=0; i<4; i++) for(j=0; j<jmax; j++) if(c(i,j)->state==-1) return -1; return 0;}/*----------------------图形函数------------------------*//*界面函数. 为了显示效果,宽度longth需使用偶数,高度不应超过23. 使用范例: window(240, 10, 0, 30,23); window(240, 40, 0, 16,10); window(240, 40, 10, 16,13); */void window(int color, int xw, int yw, int longth, int high){ int i = 0, j = 0; ycgb(); textcolor(191); //textcolor(color); /* gotoxy(xw, yw); printf("┏"); for (i = 0; i < (longth - 4) / 2; i++) { printf("━"); } printf("┓"); */ for (j = 0; j < high - 2; j++) { textcolor(191); gotoxy(xw, yw + j + 1); printf("┃"); textcolor(color); for (i = 0; i < longth - 4; i++) { printf(" "); } textcolor(191); printf("┃"); } textcolor(251); gotoxy(xw, yw + j + 1); printf("┗"); for (i = 0; i < (longth - 4) / 2; i++) { printf("━"); } printf("┛"); gotoxy(0, 0); return ;}/*单元清零*/void clean(unit* u0,int color){ u0->color=color; u0->event=0; u0->state=0; u0->style=0;}/*全部清零*/void cleanall(void){ int i=0,j=0; score=0; textcolor(240); system("cls"); window(color, x0, y0, longth, high); for(i=0; i<imax; i++) for(j=0; j<jmax; j++) { clean(c(i,j),color); } w[0].i=4; w[0].j=(jmax-1)/2; for(i=1; i<5; i++) { w[i]=w[0]; } newobject(); nowone=ready; newobject(); return ;}/*显示当前情形*/void nowscreen(void){ int i=0,j=0; for(i=4; i<imax; i++) { for(j=0; j<jmax; j++) { ts(i,j); gotoxy(xs,ys); if(c(i,j)->state!=0) { textcolor(c(i,j)->color); //if(c(i,j)->color==color) //printf("■"); printf("█"); //getchar(); } else { textcolor(color); printf(" "); } } } //gotoxy(22,8); //printf(" state=%d color=%d style=%d event=%d",c(23,5)->state,c(23,5)->color,c(23,5)->style,c(23,5)->event); return ;}/*辅助纠错函数*/void check(void){ int i,j; gotoxy((jmax+2)*2+2,0); textcolor(240); for(i=0; i<imax; i++) { gotoxy((jmax+2)*2+2,i); printf("[%2d] ",i); for(j=0; j<jmax; j++) printf(" %2d ",c(i,j)->state); } gotoxy((jmax+2)*2+2+6+1,i); for(j=0; j<jmax; j++) printf(" [%d]",j); gotoxy(0,i+1+1); for(i=0; i<5; i++) printf(" w[%d]=[%d %d] ",i,w[i].i,w[i].j); printf("\n\n nowone: state=%2d stytle=%d color=%3d event=%d ",nowone.state,nowone.style,nowone.color,nowone.event); printf("\n\n ready: state=%2d stytle=%d color=%3d event=%d ",ready.state,ready.style,ready.color,ready.event); printf("\n\n w0[%d][%d]: state=%2d stytle=%d color=%3d event=%d ",w[0].i,w[0].j,c(w[0].i,w[0].j)->state,c(w[0].i,w[0].j)->style,c(w[0].i,w[0].j)->color,c(w[0].i,w[0].j)->event); printf("\n\n o[%d][%d]: state=%2d stytle=%d color=%3d event=%d ",4,(jmax-1)/2,c(4,(jmax-1)/2)->state,c(4,(jmax-1)/2)->style,c(4,(jmax-1)/2)->color,c(4,(jmax-1)/2)->event); getch(); return ;}/*开始界面*/void begain(void){ int i=0,j=0,str=0,ch=0; textcolor(248); system("cls"); gotoxy(0,3); for(i=0; i<40; i++) { Sleep(5); printf("━"); } for(i=0; i<23; i++) { gotoxy(20,i); Sleep(i); if(i!=3) printf("┃"); else printf("╋"); } gotoxy(60,2); printf("俄罗斯方块"); gotoxy(66,10); printf("start"); gotoxy(66,13); printf("loading"); gotoxy(66,16); printf("about"); gotoxy(66,19); printf("exit"); getch(); ch=1; gotoxy(66,10); printf("Start"); gotoxy(66,11); for(i=0; i<4; i++) { printf("━"); Sleep(30); } while(1) { str=getch(); if(str==224) { str=getch(); if(str==72) { --ch; if(ch<=0) ch=4; } else if(str==80) { ++ch; if(ch>4) ch=1; } gotoxy(66,10); printf("start"); gotoxy(60,11); printf(" "); gotoxy(66,13); printf("loading"); gotoxy(60,14); printf(" "); gotoxy(66,16); printf("about"); gotoxy(60,17); printf(" "); gotoxy(66,19); printf("exit"); gotoxy(60,20); printf(" "); if(ch==1) { gotoxy(66,10); printf("Start"); gotoxy(66,11); for(i=0; i<4; i++) { printf("━"); Sleep(30); } } else if(ch==2) { gotoxy(66,13); printf("Loading"); gotoxy(66,14); for(i=0; i<4; i++) { printf("━"); Sleep(30); } } else if(ch==3) { gotoxy(66,16); printf("About"); gotoxy(66,17); for(i=0; i<4; i++) { printf("━"); Sleep(30); } } else if(ch==4) { gotoxy(66,19); printf("Exit"); gotoxy(66,20); for(i=0; i<4; i++) { printf("━"); Sleep(30); } } } else if(str=='\r') { gotoxy(60,2); printf(" "); gotoxy(66,10); printf(" "); gotoxy(60,11); printf(" "); gotoxy(66,13); printf(" "); gotoxy(60,14); printf(" "); gotoxy(66,16); printf(" "); gotoxy(60,17); printf(" "); gotoxy(66,19); printf(" "); gotoxy(60,20); printf(" "); for(i=0; i<23; i++) { gotoxy(20,i); Sleep(2); if(i!=3) printf(" "); else printf("━"); } gotoxy(0,3); for(i=0; i<40; i++) { Sleep(1); printf(" "); } textcolor(240); system("cls"); gotoxy(0,0); if(ch==1) { maingame(); } else if(ch==4) { return ; } } } return ;}/*-----------------------主函数-------------------------*/int main(void){ int i=0,j=0; char str; scoremax=0; jmax=(longth-4)/2; imax=high-2+4; pmax=jmax*imax; srand((int)time(0)); ycgb(); p=(unit*)malloc(jmax*imax*sizeof(unit)); begain(); //maingame(); gotoxy(0,23); free(p); return 0;}/*------------------------各种测试参考-----------------------显示三种基本图形printf("┏━┳━┓\n┃ ┃ ┃\n┣━╋━┫\n┃ ┃ ┃\n┗━┻━┛\n██ ■■\n██ ■■\n");制表符┏━┳━┓┃ ┃ ┃┗━┻━┛方块符█■基本形状1 方形 12 长条 23 Z形左 24 Z形右 25 凸形 46 L形左 47 L形右 4 for(i=0; i<imax; i++) { for(j=0; j<jmax; j++) { c(i,j)->color=rand(240,254); c(i,j)->state=1; if(ts(i,j)) { gotoxy(xs,ys); textcolor(c(i,j)->color); //printf("■"); printf("█"); } } Sleep(50); } eliminate(); nowscreen();*/
0 0
- 关于C语言俄罗斯方块的基本实现!
- 俄罗斯方块的c语言基本实现
- C语言实现的俄罗斯方块
- 【C语言】实现俄罗斯方块
- 俄罗斯方块(C语言实现)
- C实现的俄罗斯方块
- 基于VC 6.0 用C语言实现的俄罗斯方块
- C语言写的俄罗斯方块
- C语言编写的俄罗斯方块
- c语言控制台的俄罗斯方块
- C语言写的俄罗斯方块
- 【C语言】俄罗斯方块的源代码
- C语言编写的俄罗斯方块
- c语言实现扫雷和俄罗斯方块
- VC++ 6.0 C语言实现俄罗斯方块教程
- VC++ 6.0 C语言实现俄罗斯方块教程
- C语言之俄罗斯方块游戏实现
- C语言写的俄罗斯方块游戏
- html5结构化标签
- jfinal上传文件
- Eclipse安装Spring插件springsource-tool-suite
- DOM函数
- 在Linux Centos 6.7环境下,通过yum安装mysql。
- 俄罗斯方块的c语言基本实现
- HDU 1877:又一版 A+B【数学】
- LBS推荐系统的设计方法
- 支撑向量机,二次规划问题
- BestCoder #75 C
- 并查集
- Spring依赖注入源码分析
- PythonChallenge Mission 0
- 计蒜课难题题库之泥塑课