友情提示:vc++6.0需要加装easyx库,这是一个图形库(个人认为这个库不错,太适合新手做一些有意思的效果),具体教程见前文,如果没有添加的话,是不能编译运行通过的,也就见不到效果。
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#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<index;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<index;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<index;i++)
{
for(j=0;j<index-i-1;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<index;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);
}
}
网友评论