准备:c/c++基础
code::blocks
第一次尝试:
自制地图:
将地图在控制台显示出来并控制中心位置的图案移动
#include <iostream> #include <windows.h> #include <conio.h> using namespace std; void start_map(int a[7][7]);//将数组对应的地图显示出来 int *man_move(int *p,int a[7][7]); int main() { int a[7][7]= {0}; a[1][3]=a[3][1]=a[5][3]=a[3][5]=3; a[2][3]=a[3][2]=a[3][4]=a[4][3]=2; a[3][3]=1; int *p;//指向操作对象 p=&a[3][3]; while(1) { start_map(a); p=man_move(p,a); system("cls"); } system("pause"); return 0; } void start_map(int a[7][7]) //将数组对应的地图显示出来 { for(int i=0; i<7; i++) { for(int j=0; j<7; j++) { switch(a[i][j]) { case 3: cout <<"□"; break;//箱子要到达的地方 case 2: cout<<"▼"; break;//箱子 case 1: cout<<"卍" ; break;//操作对象 default: cout<<"■";//墙壁 } } cout<< endl; } } int *man_move(int *p,int a[7][7]) { char input_move; input_move=getch();//输入移动方向 switch(input_move) { case 'w': { } ; break; case 's': cout << 1 ; break; case 'a': cout << 1 ; break; case 'd': cout << 1 ; break; } return p; }遇到的第一个问题是移动输入:
采取“cin”需要按回车,于是采用了“getch()”函数。关于getch()的具体情况可以去看看"C++之getch(),getche(),getchar()的区别"
第二次尝试:
在不考虑bug的情况下写出可执行的代码
#include <iostream> #include <windows.h> #include <conio.h> //#include <stdio.h> using namespace std; void start_map(int a[7][7]);//将数组对应的地图显示出来 int *man_move(int *p,int a[7][7]); int main() { int a[7][7]= {0}; a[1][3]=a[3][1]=a[5][3]=a[3][5]=3; a[2][3]=a[3][2]=a[3][4]=a[4][3]=2; a[3][3]=1; int *p=&a[3][3];//指向操作对象 p=&a[3][3]; while(1) { start_map(a); p=man_move(p,a); system("cls"); } system("pause"); return 0; } void start_map(int a[7][7]) //将数组对应的地图显示出来 { for(int i=0; i<7; i++) { for(int j=0; j<7; j++) { switch(a[i][j]) { case 5: cout<<"卍" ; break;//操作对象与箱子要到达的地方在同一位置 case 4: cout <<" "; break;//空白区域 case 3: cout <<"□"; break;//箱子要到达的地方 case 2: cout<<"▼"; break;//箱子 case 1: cout<<"卍" ; break;//操作对象 default: cout<<"■";//墙壁 } } cout<< endl; } } int *man_move(int* p,int a[7][7]) { char input_move; int *p1=p; input_move=getch();//输入移动方向 switch(input_move) { case 'w': { if(*(p-7)==4||*(p-7)==3) //上方为空 { *p1=4; //原位置置空 p=p1-7; //人物上移一格 if(*p==4) *p=1; else *p=5; } else if(*(p-7)==2) //上方有箱子 { if(*(p-14)==4||*(p-14)==3) { *p1=4; //原位置变为空白 *(p1-7)=1; //人物上移一格 *(p1-14)=2; //箱子上移一格 p=p1-7; //p指向现在的位置 } } } ; break; case 's': if(*(p+7)==4||*(p+7)==3) { *p1=4; p=p1+7; if(*p==4) *p=1; else *p=5; } else if(*(p+7)==2) { if(*(p+14)==4||*(p+14)==3) { *p1=4; *(p1+7)=1; *(p1+14)=2; p=p1+7; } } break; case 'a': if(*(p-1)==4||*(p-1)==3) { *p1=4; p=p1-1; if(*p==4) *p=1; else *p=5; } else if(*(p-1)==2) { if(*(p-2)==4||*(p-2)==3) { *p1=4; *(p1-1)=1; *(p1-2)=2; p=p1-1; } } break; case 'd': if(*(p+1)==4||*(p+1)==3) { *p1=4; p=p1+1; if(*p==4) *p=1; else *p=5; } else if(*(p+1)==2) { if(*(p+2)==4||*(p+2)==3) { *p1=4; *(p1+1)=1; *(p1+2)=2; p=p1+1; } } break; } return p; }此代码在这种地图上是无错误的.
但在这时有一个问题,即人物移动函数的代码重复性很高,很臃肿而且不清晰,我便考虑在函数内部加入一个函数.
代码就变成了
#include <iostream> #include <windows.h> #include <conio.h> //#include <stdio.h> using namespace std; void start_map(int a[7][7]);//将数组对应的地图显示出来 int *man_move(int *p); int *move_step(int pointer_move_number,int* p); int main() { int a[7][7]= {0}; a[1][3]=a[3][1]=a[5][3]=a[3][5]=3; a[2][3]=a[3][2]=a[3][4]=a[4][3]=2; a[3][3]=1; int *p=&a[3][3];//指向操作对象 p=&a[3][3]; while(1) { start_map(a); p=man_move(p); system("cls"); } system("pause"); return 0; } void start_map(int a[7][7]) //将数组对应的地图显示出来 { for(int i=0; i<7; i++) { for(int j=0; j<7; j++) { switch(a[i][j]) { case 6: cout<<"▼"; break;//箱子已到达目的地 case 5: cout<<"卍" ; break;//操作对象与箱子要到达的地方在同一位置 case 4: cout <<" "; break;//空白区域 case 3: cout <<"□"; break;//箱子要到达的地方 case 2: cout<<"▼"; break;//箱子 case 1: cout<<"卍" ; break;//操作对象 default: cout<<"■";//墙壁 } } cout<< endl; } } int *man_move(int* p) { char input_move; input_move=getch();//输入移动方向 switch(input_move) { case 'w': p=move_step(-7,p);//上移 break; case 's': p=move_step(7,p);//下移 break; case 'a': p=move_step(-1,p);//左移 break; case 'd': p=move_step(1,p);//右移 break; } return p; } int *move_step(int pointer_move_number,int* p) { int *p1=p; if(*(p+pointer_move_number)==4||*(p+pointer_move_number)==3) //移动方向上第一格为空 { *p1=4; //原位置置空 p=p1+pointer_move_number; //人物移一格 if(*p==4) *p=1; else *p=5; } else if(*(p+pointer_move_number)==2) //移动方向上第一格有箱子 { if(*(p+pointer_move_number*2)==4||*(p+pointer_move_number*2)==3)//移动方向上第二格为空 { *p1=4; //原位置变为空白 *(p1+pointer_move_number)=1; //人物移一格 *(p1+pointer_move_number*2)=2; //箱子移一格 p=p1+pointer_move_number; //p指向现在的位置 } } return p; }代码简洁了不少,而且更好修改了.
尝试成功,现在考虑真正可用的程序
第三次尝试:可用程序
原代码在移动判定时存在不足,即move_step()函数在某些情况下是不可靠的
我需要一个新的地图进行下一步优化和游戏性的提高
#include <iostream> #include <windows.h> #include <conio.h> //#include <stdio.h> int sign_win=0; using namespace std; void start_map(int a[15][15]);//将数组对应的地图显示出来,地图大小为15*15 int *man_move(int *p); int *move_step(int pointer_move_number,int* p); int main() { int a[15][15]= {0}; /* a[1][3]=a[3][1]=a[5][3]=a[3][5]=3; a[2][3]=a[3][2]=a[3][4]=a[4][3]=2; a[3][3]=1; int *p=&a[3][3];//指向操作对象 p=&a[3][3]; while(1) { start_map(a); p=man_move(p); system("cls"); }*/ a[1][1]=a[1][3]=a[2][1]=a[3][1]=a[3][3]=a[4][3]=a[5][3]=a[5][4]=a[5][5]=a[5][6]=a[6][2]=a[6][3]=a[6][4]=a[6][6]=a[6][7]=a[7][2]=a[7][3]=a[7][4]=4; a[3][7]=a[4][7]=a[5][7]=3; a[2][3]=a[2][2]=a[3][2]=2; a[1][2]=1; int *p=&a[3][3];//指向操作对象 p=&a[1][2]; while(1) { start_map(a); p=man_move(p); system("cls"); } system("pause"); return 0; } void start_map(int a[15][15]) //将数组对应的地图显示出来 { for(int i=0; i<14; i++) { for(int j=0; j<14; j++) { switch(a[i][j]) { case 6: cout<<"▼"; break;//箱子已到达目的地 case 5: cout<<"卍" ; break;//操作对象与箱子要到达的地方在同一位置 case 4: cout <<" "; break;//空白区域 case 3: cout <<"□"; break;//箱子要到达的地方 case 2: cout<<"▼"; break;//箱子 case 1: cout<<"卍" ; break;//操作对象 default: cout<<"■";//墙壁 } } cout<< endl; } } int *man_move(int* p) { char input_move; input_move=getch();//输入移动方向 switch(input_move) { case 'w': p=move_step(-15,p);//上移 break; case 's': p=move_step(15,p);//下移 break; case 'a': p=move_step(-1,p);//左移 break; case 'd': p=move_step(1,p);//右移 break; } return p; } int *move_step(int pointer_move_number,int* p) { int *p1=p; if(*(p+pointer_move_number)==4||*(p+pointer_move_number)==3) //移动方向上第一格为空 { if(*p==5)//原位置与目标点重合 *p1=3;//原位置置移动目标□ else *p1=4; //原位置置空 p=p1+pointer_move_number; //人物移一格 if(*p==4) *p=1; else//人物移动位置为某一箱子指定位置 *p=5; } else if(*(p+pointer_move_number)==2||*(p+pointer_move_number)==6) //移动方向上第一格有箱子 { if(*(p+pointer_move_number*2)==4||*(p+pointer_move_number*2)==3)//移动方向上第二格为空 { if(*p==5)//原位置与目标点重合 *p1=3;//原位置置移动目标□ else *p1=4; //原位置置空 if(*(p1+pointer_move_number)==2)//箱子原位置未到达指定点 *(p+pointer_move_number)=1;//人物移一格 else//箱子原位置已到达目标点 *(p+pointer_move_number)=5; if(*(p1+pointer_move_number*2)==3)//箱子到达指定位置 { *(p1+pointer_move_number*2)=6;//箱子移一格 sign_win++; } else *(p1+pointer_move_number*2)=2; //箱子移一格 p=p1+pointer_move_number; //p指向现在的位置 } } return p; }推箱子的基本功能已经实现了,现在就要解决其他问题,界面太丑,操作是会伴随频闪
还有就是回到上一步的功能以及胜利条件,关卡的选择等
这让我有点蒙,我参考了https://blog.csdn.net/qq_35963183/article/details/52425032
更蒙了0.0