欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实现数字连连看

程序员文章站 2023-12-29 15:28:40
本文实例为大家分享了c语言实现数字连连看的具体代码,供大家参考,具体内容如下要求连连看小游戏开发,使用二维数组来保存游戏地图的数据,实现连连看的核心功能。欢乐连连看的功能有:主界面、开始游戏、消子、判...

本文实例为大家分享了c语言实现数字连连看的具体代码,供大家参考,具体内容如下

要求

连连看小游戏开发,使用二维数组来保存游戏地图的数据,实现连连看的核心功能。欢乐连连看的功能有:主界面、开始游戏、消子、判断胜负、提示、重排、计时、游戏模式。

主界面

游戏主界面就是进行各项操作的入口。

开始游戏

玩家选择开始游戏模式,进入游戏后,选择开始游戏,系统根据设置随机生成数字,以供玩家点击消除。

消子

对玩家选中的两张图片进行判断,判断是否符合消除规则。只有符合以下规则的图片对才能被消除:

  • 一条直线连通
  • 两条直线连通
  • 三条直线连通

如果可以消除,两个数字变为0。如果不能消除,则保持原来的游戏地图。

判断胜负

当游戏完成后,需要判断游戏胜负。不同模式下判断胜负的规则不同。

  • 基本模式时,如果在五分钟内将游戏地图的所有图片都消除,则提示玩家胜利。
  • 休闲模式时,如果游戏地图中所有图片都被消除,则提示玩家获胜。

提示

可以提示界面上能够消除的一对图片。

计时

设定一定时间来辅助游戏是否结束。

游戏模式

游戏模式有:基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则进行设置。

代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define width 10
#define height 12
int datas[height][width] = {0};

int choose_type ();
void creat_datas (int fol);
bool ishlinked(int x1,int y1,int x2,int y2);
bool isvlinked(int x1,int y1,int x2,int y2);
bool iszeroturnlinked(int x1,int y1,int x2, int y2);  //一条线 
bool isoneturnlinked(int x1, int y1, int x2,int y2);  //二条线  
bool istwoturnlinked(int x1,int y1,int x2,int y2);  //三条线 
bool judge_answer (int x1,int y1,int x2,int y2);  //判断是否可消去 
void print_datas ();
bool play_game (int flo);
bool isblank ();
bool help_ans ();
bool basic_play ();//基础 
bool relax_play ();//休闲 
bool win_play ();//闯关 

int main()
{
 int flo;
 flo = choose_type ();  // choose the type
 if (flo == 0) return 0;
 srand(unsigned(time(null)));
 creat_datas(flo);  //creat the graph
 print_datas ();
 bool ov;
 ov = play_game (flo);
 if (ov == true){
  printf ("victory");
 }
 else{
  printf ("failed");
 }
 return 0;
 }
 
 bool basic_play ()
 {
  long int t1 ,t2 = 0 ;
  int op = 1;
  int x1,y1,x2,y2;
  bool ans;
  printf ("五分钟计时开始\n");
  t1 = clock();
  while (t2 < 300000 && !isblank() && op != 0 )
  {
   if (op == 1)
   {
    print_datas ();
    printf("请输入两者的坐标[x1 y1 x2 y2]:");   //从上到下,从左到右,先行后列 
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    if (judge_answer (x1, y1, x2,y2))
    {
     datas[x1][y1] = datas[x2][y2] = 0;
     print_datas ();
   }
    else{
    printf("错误");
    }
  }
  if (op == 2)
  { 
    ans = help_ans ();
    print_datas ();
    if (ans == false)  
    {
     printf ("已没有可以消去的\n");
     return true;
    }
   }
  printf("是否继续游戏 1、yes 0、no 2、help:");
  scanf ("%d",&op);
  t2 = clock() - t1;
 }
 if (t2 > 299)
 {
  printf ("超时\n");
  return false;
 }
 if (isblank()) return true;
 else return false;
}

