C语言大作业——消灭星星

最近要提交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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值