程序截图
先来看下思路
1.初始化窗口
2.开始游戏
利用方向键移动光标
对于可以消除的情况的判断
记录相同颜色的位置
小球下降补充新的小球
记录分数
3.如果计时结束后显示游戏结束
4.释放资源
首先我们需要graphics头文件 需要使用easyx
帮助文档和下载地址在这里
具体函数的用法可以看帮助文档自己查阅
首先写好程序的框架
#include<graphics.h>
#include<conio.h>
void init(void);//初始化界面
void gamebegin(void);//游戏开始界面
void gameplay(void);//玩游戏的具体过程
void close(void);//释放资源
void main()
{
init();
gamebegin();
gameplay();
close();
}
void init()
{
initgraph(1000,700);
}
void gamebegin()
{
//绘制边框
setlinecolor(RGB(50,50,50));
setlinestyle(PS_SOLID,10);
rectangle(255,45,745,655);
//绘制小球
int x , y;
setlinecolor(RGB(250,0,0));
setfillcolor(RGB(250,0,0));
setlinestyle(PS_SOLID);
for(x = 280 ; x < 740 ; x+=40)
{
for(y = 70 ; y < 650 ; y+=40)
{
fillcircle(x,y,20);
}
}
//绘制时间
//绘制分数
}
void gameplay()
{
}
void close()
{
getch();
closegraph();
}
完成游戏部分
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<stdio.h>
typedef struct position
{
int x;
int y;
} posType;
typedef struct inf
{
char name[20];
int score;
}info;
#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000)
void init(void); // 初始化界面
void gamebegin(void); //游戏开始界面
void gameplay(void); //玩游戏的具体过程
void close(void); //释放资源
void drawcursor(posType,COLORREF); //重绘光标
void drawtime(int); //重绘时间
void drawscore(int); //重绘分数
void getsamecolorballs(posType,COLORREF); //获取同色小球
int isValid(posType cur,COLORREF cl); //判断是否合法
void ballsfall(); //小球下落
int rank();//将分数写入排行榜
int readrank();//读出排行榜
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]; //同色小球坐标
int index = 0; //同色小球的个数(静态变量不赋值是自动赋0或空字符)
int score = 0; //记录分数
int main()
{
char select;
printf("****************************************************************************\n");
printf("* *\n");
printf("* 1.开始游戏 *\n");
printf("* 2.排行榜 *\n");
printf("* *\n");
printf("****************************************************************************\n");
select = getch();
if(select == '1')
{
init();
gamebegin();
gameplay();
close();
rank();
}
if(select == '2' )
{
readrank();
}
return 0;
}
void init()
{
initgraph(1000,700);
}
void gamebegin()
{
//绘制边框
setlinecolor(RGB(50,50,50));
setlinestyle(PS_SOLID | PS_JOIN_ROUND, 10);
rectangle(255,45,745,655);
//绘制小球
setlinestyle(PS_SOLID);
srand((unsigned) time(NULL)); //提供随机数种子
for(int x=280;x<740;x+=40)
{
for(int y=70;y<650;y+=40)
{
COLORREF cl=colorArr[rand()%6];
setlinecolor(cl);
setfillcolor(cl);
fillcircle(x,y,18);
}
}
//绘制光标
cur.x=480;
cur.y=390;
drawcursor(cur,RGB(255,255,255));
//绘制时间
drawtime(30);
//绘制分数
drawscore(0);
}
void gameplay()
{
for(int i=299;i>-1;i--)
{
if(i%10==0)
{
drawtime(i/10);
}
if(KEY_DOWN(VK_UP)&&cur.y>70)
{
drawcursor(cur,RGB(0,0,0));
cur.y-=40;
drawcursor(cur,RGB(255,255,255));
}
else if(KEY_DOWN(VK_DOWN)&&cur.y<630)
{
drawcursor(cur,RGB(0,0,0));
cur.y+=40;
drawcursor(cur,RGB(255,255,255));
}
else if(KEY_DOWN(VK_LEFT)&&cur.x>280)
{
drawcursor(cur,RGB(0,0,0));
cur.x-=40;
drawcursor(cur,RGB(255,255,255));
}
else if(KEY_DOWN(VK_RIGHT)&&cur.x<720)
{
drawcursor(cur,RGB(0,0,0));
cur.x+=40;
drawcursor(cur,RGB(255,255,255));
}
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++)
{
setlinecolor(RGB(0,0,0));
setfillcolor(RGB(0,0,0));
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("黑体"));
outtextxy(300, 330, "Game Over");
drawscore(score);
}
void close()
{
getch();
closegraph();
}
void drawcursor(posType cur,COLORREF cl)
{
setlinecolor(cl);
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(30, 50, str);
}
void drawscore(int score)
{
char str[30];
settextcolor(RGB(255,0,0));
settextstyle(25, 0, _T("黑体"));
sprintf(str,"分数:%d",score);
outtextxy(30, 600, str);
}
void getsamecolorballs(posType cur,COLORREF cl) //《数据结构》---迷宫求解
{
ballsArr[index].x=cur.x;
ballsArr[index].y=cur.y;
index++;
posType tmpPos;
for(int k=0;k<4;k++)
{
switch(k)
{
case 0:tmpPos.x=cur.x;tmpPos.y=cur.y-40;break; //上
case 1:tmpPos.x=cur.x;tmpPos.y=cur.y+40;break; //下
case 2:tmpPos.x=cur.x-40;tmpPos.y=cur.y;break; //左
case 3:tmpPos.x=cur.x+40;tmpPos.y=cur.y;break; //右
}
if(isValid(tmpPos,cl))
{
getsamecolorballs(tmpPos,cl);//递归调用
}
}
}
int isValid(posType cur,COLORREF cl)
{
if(getpixel(cur.x,cur.y)!=cl)
{
return 0;
}
else
{
for(int i=0;i<index;i++) //判断数组中之前是否已存在
{
if(cur.x==ballsArr[i].x&&cur.y==ballsArr[i].y)//进行遍历
{
return 0;
}
}
return 1;
}
}
void turn()
{
int i,j;posType temp;
for(j=0;j<index-1;j++)
for(i=0;i<index-1-j;i++)
{
if(ballsArr[i].x>ballsArr[i+1].x)
{
temp=ballsArr[i];
ballsArr[i]=ballsArr[i+1];
ballsArr[i+1]=temp;
}
if(ballsArr[i].y>ballsArr[i+1].y)
{
temp=ballsArr[i];
ballsArr[i]=ballsArr[i+1];
ballsArr[i+1]=temp;
}
}
}
void ballsfall()
{
turn();
for(int i=0;i<index;i++)
{
for(int k=ballsArr[i].y;k>70;k-=40)
{
COLORREF cl=getpixel(ballsArr[i].x,k-40);
setlinecolor(cl);
setfillcolor(cl);
fillcircle(ballsArr[i].x,k,18);
}
COLORREF cl=colorArr[rand()%6];
setlinecolor(cl);
setfillcolor(cl);
fillcircle(ballsArr[i].x,70,18);
}
}
int rank()
{
info tmp;
FILE *fp;
printf("大侠请输入您的大名:");
scanf("%s",&tmp.name);
tmp.score = score;
fp=fopen("rank.txt","a");
if(fp==NULL)
{
printf("cannot open the files\n");
system("pause");
return -1;//如果文件出现错误返回-1
}
fprintf(fp,"%s %d",tmp.name,tmp.score);
fclose(fp);
return 0;
}
int readrank()
{
info tmp[10];
info temp;
int n = 0,j = 0,i = 0,k = 0;
FILE *fp;
fp = fopen("rank.txt","rb");
if(fp==NULL)
{
printf("cannot open the files\n");
system("pause");
return -1;
}
for(i=0;i<n-1;i++)//采用冒泡法进行排序
{
k=i;
for(j=i+1;j<n;j++)
if(tmp[j].score>tmp[k].score)//排序比较大小
k=j;
temp=tmp[k];
tmp[k]=tmp[i];
tmp[i]=temp;//当符合条件时进行数据交换
}
i = 0;
while(i <= 10&&fscanf(fp,"%s%d",tmp[i].name,&tmp[i].score)!=EOF)
{
printf("%3d%15s%10d\n",i+1,tmp[i].name,tmp[i].score);
i++;
}
fclose(fp);
return 0;
}
下面加入排行榜
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<stdio.h>
typedef struct position
{
int x;
int y;
} posType;
typedef struct inf
{
char name[20];
int score;
}info;
#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000)
void init(void); // 初始化界面
void gamebegin(void); //游戏开始界面
void gameplay(void); //玩游戏的具体过程
void close(void); //释放资源
void drawcursor(posType,COLORREF); //重绘光标
void drawtime(int); //重绘时间
void drawscore(int); //重绘分数
void getsamecolorballs(posType,COLORREF); //获取同色小球
int isValid(posType cur,COLORREF cl); //判断是否合法
void ballsfall(); //小球下落
int rank();//将分数写入排行榜
int readrank();//读出排行榜
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]; //同色小球坐标
int index = 0; //同色小球的个数(静态变量不赋值是自动赋0或空字符)
int score = 0; //记录分数
int main()
{
char select;
printf("****************************************************************************\n");
printf("* *\n");
printf("* 1.开始游戏 *\n");
printf("* 2.排行榜 *\n");
printf("* *\n");
printf("****************************************************************************\n");
select = getch();
if(select == '1')
{
init();
gamebegin();
gameplay();
close();
rank();
}
if(select == '2' )
{
readrank();
}
return 0;
}
void init()
{
initgraph(1000,700);
}
void gamebegin()
{
//绘制边框
setlinecolor(RGB(50,50,50));
setlinestyle(PS_SOLID | PS_JOIN_ROUND, 10);
rectangle(255,45,745,655);
//绘制小球
setlinestyle(PS_SOLID);
srand((unsigned) time(NULL)); //提供随机数种子
for(int x=280;x<740;x+=40)
{
for(int y=70;y<650;y+=40)
{
COLORREF cl=colorArr[rand()%6];
setlinecolor(cl);
setfillcolor(cl);
fillcircle(x,y,18);
}
}
//绘制光标
cur.x=480;
cur.y=390;
drawcursor(cur,RGB(255,255,255));
//绘制时间
drawtime(30);
//绘制分数
drawscore(0);
}
void gameplay()
{
for(int i=299;i>-1;i--)
{
if(i%10==0)
{
drawtime(i/10);
}
if(KEY_DOWN(VK_UP)&&cur.y>70)
{
drawcursor(cur,RGB(0,0,0));
cur.y-=40;
drawcursor(cur,RGB(255,255,255));
}
else if(KEY_DOWN(VK_DOWN)&&cur.y<630)
{
drawcursor(cur,RGB(0,0,0));
cur.y+=40;
drawcursor(cur,RGB(255,255,255));
}
else if(KEY_DOWN(VK_LEFT)&&cur.x>280)
{
drawcursor(cur,RGB(0,0,0));
cur.x-=40;
drawcursor(cur,RGB(255,255,255));
}
else if(KEY_DOWN(VK_RIGHT)&&cur.x<720)
{
drawcursor(cur,RGB(0,0,0));
cur.x+=40;
drawcursor(cur,RGB(255,255,255));
}
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++)
{
setlinecolor(RGB(0,0,0));
setfillcolor(RGB(0,0,0));
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("黑体"));
outtextxy(300, 330, "Game Over");
drawscore(score);
}
void close()
{
getch();
closegraph();
}
void drawcursor(posType cur,COLORREF cl)
{
setlinecolor(cl);
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(30, 50, str);
}
void drawscore(int score)
{
char str[30];
settextcolor(RGB(255,0,0));
settextstyle(25, 0, _T("黑体"));
sprintf(str,"分数:%d",score);
outtextxy(30, 600, str);
}
void getsamecolorballs(posType cur,COLORREF cl) //《数据结构》---迷宫求解
{
ballsArr[index].x=cur.x;
ballsArr[index].y=cur.y;
index++;
posType tmpPos;
for(int k=0;k<4;k++)
{
switch(k)
{
case 0:tmpPos.x=cur.x;tmpPos.y=cur.y-40;break; //上
case 1:tmpPos.x=cur.x;tmpPos.y=cur.y+40;break; //下
case 2:tmpPos.x=cur.x-40;tmpPos.y=cur.y;break; //左
case 3:tmpPos.x=cur.x+40;tmpPos.y=cur.y;break; //右
}
if(isValid(tmpPos,cl))
{
getsamecolorballs(tmpPos,cl);//递归调用
}
}
}
int isValid(posType cur,COLORREF cl)
{
if(getpixel(cur.x,cur.y)!=cl)
{
return 0;
}
else
{
for(int i=0;i<index;i++) //判断数组中之前是否已存在
{
if(cur.x==ballsArr[i].x&&cur.y==ballsArr[i].y)//进行遍历
{
return 0;
}
}
return 1;
}
}
void turn()
{
int i,j;posType temp;
for(j=0;j<index-1;j++)
for(i=0;i<index-1-j;i++)
{
if(ballsArr[i].x>ballsArr[i+1].x)
{
temp=ballsArr[i];
ballsArr[i]=ballsArr[i+1];
ballsArr[i+1]=temp;
}
if(ballsArr[i].y>ballsArr[i+1].y)
{
temp=ballsArr[i];
ballsArr[i]=ballsArr[i+1];
ballsArr[i+1]=temp;
}
}
}
void ballsfall()
{
turn();
for(int i=0;i<index;i++)
{
for(int k=ballsArr[i].y;k>70;k-=40)
{
COLORREF cl=getpixel(ballsArr[i].x,k-40);
setlinecolor(cl);
setfillcolor(cl);
fillcircle(ballsArr[i].x,k,18);
}
COLORREF cl=colorArr[rand()%6];
setlinecolor(cl);
setfillcolor(cl);
fillcircle(ballsArr[i].x,70,18);
}
}
int rank()
{
info tmp;
FILE *fp;
printf("大侠请输入您的大名:");
scanf("%s",&tmp.name);
tmp.score = score;
fp=fopen("rank.txt","a");
if(fp==NULL)
{
printf("cannot open the files\n");
system("pause");
return -1;//如果文件出现错误返回-1
}
fprintf(fp,"%s %d",tmp.name,tmp.score);
fclose(fp);
return 0;
}
int readrank()
{
info tmp[10];
info temp;
int n = 0,j = 0,i = 0,k = 0;
FILE *fp;
fp = fopen("rank.txt","rb");
if(fp==NULL)
{
printf("cannot open the files\n");
system("pause");
return -1;
}
for(i=0;i<n-1;i++)//采用冒泡法进行排序
{
k=i;
for(j=i+1;j<n;j++)
if(tmp[j].score>tmp[k].score)//排序比较大小
k=j;
temp=tmp[k];
tmp[k]=tmp[i];
tmp[i]=temp;//当符合条件时进行数据交换
}
i = 0;
while(i <= 10&&fscanf(fp,"%s%d",tmp[i].name,&tmp[i].score)!=EOF)
{
printf("%3d%15s%10d\n",i+1,tmp[i].name,tmp[i].score);
i++;
}
fclose(fp);
return 0;
}
关于排名看下面的函数
int rank()
{
info tmp[10];
FILE *fp;
int i = 0,n = 0;
fp=fopen("rank.txt","a");
if(fp==NULL)
{
printf("cannot open the files\n");
system("pause");
return -1;//如果文件出现错误返回-1
}
while(i < 10&&fscanf(fp,"%s%d",tmp[i].name,tmp[i].score)!=EOF)
{
if(score>=tmp[i].score)
{
printf("大侠请输入您的大名:");
scanf("%s",&tmp[i].name);
tmp[i].score = score;
}
i++;
}
if(i < 9)
{
printf("大侠请输入您的大名:");
scanf("%s",&tmp[i].name);
tmp[i].score = score;
}
for(i = 0;i <= 10; i++)
fprintf(fp,"%s %d",tmp[i].name,tmp[i].score);
fclose(fp);
return 0;
}
int readrank()
{
info tmp[10];
info temp;
int j = 0,i = 0,k = 0;
FILE *fp;
fp = fopen("rank.txt","rb");
if(fp==NULL)
{
printf("cannot open the files\n");
system("pause");
return -1;
}
while(i < 10&&fscanf(fp,"%s%d",tmp[i].name,&tmp[i].score)!=EOF)
{
i++;
}
for(j = 0;j < i;j++)
for(k = 0;k <= i;k++)
{
if(tmp[k].score>tmp[j].score)
{
temp = tmp[k];
tmp[k] = tmp[j];
tmp[j] = temp;
}
}
fclose(fp);
return 0;
}