bool help_ans ()
{
 int k;
 for (int i = 1; i < 11;i++)
 {
  for (int j = 1; j < 9;j++)
  {
   if (datas[i][j] != 0)
   {
    k = j+1;
    for (int m = i; m < 11;m++)
    {
     for (int n = k; n < 9;n++)
     {
      if (datas[i][j] == datas[m][n])
      {
       if (judge_answer(i,j,m,n))
        {
         printf ("(%d,%d)  (%d,%d)\n",i,j,m,n);
         datas[i][j] = datas[m][n] = 0;
         return true;
        }
      }
     }
     k = 1;
    }
   }
  }
 }
 return false;
}

 
  bool relax_play ()
 {
  int op = 1;
  int x1,y1,x2,y2;
  bool ans;
  while (!isblank() && op != 0)   //g isn't blank
  {
   if (op == 1)
   {
    print_datas ();
    printf("请输入两者的坐标[x1 y1 x2 y2]:");
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    if (judge_answer (x1, y1, x2,y2))
    {
     datas[x1][y1] = datas[x2][y2] = 0;
     print_datas ();
    }
    else{
     printf("错误");
    }
   }
   if (op == 2)
   { 
    ans = help_ans ();
    print_datas ();
    if (ans == false)  
    {
     printf ("已没有可以消去的\n");
     return true;
    }
   }
   printf("是否继续游戏 1、yes 0、no 2、help:");
   scanf ("%d",&op);
  }
  if (!isblank()) return false;
  else  return true;
 }
 
  bool win_play ()
 {
  int op = 1;
  int x1,y1,x2,y2;
  bool ans;
  while (!isblank() && op != 0)   //g isn't blank
  {
   if (op == 1)
   {
    print_datas ();
    printf("请输入两者的坐标[x1 y1 x2 y2]:");
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    if (judge_answer (x1, y1, x2,y2))
    {
     datas[x1][y1] = datas[x2][y2] = 0;
     print_datas ();
    }
    else{
     printf("错误");
    }
   }
   printf("是否继续游戏 1、yes 0、no :");
   scanf ("%d",&op);
  }
  if (!isblank() && help_ans) return false;
  else 
   return true ;
 }
 
 bool isblank ()
 {
  for(int j=1; j < 10 ; j++)
 {
  for (int i= 1; i< 8 ; i++)
  {
   if (datas[j][i] != 0)  return false;
  }
 }
 return true;
 }
 
bool play_game (int flo)
 {
  bool ans;
  if (flo == 1)    //the basic type
  {
   printf ("基本模式:\n");
   ans = basic_play ();
   return ans;
  }
  if (flo == 2)    //the relax type
  {
   printf ("休闲模式:\n");
   ans = relax_play ();
   return ans;
  }
  else    //the win type
  {
   printf ("第%d关游戏:\n",flo - 2);
   ans = win_play ();
   return ans;
  }
 }
 
 void print_datas ()
 {
  for(int j=1; j < 11 ; j++)
 {
  printf("\t\t");
  for (int i= 1; i< 9 ; i++)
  {
   printf("%d\t",datas[j][i]);
  }
  printf("\n");
 }
 }
 
 bool judge_answer (int x1,int y1,int x2,int y2)
 {
  if (datas [x1][y1] != datas[x2][y2] || datas [x1][y1] == 0 || datas [x2][y2] == 0 ) return false;
  if (x1 == x2  &&  y1 == y2)   return false;
  if (x1 > 11 || x2 > 11 || y1> 9 || y2 > 9) return false;
  if (x1 == x2 || y1 == y2)
  {
   if (iszeroturnlinked(x1,y1,x2,y2) || istwoturnlinked(x1,y1,x2,y2))  return true;
  }
 else{
  if (isoneturnlinked(x1,y1,x2,y2) || istwoturnlinked(x1,y1,x2,y2))  return true;
 }
 return false;
 }
 
 int choose_type ()
 {
  printf("请选择你要进行的操作:1,开始游戏  2,结束游戏\n");
  int op;
  scanf("%d",&op);
  if (op == 1)
  {
   printf("\n请选择游戏模式:1、基本模式  2、休闲模式  3、关卡模式\n");
  int ops;
  scanf ("%d",&ops);
  if (ops == 1) return 1;
  if (ops == 2) return 2;
  if (ops == 3)
  {
   printf("\n请选择你选择的关卡3-16:");
   int opsd;
   scanf ("%d",&opsd);
   return opsd;
  }
  }
  if (op == 2) return 0;
 }
 
