友情提示:vc++6.0需要加装easyx库,这是一个图形库(个人认为这个库不错,太适合新手做一些有意思的效果),具体教程见前文,如果没有添加的话,是不能编译运行通过的,也就见不到效果。
#include
#include
#include
#include
#define KEY_DOWN(vk_c)(GetAsyncKeyState(vk_c)&0x8000)
typedef struct position{
int x;
int y;
}posType;
int index;//同色小球的个数
void init();//初始化游戏窗口
void gamebegin();//游戏开始界面
void gameplay();//玩游戏的具体过程
void close();//结束游戏,释放资源
void drawcursor(posType cur,COLORREF c1);//绘制光标
void drawtime(int sec);//绘制时间
void drawscore(int score);//绘制分数
void getsamecolorballs(posType cur,COLORREF c1);//获得光标所在位置周围的同色小球,计算同色小球的个数,并存入数组
int isValid(posType cur,COLORREF c1);//判断同色小球是否合法
void ballsfall();//小球下落
COLORREF colorArr[6]={RGB(200,0,0),RGB(0,200,0),RGB(0,0,200),RGB(200,200,0),RGB(200,0,200),RGB(0,200,200)};
posType cur;//定义当前光标位置
posType ballsArr[180];//同色小球坐标
void main()
{
init();//初始化游戏窗口
gamebegin();//游戏开始界面
gameplay();//玩游戏的具体过程
close();//结束游戏,释放资源
}
void init()
{
initgraph(1000,700);
}
void close()
{
getch();
closegraph();
}
void gamebegin()
{
//绘制游戏边框
setlinecolor(RGB(50,50,50));
setlinestyle(PS_SOLID,10);
rectangle(255,45,745,655);
//绘制小球
srand((unsigned)time(NULL));
setlinestyle(PS_SOLID,1);
for(int x=280;x<740;x+=40)
{
for(int y=70;y<650;y+=40)
{
COLORREF c1=colorArr[rand()%6];
setfillcolor(c1);
setlinecolor(c1);
fillcircle(x,y,18);
}
}
//绘制移动光标
cur.x=480;
cur.y=390;
drawcursor(cur,RGB(255,255,255));
//绘制时间 drawtime(30);
//绘制分数 drawscore(0);
}
void gameplay()
{
int score=0;
for(int i=300;i>0;i--)
{
if(i%10==0)
{
drawtime(i/10);
}
if(KEY_DOWN(VK_UP)&&cur.y>70)
{
drawcursor(cur,BLACK);//绘制黑光标
cur.y-=40;//移动当前光标位置
drawcursor(cur,WHITE);//绘制白光标
}
else if(KEY_DOWN(VK_DOWN)
&&cur.y<630)
{
drawcursor(cur,BLACK);//绘制黑光标
cur.y+=40;//移动当前光标位置
drawcursor(cur,WHITE);//绘制白光标
}
else if(KEY_DOWN(VK_LEFT)
&&cur.x>280)
{
drawcursor(cur,BLACK);//绘制黑光标
cur.x-=40;//移动当前光标位置
drawcursor(cur,WHITE);//绘制白光标
}
else if(KEY_DOWN(VK_RIGHT)
&&cur.x<720)
{
drawcursor(cur,BLACK);//绘制黑光标
cur.x+=40;//移动当前光标位置
drawcursor(cur,WHITE);//绘制白光标
}
else if(KEY_DOWN(VK_RETURN)
||KEY_DOWN(VK_SPACE))
{
//获得光标所在位置周围的同色小球,计算同色小球的个数,并存入数组
getsamecolorballs
(cur,getpixel(cur.x,cur.y));
//同色小球消失一段时间(将数组中元素置黑)
if(index>1)
{
for(int k=0;k { setfillcolor(BLACK); setlinecolor(BLACK); fillcircle(ballsArr[k].x,ballsArr[k].y,18); } //小球下落 Sleep(500); ballsfall(); score+=index; drawscore(score); } index=0; } Sleep(100); } cleardevice(); settextcolor(RGB(255,0,0)); settextstyle(80, 0, _T("黑体")); char s[] = "Game over"; outtextxy(300, 300, s); drawscore(score); Sleep(500); } void drawcursor(posType cur,COLORREF c1) { setlinecolor(c1); rectangle(cur.x-20,cur.y- 20,cur.x+20,cur.y+20); } void drawtime(int sec) { char str[30]; settextcolor(RGB(255,255,0)); settextstyle(25, 0, _T("黑体")); sprintf(str,"剩余时间: %2d s",sec); outtextxy(20, 50, str); } void drawscore(int score) { char str[30]; settextcolor(RGB(255,0,0)); settextstyle(25, 0, _T("黑体")); sprintf(str,"分数: %d",score); outtextxy(20, 550, str); } void getsamecolorballs(posType cur,COLORREF c1) { ballsArr[index].x=cur.x; ballsArr[index].y=cur.y; index++; posType tempos; for(int k=0;k<4;k++) { switch(k){ case 0: tempos.x=cur.x; tempos.y=cur.y-40; break;//上 case 1: tempos.x=cur.x; tempos.y=cur.y+40; break;//下 case 2: tempos.x=cur.x-40; tempos.y=cur.y; break;//左 case 3: tempos.x=cur.x+40; tempos.y=cur.y; break;//右 } if(isValid(tempos,c1)) { getsamecolorballs(tempos,c1); } } } int isValid(posType cur,COLORREF c1) { if(getpixel(cur.x,cur.y)!=c1) { return 0; } else { for(int k=0;k { if(ballsArr[k].x==cur.x &&ballsArr[k].y==cur.y) { return 0; } } return 1; } } void rank() { int i,j; posType temp; for(i=0;i { for(j=0;j { if(ballsArr[j].y>ballsArr[j+1].y) { temp=ballsArr[j]; ballsArr[j]=ballsArr[j+1]; ballsArr[j+1]=temp; } } } } void ballsfall() { rank(); for(int i=0;i { for(int k=ballsArr[i].y;k>70;k-=40) { setfillcolor(getpixel(ballsArr[i].x,k-40)); setlinecolor(getpixel(ballsArr[i].x,k-40)); fillcircle(ballsArr[i].x,k,18); } COLORREF c1=colorArr[rand()%6]; setfillcolor(c1); setlinecolor(c1); fillcircle(ballsArr[i].x,70,18); } }