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

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

(0)

相关推荐

  • C语言构建连连看游戏(矩阵方式)

    C语言构建连连看游戏的具体代码,供大家参考,具体内容如下 设计要求 用数字+英文字母,采用文本输出的方式.每次输出一个8*10的矩形,然后等待玩家输入两个数字或字母的坐标,如果满足消除规则就输出新的矩形. 注意:考虑类似迷宫的处理方式,在8 * 10矩形之外加一层空心围墙,可以用来连接.大家体验一下连连看游戏就可以发现这个规则.判断是否能连,用的是10 *12的数组,最外层添加的是空格,可用来辅助连接. 分析 大纲(简化): /**********************************

  • C++实现连连看游戏核心代码

    这两天研究了一下连连看游戏的源代码,感觉它挺简单的,主要就是判断选中的两张图片能否消去.我参考了网上的源代码(抱歉的是,不记得当时下载的网址了,在此对原作者表示深深的歉意!),然后自己把核心代码整理如下,与大家共享.需要说明的是,这只是核心算法的代码,界面设计和操作的代码均已略去. #include <stdlib.h> #include <time.h> //图片类 class picture { public: int type;//图片的编号,共有n种,从0到n-1 bool

  • C++连连看判定图形消除算法

    我们玩过的连连看游戏,通过选定两个图形相同的元素,判定其是否可在三次转弯内连接起来,若能,则消去,若不能,则不可消去,直至最后全部消除. 本算法中不包括关于死锁状态判定. // 连连看.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream.h> #include <vector> #include <queue

  • C语言实现简易连连看游戏

    本文为大家分享了C语言实现连连看游戏位的具体代码,供大家参考,具体内容如下 题目 给定一个2N×2N的方阵网格游戏盘面,每个格子中放置一些符号.这些符号一定是成对出现的,同一个符号可能不止一对.程序读入玩家给出的一对位置(x​1,y1​​ ).(x​2,y​2),判断这两个位置上的符号是否匹配.如果匹配成功,则将两个符号消为"*"并输出消去后的盘面:否则输出"Uh-oh".若匹配错误达到3次,则输出"Game Over"并结束游戏.或者当全部符号

  • C++实现连连看消除算法

    C++连连看消除代码的实现,过程比较复杂. #include<iostream> #include<vector> using namespace std; bool CheckRemove(int x1,int y1,int x2,int y2,int rows,int cols,int ***pArray); void Swap(int &a,int &b); typedef struct { int x; int y; }point; int main() {

  • C语言实现数字连连看

    本文实例为大家分享了C语言实现数字连连看的具体代码,供大家参考,具体内容如下 要求 连连看小游戏开发,使用二维数组来保存游戏地图的数据,实现连连看的核心功能.欢乐连连看的功能有:主界面.开始游戏.消子.判断胜负.提示.重排.计时.游戏模式. 主界面 游戏主界面就是进行各项操作的入口. 开始游戏 玩家选择开始游戏模式,进入游戏后,选择开始游戏,系统根据设置随机生成数字,以供玩家点击消除. 消子 对玩家选中的两张图片进行判断,判断是否符合消除规则.只有符合以下规则的图片对才能被消除: 一条直线连通

  • C语言实现数字雨效果

    本文实例为大家分享了C语言实现数字雨效果展示的具体代码,供大家参考,具体内容如下 #include <windows.h> #include <windowsx.h> #define ID_TIMER 1 #define STRMAXLEN 25 //一个显示列的最大长度 #define STRMINLEN 8 //一个显示列的最小长度 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; /////////////////

  • C语言实现数字炸弹小游戏

    本文实例为大家分享了C语言实现数字炸弹小游戏的具体代码,供大家参考,具体内容如下 使用的是C语言 # 内容 #include<stdio.h> #include<stdlib.h> int main(){ //变量 char c_TheRequest = 1;//开始界面的字符 int in_Deltar = 1,in_EnteredNumber,in_Sig;//游戏中输入数字及其判定所需要的数字 int in_GivenNum = 0,in_An = 0,in_Bn = 0;/

  • 如何使用C语言将数字、字符等数据写入、输出到文本文件中

    目录 1.首先需要声明一个文件指针变量 2.接下来需要对这个指针变量进行初始化 3.然后开始利用相应函数将数据写入文件 4.最后一步,也是关键的一步 总结 最近在调试程序,想把过程中需要查看的数据输出到文件中,因此将简单的小方法分享一下 1.首先需要声明一个文件指针变量 FILE* fp; 2.接下来需要对这个指针变量进行初始化 fp = fopen("在这里填写你自己的路径", "这里填写读写方式"); 现在介绍一下路径填写和C语言中的读写方式: 路径示例:&qu

  • C语言实现数字游戏

    本文实例为大家分享了C语言数字游戏的具体代码,供大家参考,具体内容如下 问题描述 : 现在,有许多给小孩子玩的数字游戏,这些游戏玩起来简单,但要创造一个就不是那么容易的了. 在这,我们将介绍一种有趣的游戏. 你将会得到N个正整数,你可以将一个整数接在另一个整数之后以制造一个更大的整数. 例如,这有4个数字123, 124, 56, 90,他们可以制造下列整数─ 1231245690, 1241235690, 5612312490, 9012312456, 9056124123-等,总共可以组合出

  • C语言的数字游戏算法效率问题探讨实例

    最近做了这样一个题目,感觉挺有趣~题目如下: 问题描述 Winder 最近在玩一个数字游戏,该游戏是在一个n*m 的网格上进行的,每个格子上有 一个数字,代表这个格子的数值.玩家需要从网格的左上角的格子走到右下角的格子,每次 只能向右或者向下走,并且不能回头.玩家每经过一个格子可以选择分值是否加上该格子的 数值,每次游戏的初始分数都是0. Winder 想知道在每场游戏,他最多能够得到多少分值.但是,Winder 很懒,所以你必 须帮他来完成这件事. 数据输入 输入第一行两个正整数N 和M(0<

  • C语言实现猜数字小游戏

    本文实例为大家分享了C语言猜数字的具体代码,供大家参考,具体内容如下 一.描述 猜数字游戏. 二. 程序 使用srand((unsigned)time(NULL)),产生随机数种子. int random = rand() % 100 + 1,产生0~100之间的随机数. 应加上头文件#include<time.h> #include<stdio.h> #include<windows.h> #include<time.h> void menu(){ pri

  • C语言实现猜数字游戏

    本文实例为大家分享了C语言猜数字的具体代码,供大家参考,具体内容如下 题目:电脑随机给出一个数字,在一定范围内猜,有提示 问题分析: 电脑根据函数随机给出一个范围内的数字: 用户输入数字,去猜大小 对比数字,电脑给出提示 不断循环,直到猜正确 注意: 因为随机函数rand()是特殊的函数,计算机不会实现真正的随机数,所以需要一个seek来传给 rand(). 代码如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<

  • C语言实现简单猜数字小游戏

    本文实例为大家分享了Java实现图片旋转的具体代码,供大家参考,具体内容如下 猜数字游戏是令游戏机随机产生一个100以内的正整数 用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较 并提示大了("Too big"),还是小了("Too small"),相等表示猜到了 如果猜到,则结束程序.程序还要求统计猜的次数,如果1次猜出该数,提示"Bingo!" 如果3次以内猜到该数,则提示"Lucky You!"

随机推荐