void creat_datas (int fol)
 {
  int tmpdatas[80] = {0}; // 定义一个临时数组用于存放
  int picnum[] = {3,4,5,1,2,7,9,6,8,44,78,12,90,33,34};
 int count = 0,i, j, d = 0,pic,tem,t;
 pic = 8 * 10 / (fol + 9 );
 for(j=0; j < 80 ; j++)
 {
  tmpdatas[j] = picnum[d];
  count++;
  if (count == pic )
  {
   d++; 
   count = 0; 
  }
 }
 d = 80;
 for(j=1;j < height - 1;j++)
  for (i = 1;i < width - 1; i++)
  {
   t = rand() % d;   //fisher-yates shuffle 
   tem = tmpdatas[t];
   tmpdatas[t] = tmpdatas[d -1];
   tmpdatas[d - 1] = tem;
   datas[j][i] = tmpdatas[d -1];
   d--;
  }
}



bool ishlinked(int x1,int y1,int x2,int y2) //横向是否连接
{
 int miny,maxy;
 if (x1 != x2)  return false;
 if (y1 < y2){
  miny = y1;
  maxy = y2;
 }
 else{
  miny = y2;
  maxy = y1;
 } 
 if (maxy - miny == 1) return true;
 for ( int i = miny +1; i < maxy ; i++) //从左到右检查中间的点是不是空的
 {
  if (datas[x1][i] != 0)  return false;
 }
 return true;
}

bool isvlinked(int x1,int y1,int x2,int y2) //纵向是否连接
{
 int minx,maxx;
 if (y1 != y2)  return false;
 if (x1 < x2){
  minx = x1;
  maxx = x2;
 }
 else{
  minx = x2;
  maxx = x1;
 }
 if (maxx - minx == 1) return true; 
 for ( int i = minx +1; i < maxx ; i++) 
 {
  if (datas[i][y1] != 0) return false;
 }
 return true;
}



bool iszeroturnlinked(int x1,int y1,int x2, int y2)  //不转折时判断
{
 if (ishlinked(x1, y1, x2,y2))
 {
  return true ;
 }
 if (isvlinked(x1, y1, x2, y2))
 {
  return true ;
 }
 return false;
}



bool isoneturnlinked(int x1, int y1, int x2,int y2) //转折一次
{
 int tmpx[2] = { x1, x2 };
 int tmpy[2] = { y2, y1 };
 for (int i = 0; i < 2; i++)
  {
   if (datas[tmpx[i]][tmpy[i]] != 0) continue;
   if (iszeroturnlinked( tmpx[i], tmpy[i], x1, y1) && iszeroturnlinked( tmpx[i], tmpy[i], x2,y2))
   {
    return true;
   }
  }
 return false;
}


bool istwoturnlinked(int x1,int y1,int x2,int y2)
{
 int j, tmpx1,tmpy1,tmpx2,tmpy2;
 //纵向遍历所有点
 tmpx1 = x1;
 for ( j = 0; j < width; j++)
 {
  tmpy1 = j;
  if (j == y1)  continue; 
  if (tmpx1 == x2 && tmpy1 == y2) continue; //重合
  tmpx2 = x2;
  tmpy2 = tmpy1;
  if (datas[tmpx1][tmpy1] != 0 || datas[tmpx2][tmpy2] != 0) continue;
  if (iszeroturnlinked(tmpx1, tmpy1, tmpx2, tmpy2) && iszeroturnlinked(tmpx1, tmpy1, x1, y1) && iszeroturnlinked(tmpx2, tmpy2, x2, y2))
   return true;
 }
 //横向遍历所有点
 tmpy1 = y1;
 for ( j = 0; j < height; j++)
 {
  tmpx1 = j;
  if (j == x1)  continue; 
  if (tmpy1 == y2 && tmpx1 == x2) continue; //重合
  tmpy2 = y2;
  tmpx2 = tmpx1;
  if (datas[tmpx1][tmpy1] != 0 || datas[tmpx2][tmpy2] != 0) continue;
  if (iszeroturnlinked(tmpx1, tmpy1, tmpx2, tmpy2) && iszeroturnlinked(tmpx1, tmpy1, x1, y1) && iszeroturnlinked(tmpx2, tmpy2, x2, y2))
  {
   return true;
  }
 }
 return false;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: