利用c语言图形库,通过链表实现七巧板,并且可以自动判定游戏是否结束
时间: 2023-07-15 14:10:26 浏览: 122
实现七巧板的游戏可以分为以下几个步骤:
1. 使用图形库创建游戏窗口,并绘制七巧板的背景图案。
2. 使用链表来存储七巧板中各个形状的坐标信息。每个形状可以看作是一个链表节点,包含该形状的起始坐标、宽度、高度和节点指针等信息。
3. 实现七巧板的拖拽功能。通过监听鼠标事件,找到当前鼠标所在的形状,记录下鼠标与该形状的偏移量,并将该形状从链表中移除。
4. 实现七巧板的旋转功能。通过监听键盘事件,实现对当前选中的形状进行旋转操作。
5. 实现七巧板的碰撞检测功能。每当有形状被拖拽后,需要检测该形状是否与其他形状发生重叠,以及是否超出了七巧板的边界,如果是,则不能放置该形状。
6. 实现游戏结束的判定。当所有形状都被正确地放置在七巧板中,游戏结束。
下面是一个简单的示例代码,可以帮助你更好地理解如何实现七巧板的游戏。
```c
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define WIDTH 800
#define HEIGHT 600
// 链表节点
typedef struct node {
int x, y; // 坐标
int w, h; // 宽度和高度
struct node *next; // 指向下一个节点的指针
} Node;
// 创建链表节点
Node *create_node(int x, int y, int w, int h) {
Node *node = (Node *)malloc(sizeof(Node));
node->x = x;
node->y = y;
node->w = w;
node->h = h;
node->next = NULL;
return node;
}
// 添加节点到链表
void add_node(Node **head, Node *node) {
if (*head == NULL) {
*head = node;
} else {
Node *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
}
// 删除节点
void delete_node(Node **head, Node *node) {
if (*head == NULL || node == NULL) {
return;
}
if (*head == node) {
*head = node->next;
} else {
Node *p = *head;
while (p != NULL && p->next != node) {
p = p->next;
}
if (p != NULL) {
p->next = node->next;
}
}
free(node);
}
// 清空链表
void clear_list(Node **head) {
Node *p = *head;
while (p != NULL) {
Node *temp = p;
p = p->next;
free(temp);
}
*head = NULL;
}
// 判断两个矩形是否重叠
int rect_overlap(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
if (x1 + w1 <= x2 || x2 + w2 <= x1 || y1 + h1 <= y2 || y2 + h2 <= y1) {
return 0;
} else {
return 1;
}
}
// 判断是否可以放置该形状
int can_place(Node *shape, Node *head) {
while (head != NULL) {
if (rect_overlap(shape->x, shape->y, shape->w, shape->h, head->x, head->y, head->w, head->h)) {
return 0;
}
head = head->next;
}
if (shape->x < 0 || shape->y < 0 || shape->x + shape->w > WIDTH || shape->y + shape->h > HEIGHT) {
return 0;
}
return 1;
}
// 判断游戏是否结束
int is_game_over(Node *head) {
while (head != NULL) {
if (head->x < 0 || head->y < 0 || head->x + head->w > WIDTH || head->y + head->h > HEIGHT) {
return 0;
}
head = head->next;
}
return 1;
}
int main() {
// 初始化图形库
initgraph(WIDTH, HEIGHT);
// 绘制七巧板的背景图案
setfillcolor(BLACK);
bar(0, 0, WIDTH, HEIGHT);
setfillcolor(DARKGRAY);
fillrectangle(100, 100, 500, 500);
setfillcolor(WHITE);
fillrectangle(120, 120, 480, 480);
setfillcolor(DARKGRAY);
fillrectangle(140, 140, 460, 460);
setfillcolor(WHITE);
fillrectangle(160, 160, 440, 440);
setfillcolor(DARKGRAY);
fillrectangle(180, 180, 420, 420);
setfillcolor(WHITE);
fillrectangle(200, 200, 400, 400);
// 创建链表并添加形状节点
Node *head = NULL;
add_node(&head, create_node(300, 200, 40, 40)); // 方块
add_node(&head, create_node(200, 300, 40, 80)); // 长条
add_node(&head, create_node(100, 200, 40, 40)); // 方块
add_node(&head, create_node(200, 200, 40, 40)); // 方块
add_node(&head, create_node(400, 200, 40, 40)); // 方块
add_node(&head, create_node(300, 300, 40, 40)); // 方块
add_node(&head, create_node(400, 300, 40, 40)); // 方块
// 绘制形状
Node *p = head;
while (p != NULL) {
setfillcolor(YELLOW);
fillrectangle(p->x, p->y, p->x + p->w, p->y + p->h);
p = p->next;
}
// 循环处理鼠标和键盘事件
int is_dragging = 0; // 是否正在拖拽
Node *selected = NULL; // 当前选中的形状
int offset_x = 0, offset_y = 0; // 鼠标与选中形状的偏移量
while (!is_game_over(head)) {
if (kbhit()) {
// 处理键盘事件
char ch = getch();
if (ch == 'r' && selected != NULL) {
// 旋转选中的形状
int temp = selected->w;
selected->w = selected->h;
selected->h = temp;
cleardevice();
setfillcolor(BLACK);
bar(0, 0, WIDTH, HEIGHT);
setfillcolor(DARKGRAY);
fillrectangle(100, 100, 500, 500);
setfillcolor(WHITE);
fillrectangle(120, 120, 480, 480);
setfillcolor(DARKGRAY);
fillrectangle(140, 140, 460, 460);
setfillcolor(WHITE);
fillrectangle(160, 160, 440, 440);
setfillcolor(DARKGRAY);
fillrectangle(180, 180, 420, 420);
setfillcolor(WHITE);
fillrectangle(200, 200, 400, 400);
p = head;
while (p != NULL) {
setfillcolor(YELLOW);
fillrectangle(p->x, p->y, p->x + p->w, p->y + p->h);
p = p->next;
}
}
}
if (ismouseclick(WM_LBUTTONDOWN)) {
// 处理鼠标按下事件
int x = mousex();
int y = mousey();
p = head;
while (p != NULL) {
if (x >= p->x && x <= p->x + p->w && y >= p->y && y <= p->y + p->h) {
// 找到当前鼠标所在的形状
is_dragging = 1;
selected = p;
offset_x = x - p->x;
offset_y = y - p->y;
delete_node(&head, p);
break;
}
p = p->next;
}
}
if (ismouseclick(WM_LBUTTONUP)) {
// 处理鼠标松开事件
if (is_dragging) {
// 放置选中的形状
int x = mousex() - offset_x;
int y = mousey() - offset_y;
selected->x = x;
selected->y = y;
if (can_place(selected, head)) {
add_node(&head, selected);
} else {
free(selected);
}
is_dragging = 0;
selected = NULL;
}
}
if (is_dragging) {
// 处理鼠标拖拽事件
int x = mousex() - offset_x;
int y = mousey() - offset_y;
selected->x = x;
selected->y = y;
cleardevice();
setfillcolor(BLACK);
bar(0, 0, WIDTH, HEIGHT);
setfillcolor(DARKGRAY);
fillrectangle(100, 100, 500, 500);
setfillcolor(WHITE);
fillrectangle(120, 120, 480, 480);
setfillcolor(DARKGRAY);
fillrectangle(140, 140, 460, 460);
setfillcolor(WHITE);
fillrectangle(160, 160, 440, 440);
setfillcolor(DARKGRAY);
fillrectangle(180, 180, 420, 420);
setfillcolor(WHITE);
fillrectangle(200, 200, 400, 400);
p = head;
while (p != NULL) {
setfillcolor(YELLOW);
fillrectangle(p->x, p->y, p->x + p->w, p->y + p->h);
p = p->next;
}
setfillcolor(YELLOW);
fillrectangle(x, y, x + selected->w, y + selected->h);
}
}
// 清空链表
clear_list(&head);
// 关闭图形库
closegraph();
return 0;
}
```
阅读全文