话不多说,上
代码
#include<stdio.h> #include<stdlib.h> #include<conio.h> void PrintUI(int(*GUI)[32]) { for (int i = 0; i < 16; i++) { for (int j = 0; j < 32; j++) { if (GUI[i][j] == 1) printf("█"); else if (GUI[i][j] == 0) printf(" "); else if (GUI[i][j] == 2) printf("◇"); else if (GUI[i][j] == 3) printf("●"); else if (GUI[i][j] == 4) printf("□"); } printf("\n"); } } void Preset(int(*GUI)[32]) { int GUI2[16][32] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, }; for (int i = 0; i < 16; i++) { for (int j = 0; j < 32; j++) { GUI[i][j] = GUI2[i][j]; } } } void UIData(int(*GUI)[32]) { printf("用0表示空区 用1表示障碍 用2表示箱子 用3表示人物 用4表示置区,游戏区域高*宽:16*32\n "); printf("最外一层必须都是障碍,否则游戏可能崩溃\n"); printf("箱子和置区数量应该相等\n"); printf("文件以ui.dat命名,用记事本编辑文件,数字间有空格\n"); printf("1:4示例:\n"); printf("1 1 1 1 1 1 1 1\n"); printf("1 0 0 0 0 0 0 1\n"); printf("1 4 2 3 0 0 0 1\n"); printf("1 1 1 1 1 1 1 1\n\n"); printf("████████\n"); printf("█ █\n"); printf("█□◇● █\n"); printf("████████\n\n"); FILE* filep = fopen("ui.dat", "r+"); if (filep) { for (int i = 0; i < 16; i++) { for (int j = 0; j < 32; j++) { fscanf(filep, "%d", &GUI[i][j]); } } fclose(filep); getch(); system("cls"); PrintUI(GUI); } else { printf("NOT FOUND \"ui.dat\""); } } int* Find_3(const int(*GUI)[32], int *Position_3) { for (int i = 0; i < 16; i++) { for (int j = 0; j < 32; j++) { if (GUI[i][j] == 3) { Position_3[0] = i; Position_3[1] = j; return Position_3; } } } } void Find_4(const int(*GUI)[32], int(*Position_4)[2],int* Num4) { int ii = 0; for (int i = 0; i < 16; i++) { for (int j = 0; j < 32; j++) { if (GUI[i][j] == 4 && ii < 10) { if (GUI[i][j] == 4) { Position_4[ii][0] = i; Position_4[ii][1] = j; *Num4 = *Num4 + 1; } ii++; } } } } int Flag_4(int(*GUI)[32],const int(*Position_4)[2],const int *Num4) { int flag = 0; for (int i = 0; i < *Num4; i++) { if (GUI[Position_4[i][0]][Position_4[i][1]] != 4) if (GUI[Position_4[i][0]][Position_4[i][1]] != 3) if (GUI[Position_4[i][0]][Position_4[i][1]] != 0) flag++; } if (flag == *Num4) { printf("FUCK!YOU WIN!GET OUT!\n"); return 1; } else return 0; } void OperateGUI(char KeyBoardInput, int(*GUI)[32]) { int Position_3[2] = { 0 }; //Position_3[0]是i,Position_3[1]是j system("cls"); if (KeyBoardInput == 'w') { Find_3(GUI, Position_3); if (GUI[Position_3[0] - 1][Position_3[1]] == 0 || GUI[Position_3[0] - 1][Position_3[1]] == 4) //上一格是空区或置区 { GUI[Position_3[0] - 1][Position_3[1]] = 3; //人物上一格 GUI[Position_3[0]][Position_3[1]] = 0; //原位置置空 } else if (GUI[Position_3[0] - 1][Position_3[1]] == 2) //上一格是箱子 { if (GUI[Position_3[0] - 2][Position_3[1]] == 0 || GUI[Position_3[0] - 2][Position_3[1]] == 4) //上两格是空区或置区 { GUI[Position_3[0] - 2][Position_3[1]] = 2; GUI[Position_3[0] - 1][Position_3[1]] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } } } else if (KeyBoardInput == 's') { Find_3(GUI, Position_3); if (GUI[Position_3[0] + 1][Position_3[1]] == 0 || GUI[Position_3[0] + 1][Position_3[1]] == 4) //下一格是空区或置区 { GUI[Position_3[0] + 1][Position_3[1]] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } else if (GUI[Position_3[0] + 1][Position_3[1]] == 2) //下一格是箱子 { if (GUI[Position_3[0] + 2][Position_3[1]] == 0 || GUI[Position_3[0] + 2][Position_3[1]] == 4) //下两格是空区 { GUI[Position_3[0] + 2][Position_3[1]] = 2; GUI[Position_3[0] + 1][Position_3[1]] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } } } else if (KeyBoardInput == 'a') { Find_3(GUI, Position_3); if (GUI[Position_3[0]][Position_3[1] - 1] == 0 || GUI[Position_3[0]][Position_3[1] - 1] == 4) //左一格是空区或置区 { GUI[Position_3[0]][Position_3[1] - 1] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } else if (GUI[Position_3[0]][Position_3[1] - 1] == 2) //左一格是箱子 { if (GUI[Position_3[0]][Position_3[1] - 2] == 0 || GUI[Position_3[0]][Position_3[1] - 2] == 4) { GUI[Position_3[0]][Position_3[1] - 2] = 2; GUI[Position_3[0]][Position_3[1] - 1] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } } } else if (KeyBoardInput == 'd') { Find_3(GUI, Position_3); if (GUI[Position_3[0]][Position_3[1] + 1] == 0 || GUI[Position_3[0]][Position_3[1] + 1] == 4) //右一格是空区 { GUI[Position_3[0]][Position_3[1] + 1] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } else if (GUI[Position_3[0]][Position_3[1] + 1] == 2) //右一格是箱子 { if (GUI[Position_3[0]][Position_3[1] + 2] == 0 || GUI[Position_3[0]][Position_3[1] + 2] == 4) { GUI[Position_3[0]][Position_3[1] + 2] = 2; GUI[Position_3[0]][Position_3[1] + 1] = 3; GUI[Position_3[0]][Position_3[1]] = 0; } } } PrintUI(GUI); } int main() { int GUI[16][32]; int Position_4[10][2] = { 0 }; int xz = 0; printf("推箱子 @指针 作品\n"); printf("1.预置关卡\n2.导入关卡\n输入数字>>>"); scanf("%d", &xz); if (1 == xz) Preset(GUI); else if (2 == xz) UIData(GUI); int Num4 = 0; //计算箱子数量 Find_4(GUI, Position_4,&Num4); char KeyBoardInput = 0; printf("操作:上'w'下's'左'a'右'd'\n"); while (1) { KeyBoardInput = getch(); switch (KeyBoardInput) { case 'w': //上 OperateGUI(KeyBoardInput, GUI); break; case 's': //下 OperateGUI(KeyBoardInput, GUI); break; case 'a': //左 OperateGUI(KeyBoardInput, GUI); break; case 'd': //右 OperateGUI(KeyBoardInput, GUI); break; } if (Flag_4(GUI,Position_4,&Num4)) //获取置区状态 { system("color 1f"); //置区已消失 break; } else { for (int i = 0; i < Num4; i++) { if (GUI[Position_4[i][0]][Position_4[i][1]] != 2 && GUI[Position_4[i][0]][Position_4[i][1]] != 3) GUI[Position_4[i][0]][Position_4[i][1]] = 4; } system("cls"); PrintUI(GUI); } } return 0; }
代码