c语言用链表实现七巧板,并且自动判定游戏是否结束

时间: 2023-07-15 17:10:39 浏览: 56
实现七巧板需要使用链表数据结构,可以用一个结构体来表示每个块的形状,位置和状态。同时需要定义一个链表节点结构体,来存储每个块的信息。 下面是一个示例代码,可以实现七巧板的游戏和自动判定游戏是否结束: ```c #include<stdio.h> #include<stdlib.h> #define MAX_ROW 5 // 七巧板所在的二维平面最大行数 #define MAX_COL 4 // 七巧板所在的二维平面最大列数 #define MAX_BLOCK 7 // 七巧板的块数 // 定义七巧板块的形状 char shapes[MAX_BLOCK][MAX_ROW][MAX_COL+1] = { { "****", "", "", "" }, { "**", "**", "", "" }, { "***", "*", "", "" }, { "**", "**", " ", "" }, { "****", " *", "", "" }, { "***", "**", "", "" }, { " **", "** ", "", "" } }; // 定义七巧板块的颜色 char colors[MAX_BLOCK] = {'R', 'G', 'B', 'Y', 'M', 'C', 'K'}; // 定义坐标结构体 struct Point{ int x; int y; }; // 定义七巧板块结构体 struct Block{ char shape[MAX_ROW][MAX_COL+1]; char color; struct Point pos; int state; }; // 定义链表节点结构体 struct Node{ struct Block block; struct Node* next; }; // 定义函数原型 void print_board(char board[MAX_ROW][MAX_COL+1]); int check_board(struct Node* head, char board[MAX_ROW][MAX_COL+1]); void insert_node(struct Node** head, struct Block block); void remove_node(struct Node** head, struct Block block); int is_valid_pos(char board[MAX_ROW][MAX_COL+1], struct Block block); int is_game_over(struct Node* head, char board[MAX_ROW][MAX_COL+1]); int main(){ char board[MAX_ROW][MAX_COL+1]; // 定义七巧板所在的二维平面 struct Node* head = NULL; // 定义链表头指针 int i, j; // 初始化七巧板所在的二维平面 for(i=0; i<MAX_ROW; i++){ for(j=0; j<MAX_COL; j++){ board[i][j] = ' '; } board[i][MAX_COL] = '\0'; } // 插入所有的七巧板块 for(i=0; i<MAX_BLOCK; i++){ struct Block block; int row, col; for(row=0; row<MAX_ROW; row++){ for(col=0; col<MAX_COL; col++){ block.shape[row][col] = shapes[i][row][col]; } block.shape[row][MAX_COL] = '\0'; } block.color = colors[i]; block.pos.x = 0; block.pos.y = 0; block.state = 0; insert_node(&head, block); } // 开始游戏 while(!is_game_over(head, board)){ struct Node* p = head; while(p){ // 尝试移动当前块到所有合法位置 int state = p->block.state; while(is_valid_pos(board, p->block)){ p->block.state++; if(check_board(head, board)){ break; } } if(p->block.state == state){ // 当前块无法移动,尝试移除当前块 remove_node(&head, p->block); p = head; }else{ // 当前块移动成功,继续下一块 p = p->next; } } // 打印当前游戏状态 print_board(board); } printf("Game over!\n"); return 0; } // 打印七巧板所在的二维平面 void print_board(char board[MAX_ROW][MAX_COL+1]){ int i; for(i=0; i<MAX_ROW; i++){ printf("%s\n", board[i]); } printf("\n"); } // 判断当前游戏是否结束 int is_game_over(struct Node* head, char board[MAX_ROW][MAX_COL+1]){ struct Node* p = head; while(p){ // 尝试移动当前块到所有合法位置 int state = p->block.state; while(is_valid_pos(board, p->block)){ p->block.state++; if(check_board(head, board)){ break; } } if(p->block.state != state){ // 当前块可以移动,游戏未结束 return 0; } p = p->next; } // 所有块都无法移动,游戏结束 return 1; } // 检查当前七巧板所在的二维平面是否合法 int check_board(struct Node* head, char board[MAX_ROW][MAX_COL+1]){ int i, j; struct Node* p = head; while(p){ // 检查当前块是否越界 int row, col; for(row=0; row<MAX_ROW; row++){ for(col=0; col<MAX_COL; col++){ if(p->block.shape[row][col] == '*'){ int x = p->block.pos.x + row; int y = p->block.pos.y + col; if(x<0 || x>=MAX_ROW || y<0 || y>=MAX_COL){ return 0; } } } } // 检查当前块是否与其他块重叠 struct Node* q = head; while(q != p){ int row, col; for(row=0; row<MAX_ROW; row++){ for(col=0; col<MAX_COL; col++){ if(q->block.shape[row][col] == '*'){ int x1 = p->block.pos.x + row; int y1 = p->block.pos.y + col; int x2 = q->block.pos.x + row; int y2 = q->block.pos.y + col; if(x1 == x2 && y1 == y2){ return 0; } } } } q = q->next; } // 更新当前块的位置 for(row=0; row<MAX_ROW; row++){ for(col=0; col<MAX_COL; col++){ if(p->block.shape[row][col] == '*'){ int x = p->block.pos.x + row; int y = p->block.pos.y + col; board[x][y] = p->block.color; } } } p = p->next; } return 1; } // 插入新的七巧板块到链表中 void insert_node(struct Node** head, struct Block block){ struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->block = block; node->next = *head; *head = node; } // 从链表中移除指定的七巧板块 void remove_node(struct Node** head, struct Block block){ struct Node* p = *head; struct Node* prev = NULL; while(p){ if(p->block.color == block.color){ if(prev){ prev->next = p->next; }else{ *head = p->next; } free(p); break; } prev = p; p = p->next; } } // 判断当前块是否可以移动到所有合法位置 int is_valid_pos(char board[MAX_ROW][MAX_COL+1], struct Block block){ int row, col; for(row=0; row<MAX_ROW; row++){ for(col=0; col<MAX_COL; col++){ int x = block.pos.x + row; int y = block.pos.y + col; if(block.shape[row][col] == '*' && (x<0 || x>=MAX_ROW || y<0 || y>=MAX_COL || board[x][y]!=' ')){ return 0; } } } return 1; } ``` 这个程序可以实现七巧板的游戏和自动判定游戏是否结束。在游戏过程中,程序会尝试移动每个块到所有合法位置,如果当前块无法移动,则尝试移除当前块。当所有块都无法移动时,游戏结束。在检查七巧板所在的二维平面是否合法时,程序会检查每个块是否越界或者与其他块重叠。如果检查失败,则当前块无法移动。

相关推荐

最新推荐

recommend-type

C语言数据结构实现链表逆序并输出

主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
recommend-type

C语言链表题目(附答案).docx

大一初学C语言时的期末作业,涉及到链表的建立和功能的实现,涉及指针、函数、动态结构建立等方面的知识,初学者可以参考参考尝试尝试哟!!!
recommend-type

课设报告-“贪吃蛇_C语言_链表实现”-CSDN~.docx

课设报告-“贪吃蛇_C语言_链表实现~_课设”中 兑现将课设报告另发一篇博客~
recommend-type

C语言实现带头结点的链表的创建、查找、插入、删除操作

主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以参考下
recommend-type

C语言实现食堂就餐管理系统(带链表)

主要为大家详细介绍了C语言实现食堂就餐管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。