使用指定的一张图片实现滑动拼图游戏 使用c语言和easyX
时间: 2024-02-12 18:09:06 浏览: 125
好的,使用EasyX图形库可以实现滑动拼图游戏。以下是一个简单的实现示例:
```c
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 3 // 拼图大小
#define BLOCK_SIZE 100 // 拼图块大小
#define WINDOW_WIDTH (SIZE * BLOCK_SIZE)
#define WINDOW_HEIGHT (SIZE * BLOCK_SIZE)
IMAGE *image; // 图片
IMAGE *blocks[SIZE][SIZE]; // 拼图块
int game[SIZE][SIZE]; // 拼图状态
void init_game() {
int i, j, k = 0;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
game[i][j] = k++;
}
}
game[SIZE-1][SIZE-1] = -1; // -1表示空格
}
void shuffle_game(int steps) {
int i, j, k, x, y;
srand(time(NULL));
for (k = 0; k < steps; k++) {
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (game[i][j] == -1) {
x = i;
y = j;
break;
}
}
}
switch (rand() % 4) {
case 0:
if (x > 0) {
game[x][y] = game[x-1][y];
game[x-1][y] = -1;
}
break;
case 1:
if (x < SIZE-1) {
game[x][y] = game[x+1][y];
game[x+1][y] = -1;
}
break;
case 2:
if (y > 0) {
game[x][y] = game[x][y-1];
game[x][y-1] = -1;
}
break;
case 3:
if (y < SIZE-1) {
game[x][y] = game[x][y+1];
game[x][y+1] = -1;
}
break;
}
}
}
void load_image(char *filename) {
image = newimage();
getimage(image, filename);
setaspectratio(1.0 * WINDOW_WIDTH / WINDOW_HEIGHT);
}
void load_blocks() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (game[i][j] == -1) {
blocks[i][j] = NULL;
} else {
blocks[i][j] = newimage();
getimage(blocks[i][j], image, j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
}
}
}
void draw_game() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (blocks[i][j] != NULL) {
putimage(j * BLOCK_SIZE, i * BLOCK_SIZE, blocks[i][j]);
}
}
}
}
int check_game() {
int i, j, k = 0;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (game[i][j] != k++ && !(i == SIZE-1 && j == SIZE-1)) {
return 0;
}
}
}
return 1;
}
int main() {
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
init_game();
load_image("image.jpg");
shuffle_game(100);
load_blocks();
while (!check_game()) {
draw_game();
int x, y, dx, dy;
printf("请输入要移动的块的坐标(x y): ");
scanf("%d%d", &x, &y);
if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || blocks[x][y] == NULL) {
printf("无效的坐标,请重新输入!\n");
continue;
}
printf("请输入移动方向(-1 0 1 0或0 -1 0 1): ");
scanf("%d%d", &dx, &dy);
if ((dx == -1 && x == 0) || (dx == 1 && x == SIZE-1) ||
(dy == -1 && y == 0) || (dy == 1 && y == SIZE-1)) {
printf("无法移动,请重新输入!\n");
continue;
}
game[x][y] = -1;
game[x+dx][y+dy] = blocks[x][y];
blocks[x+dx][y+dy] = blocks[x][y];
blocks[x][y] = NULL;
}
draw_game();
printf("恭喜你,拼图成功!\n");
getch();
closegraph();
return 0;
}
```
这个实现使用了EasyX图形库,首先通过initgraph函数创建窗口,然后通过load_image函数加载指定的图片,并将其分割成SIZE x SIZE个拼图块。通过init_game函数初始化拼图状态,然后通过shuffle_game函数随机打乱拼图。打乱完成后进入主循环,每次循环先使用draw_game函数绘制当前的拼图状态,然后读取玩家的输入,如果玩家输入的坐标和移动方向合法,则移动相应的拼图块。移动完成后再次检查拼图是否已经完成。如果拼图已经完成,则退出循环并输出恭喜信息。最后使用getch函数等待玩家按下任意键,然后使用closegraph函数关闭窗口。
阅读全文