C语言连连看

C语言实现连连看
该博客围绕C语言实现连连看展开,但目前内容未完成。主要涉及用C语言进行编程开发连连看游戏这一信息技术相关内容。

还没写完,先晾在这边

#include<stdio.h>
int row_len;
int column_len;
int arr[1000][1000];
void start();
void show();
void init();


int max(int n1,int n2);
int min(int n1,int n2);
struct Point {
	int x;
	int y;
};
struct Point p1;
struct Point p2;
struct Point p3;
struct Point p;
struct Point temp;
int isSameLine(struct Point pi1,struct Point pi2);
int isSingleBrokenLine(struct Point pi1,struct Point pi2);
int  horizonVerify();//水平判定
int docheck(struct Point pi1,struct Point pi2);
void getPoint(struct Point p1, struct Point p2);
void main(){
	start();
	while(1){
	  docheck(p1,p2);	
	}
}
void start(){
	printf("难度系数控制\n");
	printf("输入行数\n");
	scanf("%d",&row_len);
	printf("\n输入列数\n");
	scanf("%d",&column_len);
	if(column_len%2!=0){
		printf("请保证输入的列数是偶数\n");
		exit();
	}
	init();
	show();
}
void getPoint(){
	printf("输入第一点的坐标x\n");
	scanf("%d",&p1.x);
	printf("输入第一点的坐标y\n");
	scanf("%d",&p1.y);
	printf("输入第二点的坐标x\n");
	scanf("%d",&p2.x);
	printf("输入第二点的坐标y\n");
	scanf("%d",&p2.y);
	
}

int docheck(struct Point pi1,struct Point pi2){
	 
	printf("输入第一点的坐标x\n");
	scanf("%d",&pi1.x);
	printf("输入第一点的坐标y\n");
	scanf("%d",&pi1.y);
	printf("输入第二点的坐标x\n");
	scanf("%d",&pi2.x);
	printf("输入第二点的坐标y\n");
	scanf("%d",&pi2.y);
	
     printf("%d=%d\n",pi1.x,pi1.y);
	
	if(arr[pi1.y][pi1.x]==arr[pi2.y][pi2.x]){
		if(isSameLine(pi1,pi2)||isSingleBrokenLine(pi1,pi2)){
			arr[pi1.y][pi1.x]=0;
			arr[pi2.y][pi2.x]=0;
		}
		show();
	}else{
		printf("两点值不同");
	}
}
int max(int n1,int n2){
	if(n1>n2){
		return n1;
	}
	return n2;
}
int min(int n1,int n2){
    if(n1<n2){
		return n1;
	}
	return n2;
}
/*
	直线连通
*/
int isSameLine(struct Point p1,struct Point p2){
	int min_y;
	int max_y;
	int min_x;
	int max_x;
	int i;
	if(p1.x==p2.x){
		min_y=min(p1.y,p2.y);
		max_y=max(p2.y,p1.y);
		
		for(i=min_y+1;i<max_y;i++){
			if(arr[i][p1.x]!=0){
				return 0;
			}
		}
			if(i==max_y){
				return 1;
			} 
	}else if(p1.y==p2.y){
	    min_x=min(p1.x,p2.x);
		max_x=max(p1.x,p2.x);
		for(i=min_x+1;i<max_x;i++){
			if(arr[p1.y][i]!=0){
				return 0;
				}
			}
			if(i==max_x){
				return 1;
			}
	}
	return 0;
}
int isSingleBrokenLine(struct Point pi1,struct Point pi2){
	int min_x;
	int max_x;
	int min_y;
	int max_y;
	int flag;
	int flag1;
	int i;
	int j;
	min_x=min(pi1.x,pi2.x);
	max_x=max(pi1.x,pi2.x);
	min_y=min(pi1.y,pi2.y);
	max_y=max(pi1.y,pi2.y);
	temp.x=min_x;
	temp.y=min_y;
	/*
       一拐点  
	*/
	if((temp.x==pi1.x && temp.y==pi1.y)|| (temp.x==pi2.x && temp.y==pi2.y)){
			flag=1;
			/*
		  左右两拐点都不为零的就返回零
		*/
		if(arr[max_y][min_x]!=0 && arr[min_y][max_x]!=0){
			return 0;
		}else if(arr[max_y][min_x]==0){//拐点为零
			for(i=min_y+1;i<max_y;i++){
				if(arr[i][min_x]!=0){
				   flag=0;
				   break;
				}
				if(flag){
					for(j=min_x+1;j<max_x;j++){
						if(arr[max_y][j]!=0){
							flag=0;
							break;
						}
					}	
				}
			}
				if(flag){
				 return 1;
			}	
		}else if(arr[min_y][max_x]==0){
			for(i=min_y+1;i<max_y;i++){
				if(arr[i][max_x]!=0){
				   flag=0;
				   break;
				}
				if(flag){
					for(j=min_x+1;j<max_x;j++){
						if(arr[min_y][j]!=0){
							flag=0;
							break;
						}
					}	
				}
			}
				if(flag){
				 return 1;
			}
		}
	}else if(pi1.x!=pi2.x&&pi1.y!=pi2.y){
		flag1=1;
		if(arr[min_y][min_x]!=0 && arr[max_y][max_x]!=0){
				return 0;
		}else if(arr[min_y][min_x]==0){
			for(i=min_y+1;i<max_y;i++){
					if(arr[i][min_x]!=0){
						flag1=0;
						break;
				}

				if(flag1){
					for(j=min_x+1;j<max_x;j++){
						if(arr[min_y][j]!=0){
						  flag1=0;
						  break;
						}
					}
				}
			}
				if(flag1){
					return 1;
				}
		}else if(arr[max_y][max_x]==0){
				for(i=min_y+1;i<max_y;i++){
					if(arr[i][max_x]!=0){
						flag1=0;
						break;
					}
					if(flag1){
						for(j=min_x+1;j<max_x;j++){
							if(arr[max_y][j]!=0){
							  flag1=0;
							  break;
							}
						}
					}
				}
				if(flag1){
					return 1;
			}
		}
	}
	return 0;
}

