#include<iostream> #include<conio.h> #include<time.h> #include<stdlib.h> #define ROW 25 #define COL 80 int Net[ROW][COL] = { 0 }; int posCharX = 0; int posCharY = 0; int posBoxX = 0; int posBoxY = 0; int count = 0; using namespace std; void makeMap(); void printMap(); void creatCharAndBox(); void moveChar(); void pushBox(char key); int isItAble(char key); void IfSuccess(char key); int main() { ios::sync_with_stdio(false); srand((unsigned)time(0)); makeMap(); creatCharAndBox(); printMap(); moveChar(); } void makeMap() { int pos1 = rand() % 25 + 1; int pos2 = rand() % 25 + 1; for (int i = 0; i<25; i++) { if (i != pos1) Net[i][34] = 1; else Net[i][34] = 0; if (i != pos2) Net[i][44] = 1; else Net[i][44] = 0; } Net[11][79] = 1; Net[11][78] = 1; Net[12][78] = 8; Net[12][79] = 8; Net[13][78] = 8; Net[13][79] = 8; Net[14][79] = 1; Net[14][78] = 1; } void printMap() { for (int i = 0; i < ROW; i++) for (int j = 0; j < COL; j++) if (Net[i][j] == 0) cout << " "; else if (Net[i][j] == 1) cout << '\5'; else if (Net[i][j] == 3) cout << '\4'; else if (Net[i][j] == 2) cout << '\2'; else if (Net[i][j] == 8) cout << '\3'; } void moveChar() { char key; while (1) { key = _getch(); switch (key) { case 72: if(isItAble(key)==0) break; pushBox(key); Net[posCharY][posCharX] = 0; //shang posCharY -= 1; Net[posCharY][posCharX] = 2; break; case 77: if(isItAble(key)==0) break; pushBox(key); IfSuccess(key); Net[posCharY][posCharX] = 0; //you posCharX += 1; Net[posCharY][posCharX] = 2; break; case 80: if(isItAble(key)==0) break; pushBox(key); Net[posCharY][posCharX] = 0; //xia posCharY += 1; Net[posCharY][posCharX] = 2; break; case 75: if(isItAble(key)==0) break; pushBox(key); Net[posCharY][posCharX] = 0; //zuo posCharX -= 1; Net[posCharY][posCharX] = 2; break; } system("cls"); printMap(); if(count >=2){ system("cls"); cout << "You Win!"; break; } } } void creatCharAndBox() { posCharX = rand() % 34; posCharY = rand() % 25; posBoxX = rand() % 34; posBoxY = rand() % 25; Net[posCharY][posCharX] = 2; Net[posBoxY][posBoxX] = 3; if (posCharX == posBoxX && posCharY == posBoxY) { cout << "Erorr!"; } // 人用数字2表示,箱子用数字3表示。 } int isItAble(char key) { int x=1; /* None Box */ if(Net[posCharY][posCharX+1] == 1 && key==77) return x=0; if(Net[posCharY][posCharX-1] == 1 && key==75) return x=0; if(Net[posCharY+1][posCharX] == 1 && key==80) return x=0; if(Net[posCharY-1][posCharX] == 1 && key==72) return x=0; /* With Box*/ if(Net[posBoxY][posBoxX+1] == 1 && key==77&& Net[posCharY][posCharX+1] == Net[posBoxY][posBoxX]) return x=0; if(Net[posBoxY][posBoxX-1] == 1 && key==75&& Net[posCharY][posCharX-1] == Net[posBoxY][posBoxX] ) return x=0; if(Net[posBoxY+1][posBoxX] == 1 && key==80&& Net[posCharY+1][posCharX]== Net[posBoxY][posBoxX] ) return x=0; if(Net[posBoxY-1][posBoxX] == 1 && key==72&& Net[posCharY-1][posCharX]== Net[posBoxY][posBoxX]) return x=0; return x; } void pushBox(char key){ if(Net[posCharY][posCharX+1]== Net[posBoxY][posBoxX] && key==77){ Net[posBoxY][posBoxX] = 0; posBoxX+=1; Net[posBoxY][posBoxX] = 3; } if(Net[posCharY][posCharX-1] == Net[posBoxY][posBoxX] && key ==75){ Net[posBoxY][posBoxX] = 0; posBoxX-=1; Net[posBoxY][posBoxX] = 3; } if(Net[posCharY+1][posCharX]== Net[posBoxY][posBoxX] && key == 80){ Net[posBoxY][posBoxX] = 0; posBoxY+=1; Net[posBoxY][posBoxX] = 3; } if(Net[posCharY-1][posCharX]== Net[posBoxY][posBoxX] && key== 72){ Net[posBoxY][posBoxX] = 0; posBoxY-=1; Net[posBoxY][posBoxX] = 3; } } void IfSuccess(char key) { if(Net[posBoxY][posBoxX+1] == 8 && key ==77) count++; }
这个推箱子是基于一个二位数组的,通过改变二位数组的一些数字来表示整个地图,然而美中不足的是这样的方法效率很差,游戏在人移动的时候会稍微闪屏,这个不知道有没有大神可以教我如何避免闪屏。
厉害啦~~~
大学时光没有浪费呀!
在大学里,没事写些自己感兴趣的东西还是很有成就感的
厉害了我的弟
厉害厉害,学了这么久的C++,可是我都不怎么会写