我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言实现数字连连看

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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;
 }

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言实现数字连连看

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++怎么实现连连看游戏

本篇内容主要讲解“C++怎么实现连连看游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现连连看游戏”吧!struct GridInfor //记入击中图片信息{int
2023-06-25

C语言如何实现矩阵连乘

本篇内容主要讲解“C语言如何实现矩阵连乘”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现矩阵连乘”吧!动态规划法题目描述:给定n个矩阵{A1,A2....An},其中Ai与Ai+1是
2023-06-16

c语言如何把字符串连接

在C语言中,可以使用strcat函数将两个字符串连接起来。strcat函数的原型如下:```cchar* strcat(char* destination, const char* source);```其中,destination是目标字
2023-08-15

C语言怎么连接两个字符串

在C语言中,连接两个字符串可以使用`strcat()`函数或者手动实现。1. 使用`strcat()`函数:`strcat()`函数用于连接两个字符串,将第二个字符串追加到第一个字符串的末尾。```c#include #include in
2023-08-30

C语言实现打印数字金字塔

这篇文章主要介绍了C语言实现打印数字金字塔方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

c语言字符串转数字怎么实现

在C语言中,可以使用标准库函数atoi()和atol()来将字符串转换为整数和长整数。具体实现如下:#include #include int main() {char str[] = "12345
c语言字符串转数字怎么实现
2024-03-08

Go语言配置数据库连接池的实现

目录配置连接池SetMaxOpenConns方法SetMaxIdleConns方法SetConnMaxLifetime方法SetConnMaxIdleTime方法实操一波配置连接池开始本文之前,我们看一段Go连接数据库的代码://openD
2022-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录