int horizonVerify(){
     int i;
	/*
		循环列
	*/
	 for(i=0;i<column_len;i++){
		 if(i!=p1.x && arr[p1.y][i]){
			 p.y=p1.y;
			 p.x=i;
		/*	 if(isSingleBrokenLine()&&isSingleBrokenLine()){
			 }*/
		 }
	 }

}
void init(){
	int i;
	int j;
	int z;
	int value;

	for(i=1;i<row_len-1;i++){
		for(j=1;j<column_len-1;j+=2){
			value=rand()%9+1;
			arr[i][j]=value;
			arr[i][j+1]=value;
		}
	}
			//随机交换
	for(z=0;z<column_len*row_len;z++){
		int x1;
		int y1;
		int x2;
		int y2;
		int temp;
		temp=0;
		x1=0;
		y1=0;
		x2=0;
		y2=0;
		while(x1==0){
		   x1=rand()%(column_len-1);
		}
		while(x2==0){
			x2=rand()%(column_len-1);
		}
		while(y1==0){
			y1=rand()%(row_len-1);
		}
		while(y2==0){
			y2=rand()%(row_len-1);
		}
	//printf("%d,%d",x1,y1);
	temp=arr[y1][x1];
	arr[y1][x1]=arr[y2][x2];
	arr[y2][x2]=temp;
	}

}
void show(){
	int i;
	int j;
	int k;

	printf("    ");	
	for(i=1;i<column_len-1;i++){
		printf("*%d*",i);
	}
	printf("\n");
	for(j=0;j<row_len;j++){
		if(j!=0 && j!=row_len-1 ){
			printf("%d",j);
		}else{
			printf(" ");
		}
		for(k=0;k<column_len;k++){
			printf(" %d ",arr[j][k]);
		}
	   printf("\n");
	}


}
### C语言实现连连看游戏 以下是基于C语言实现的一个简单版本的“连连看”游戏代码。该游戏通过命令行运行,使用二维数组存储游戏的状态,并通过ASCII字符展示游戏界面。 #### 游戏核心功能描述 1. **初始化游戏板**:创建一个固定大小的游戏板并随机填充图标。 2. **显示游戏界面**:将当前游戏状态以字符形式打印到控制台。 3. **用户交互**:允许玩家选择两个位置进行匹配。 4. **逻辑验证**:检查所选图标的连通性和匹配条件。 5. **胜利/失败检测**:当所有可消除的图标都被移除时结束游戏。 --- #### 完整代码示例 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 6 // 行数 #define COLS 8 // 列数 #define EMPTY 0 // 空白格子标记 // 初始化棋盘 void initializeBoard(int board[ROWS][COLS]) { int icons[] = {1, 2, 3, 4}; // 图标种类 srand(time(0)); for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { board[i][j] = icons[rand() % sizeof(icons)/sizeof(icons[0])]; } } } // 显示棋盘 void displayBoard(const int board[ROWS][COLS]) { for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { if (board[i][j] == EMPTY) { printf(". "); // 使用 '.' 表示空白区域 } else { printf("%d ", board[i][j]); } } printf("\n"); } } // 检查是否可以连线(此处仅做简单的相邻判断) int canConnect(const int board[ROWS][COLS], int r1, int c1, int r2, int c2) { if ((r1 == r2 && abs(c1 - c2) == 1) || (c1 == c2 && abs(r1 - r2) == 1)) { return 1; } return 0; } // 主程序入口 int main() { int board[ROWS][COLS]; // 初始化棋盘 initializeBoard(board); while (1) { system("clear"); // 清屏操作,在Windows下改为system("cls") displayBoard(board); int r1, c1, r2, c2; // 获取用户输入 printf("请输入第一个坐标 (row col): "); scanf("%d%d", &r1, &c1); printf("请输入第二个坐标 (row col): "); scanf("%d%d", &r2, &c2); // 验证输入合法性 if (r1 >= ROWS || c1 >= COLS || r2 >= ROWS || c2 >= COLS || board[r1][c1] == EMPTY || board[r2][c2] == EMPTY) { printf("非法输入,请重新尝试。\n"); continue; } // 检查是否能连接 if (!canConnect(board, r1, c1, r2, c2)) { printf("无法连接这两个图标,请重试。\n"); continue; } // 检查是否相同 if (board[r1][c1] != board[r2][c2]) { printf("选定的图标不一致,请重试。\n"); continue; } // 成功配对,清除图标 board[r1][c1] = EMPTY; board[r2][c2] = EMPTY; // 胜利条件检测 int allEmpty = 1; for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { if (board[i][j] != EMPTY) { allEmpty = 0; break; } } } if (allEmpty) { system("clear"); displayBoard(board); printf("恭喜您完成游戏!\n"); break; } } return 0; } ``` --- #### 功能说明 1. **`initializeBoard()` 函数** 此函数用于初始化游戏板,随机分配不同类型的图标给每个单元格[^1]。 2. **`displayBoard()` 函数** 将当前游戏板的内容以字符形式输出至终端窗口。如果某个单元为空,则用 `.` 来表示[^2]。 3. **`canConnect()` 函数** 这是一个非常基础的连通性检查方法,只支持水平或垂直方向上的直接相连情况。可以根据需求扩展更复杂的路径算法[^1]。 4. **主循环结构** 循环读取用户的两次点击位置作为待比较的一对图标;若满足规则则将其从游戏中删除,并继续直到整个棋盘被清空为止。 --- #### 可改进之处 - 增加更多样化的图标样式以及颜色区分度更高的视觉效果。 - 改善连通性的判定机制,比如加入曲线或者跳跃式的链接方式。 - 添加计分系统和时间限制等功能模块提升趣味性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值