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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。