最近要提交C语言大作业了,然后经过一天的构思和大概两个小时的敲代码时间,最终写出了这篇《消灭星星》(弱化版)。
为什么叫弱化版?
因为这个版本的《消灭星星》即使一颗星星也能消除,不用满足至少三个星星的限制。
使用了什么算法?
严格来说,这段代码只使用了dfs和一些基础语言。
上代码!
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
char s[100];
int flag[20][20];
int flag1[20][20];
char k[20][20];
int res;
int g[10];
int face[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int maxx(int x,int y)
{
if (x>y)
return x;
else
return y;
}
int kong(int x,int y)//判断该点是否为空
{
if (k[x][y]=='s'||k[x][y]=='t'||k[x][y]=='x'||k[x][y]=='d'||k[x][y]=='y')
return 1;
return 0;
}
void ge(int x,int y,int xx,int yy)//找连通的相同的颜色
{
if (k[x][y]==k[xx][yy]&&flag1[xx][yy]==0)
{
res++;
flag1[xx][yy]=1;
}
for (int i=0;i<=3;i++)
{
int xu=xx+face[i][0];
int yu=yy+face[i][1];
if (xu>=1&&xu<=10&&yu>=1&&yu<=10&&flag1[xu][yu]==0&&k[x][y]==k[xu][yu])
ge(x,y,xu,yu);
}
}
void gengxin()//更新图
{
for (int a=1;a<=10;a++)
for (int b=1;b<=10;b++)
{
if (flag1[b][a])
{
k[b][a]='0';
for (int c=b-1;c>=1;c--)
{
k[c+1][a]=k[c][a];
k[c][a]='0';
}
}
}
for (int a=1;a<=10;a++)
for (int b=1;b<=10;b++)
{
if (kong(a,b))
flag[a][b]=0;
else
flag[a][b]=1;
}
}
void tu(int x,int y,int p)//随机数后建图
{
if (p==1)
k[x][y]='s';
if (p==2)
k[x][y]='t';
if (p==3)
k[x][y]='x';
if (p==4)
k[x][y]='d';
if (p==5)
k[x][y]='y';
}
void dang()//输出当前图
{
printf("\n");
printf(" ");
for (int a=1;a<=10;a++)
printf("%d ",a);
printf("\n");
for (int a=1;a<=10;a++)
{
if (a==10)
printf("%d ",a);
else
printf("%d ",a);
for (int b=1;b<=10;b++)
printf("%c ",k[a][b]);
printf("\n");
}
}
int main() {
printf("欢迎来到酸酸的小世界\n");
Sleep(2000);
printf("你将在这里获得一个良好的游戏体验\n");
Sleep(2000);
printf("我们要玩的游戏叫做酸酸消消乐\n");
Sleep(2000);
printf("请问是否选择查看规则(第一次游玩建议查看)\n");
Sleep(2000);
printf("要查看规则请输入2,输入1将直接进入游戏\n");
while (1)
{
int n;
scanf("%d",&n);
if (n==1)
break;
if (n!=1&&n!=2)
{
printf("无效输入,请重新输入!\n");
continue;
}
if (n==2)
{
printf("你应该接触过消灭星星这款游戏\n");Sleep(3000);
printf("为了方便表示,我们将所有的颜色换成字母(sstxdy)共5个表示颜色\n");Sleep(3000);
printf("棋盘的大小为10*10,横纵坐标分别从1到10\n");Sleep(3000);
printf("每一个回合你可以选择棋盘上任意一个有颜色的坐标,并且输入这个坐标\n");Sleep(3000);
printf("若你选择的颜色与之相邻的位置存在相同颜色的方块\n");Sleep(3000);
printf("这些方块将被一起消除,并且你会获得一个得分\n");Sleep(3000);
printf("在这些方块上方的方块由于受到重力的作用将会下落\n");Sleep(3000);
printf("得分规则是,若你一起消除了n个方块,你将获得的分数是\n");Sleep(3000);
printf("n*n*10\n");Sleep(3000);
printf("在你发现没有可以消除的方块以后,你可以输入0 0以结束游戏\n");Sleep(3000);
printf("最后会根据你所剩余的方块个数相应加分\n");Sleep(3000);
printf("剩余0方块+1000分,每多剩余一个方块你的奖励分减少100,最低为0\n");Sleep(3000);
printf("在最后,你将可以知道自己的最终得分\n");Sleep(3000);
printf("好了,现在你已经了解了整个游戏规则,准备开始游戏吧\n\n\n\n");Sleep(3000);
break;
}
}
srand(time(0));
printf("请输入你的姓名(仅限英文,不能携带空格):");
scanf("%s",s);
printf("\n游戏正式开始\n");
g[1]=rand()%10+15;
if (g[1]%2)
g[1]++;
g[2]=rand()%10+15;
if (g[2]%2)
g[2]++;
g[3]=rand()%10+15;
if (g[3]%2)
g[3]++;
g[4]=rand()%10+15;
if (g[4]%2)
g[4]++;
g[5]=100-g[1]-g[2]-g[3]-g[4];
for (int a=1;a<=10;a++)
for (int b=1;b<=10;b++)
{
int q=rand()%5+1;
if (g[q])
{
g[q]--;
tu(a,b,q);
}
else
b--;
}
dang();
int ans=0;
while (1)
{
int x,y;
scanf("%d%d",&x,&y);
if (x<1||y<1||x>10||y>10)
break;
else
{
res=0;
ge(x,y,x,y);
gengxin();
for (int a=1;a<=10;a++)
for (int b=1;b<=10;b++)
flag1[a][b]=0;
dang();
ans+=res*res*10;
}
}
int cnt=0;
for (int a=1;a<=10;a++)
for (int b=1;b<=10;b++)
if (flag[a][b]==0)
cnt++;
ans=ans+maxx(1000-100*cnt,0);
printf("玩家:%s 你的最终得分是%d\n",s,ans);
Sleep(1000);
printf("感谢你前来酸酸的小世界游玩!祝你生活愉快!\n");
return 0;
}
|