失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 如何用C语言编写简单的推箱子小游戏

如何用C语言编写简单的推箱子小游戏

时间:2019-06-01 02:26:56

相关推荐

如何用C语言编写简单的推箱子小游戏

自己学习C语言的时候,没事的时候想的代码,用的VC++6.0,原理粗鄙,就是用一些符号来表示推箱子里面的几个对象,整个图就是一个符号矩阵,代码里面有说明。

代码如下,面向结构的编程确实感觉很累赘。

里面只写了前六关,后面把操作写成了一个很大的函数。

喜欢的可以自己复制过去试一试。

#include "stdio.h"#include "conio.h"#include "malloc.h"int r = 0;void main(){void f(char **a,int,int,int c[2]);int i,j;int c[2];char **Q;char a1[8][8] = {" ### "," #0# "," # ####","###+ +0#",\"#0 +a###","####+# "," #0# "," ### "};char a2[9][9] = {"##### ","# # ","# + # ###","# +a# #0#",\"###+###0#"," ## 0#"," # # #"," # ####"," ##### "};char a3[7][10] = {" ####### "," ####","##+### #","# a+ + #",\"# 00# + ##","##00# # "," ######## "};char a4[8][6] = {" #### ","## # ","# +# ","## ##",\"##+a #","#0++ #","#00*0#","######"};char a5[8][8] = {" ##### "," # a### "," # + # ","### # ##",\"#0# # #","#0+ # #","#0 + # ","########"};char a6[11][13] = {" ####### ","##### ","# 0### # ","# # # ## ","# # + +#0 # ",\"# # * # # ","# 0#+ + # # ","## # # ###"," # ###0 a#"," ### #"," ############"};printf("欢迎来到推箱子小游戏。\n\操作须知:wasd为移动键,每按一次移动键若要按回车才能继续,则可以按一次shift键可以使按了移动键自动继续\n\按r键为重新开始当前关卡\n\符号:\n#:墙\na:人\n+:箱子\n0:箱子终点\n*:箱子进入终点\n@:人进入箱子终点\n\按回车键进入游戏第一关\n");getchar();again1:{c[0] = 4;c[1] = 4;printf("第一关\n");for(i=0;i<8;i++){for(j=0;j<8;j++){printf ("%c",*(*(a1+i)+j));}printf("\n");}Q = (char **)malloc(sizeof(char)*8);for(i = 0;i<8;i++){Q[i] =(char *)malloc(sizeof(char)*8);}for(i=0;i<8;i++){for(j=0;j<8;j++){*(*(Q+i)+j) = a1[i][j];}}f((char **)Q,8,8,c);}if(r){goto again1;}printf("\n点击回车进入下一关");getch();again2:{c[0] = 3;c[1] = 3;printf("\n第二关:\n");for(i=0;i<9;i++){for(j=0;j<9;j++){printf ("%c",*(*(a2+i)+j));}printf("\n");}Q = (char **)malloc(sizeof(char)*9);for(i = 0;i<9;i++){Q[i] =(char *)malloc(sizeof(char)*9);}for(i=0;i<9;i++){for(j=0;j<9;j++){*(*(Q+i)+j) = a2[i][j];}}f((char **)Q,9,9,c);}if(r){goto again2;}printf("\n点击回车进入下一关");getch();again3:{c[0] = 3;c[1] = 3;printf("\n第三关:\n");for(i=0;i<7;i++){for(j=0;j<10;j++){printf ("%c",*(*(a3+i)+j));}printf("\n");}Q = (char **)malloc(sizeof(char)*7);for(i = 0;i<7;i++){Q[i] =(char *)malloc(sizeof(char)*10);}for(i=0;i<7;i++){for(j=0;j<10;j++){*(*(Q+i)+j) = a3[i][j];}}f((char **)Q,7,10,c);}if(r){goto again3;}printf("\n点击回车进入下一关");getch();again4:{c[0] = 4;c[1] = 3;printf("\n第四关:\n");for(i=0;i<8;i++){for(j=0;j<6;j++){printf ("%c",*(*(a4+i)+j));}printf("\n");}Q = (char **)malloc(sizeof(char)*8);for(i = 0;i<7;i++){Q[i] =(char *)malloc(sizeof(char)*6);}for(i=0;i<8;i++){for(j=0;j<6;j++){*(*(Q+i)+j) = a4[i][j];}}f((char **)Q,8,6,c);}if(r){goto again4;}printf("\n点击回车进入下一关");getch();again5:{c[0] = 1;c[1] = 3;printf("\n第五关:\n");for(i=0;i<8;i++){for(j=0;j<8;j++){printf ("%c",*(*(a5+i)+j));}printf("\n");}Q = (char **)malloc(sizeof(char)*8);for(i = 0;i<7;i++){Q[i] =(char *)malloc(sizeof(char)*8);}for(i=0;i<8;i++){for(j=0;j<8;j++){*(*(Q+i)+j) = a5[i][j];}}f((char **)Q,8,8,c);}if(r){goto again5;}printf("\n点击回车进入下一关");getch();again6:{c[0] = 8;c[1] = 11;printf("\n第六关:\n");for(i=0;i<11;i++){for(j=0;j<13;j++){printf ("%c",*(*(a6+i)+j));}printf("\n");}Q = (char **)malloc(sizeof(char)*11);for(i = 0;i<11;i++){Q[i] =(char *)malloc(sizeof(char)*13);}for(i=0;i<11;i++){for(j=0;j<13;j++){*(*(Q+i)+j) = a6[i][j];}}f((char **)Q,11,13,c);}if(r){goto again6;}}void f(char **a,int m,int n,int c[2])//**********************************{char b;int print(char **a,int,int,int);int e;int k = 1;r = 0;while(1){b = getch();if(b == 'w')//向上移动{if(*(*(a+(c[0]-1))+c[1]) == ' ')//if(a[c[0]-1][c[1]] == ' ')前面是空{a[c[0]][c[1]] = a[c[0]][c[1]] =='a'?' ':'0';a[c[0]-1][c[1]] = 'a';c[0] = c[0]-1;}else if(*(*(a+(c[0]-1))+c[1]) == '+')//前面是纯箱子,非箱子和终点结合。{if(*(*(a+(c[0]-2))+c[1]) == ' ')//交换{*(*(a+(c[0]-2))+c[1]) = '+';*(*(a+(c[0]-1))+c[1]) = 'a';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[0] = c[0]-1;}else if(*(*(a+(c[0]-2))+c[1]) == '+'||*(*(a+(c[0]-2))+c[1]) == '#')//不动{}else//箱子前面是终,{*(*(a+(c[0]-2))+c[1]) = '*';*(*(a+(c[0]-1))+c[1]) = 'a';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[0] = c[0]-1;}}else if(*(*(a+(c[0]-1))+c[1]) == '0')//前面是终{*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************(*(a+(c[0]-1))+c[1]) = '@';c[0] = c[0]-1;}else if(*(*(a+(c[0]-1))+c[1]) == '*')//前面是箱子和终点结合{if(*(*(a+(c[0]-2))+c[1]) == ' ')//箱终前面是空{*(*(a+(c[0]-2))+c[1]) = '+';*(*(a+(c[0]-1))+c[1]) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[0] = c[0]-1;}else if(*(*(a+(c[0]-2))+c[1]) == '+'||*(*(a+(c[0]-2))+c[1]) == '#'||*(*(a+(c[0]-2))+c[1]) == '*')//不动{}else//箱子前面是终,{*(*(a+(c[0]-2))+c[1]) = '*';*(*(a+(c[0]-1))+c[1]) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[0] = c[0]-1;}}else//遇墙{}e = print((char **)a,k,m,n);if(e){break;}}else if(b == 'a')//向左移动{if(*(*(a+(c[0]))+(c[1]-1)) == ' '){*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0****************(*(a+(c[0]))+(c[1]-1)) = 'a';c[1] = c[1]-1;}else if(*(*(a+(c[0]))+(c[1]-1)) == '+'){if(*(*(a+(c[0]))+(c[1]-2)) == ' ')//交换{*(*(a+(c[0]))+(c[1]-2)) = '+';*(*(a+(c[0]))+(c[1]-1)) = 'a';*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[1] = c[1]-1;}else if(*(*(a+(c[0]))+(c[1]-2)) == '+'||*(*(a+(c[0]))+(c[1]-2)) == '#')//不动{}else//箱子前面是终,{*(*(a+(c[0]))+(c[1]-2)) = '*';*(*(a+(c[0]))+(c[1]-1)) = 'a';*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[1] = c[1]-1;}}else if(*(*(a+(c[0]))+(c[1]-1)) == '0'){*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************(*(a+(c[0]))+(c[1]-1)) = '@';c[1] = c[1]-1;}else if(*(*(a+(c[0]))+(c[1]-1)) == '*')//前面是箱子和终点结合{if(*(*(a+(c[0]))+(c[1]-2)) == ' ')//箱终前面是空{*(*(a+(c[0]))+(c[1]-2)) = '+';*(*(a+(c[0]))+(c[1]-2)) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[1] = c[1]-1;}else if(*(*(a+(c[0]))+(c[1]-2)) == '+'||*(*(a+(c[0]))+(c[1]-2)) == '#'||*(*(a+(c[0]))+(c[1]-2)) == '*')//不动{}else//箱子前面是终,{*(*(a+(c[0]))+(c[1]-2)) = '*';*(*(a+(c[0]))+(c[1]-1)) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[1] = c[1]-1;}}else//遇墙{}e = print((char **)a,k,m,n);if(e){break;}}else if(b == 's')//向下移动{if(*(*(a+(c[0]+1))+(c[1])) == ' '){*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0****************(*(a+(c[0]+1))+(c[1])) = 'a';c[0] = c[0]+1;}else if(*(*(a+(c[0]+1))+(c[1])) == '+'){if(*(*(a+(c[0]+2))+(c[1])) == ' ')//交换{*(*(a+(c[0]+2))+(c[1])) = '+';*(*(a+(c[0]+1))+(c[1])) = 'a';*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[0] = c[0]+1;}else if(*(*(a+(c[0]+2))+(c[1])) == '+'||*(*(a+(c[0]+2))+(c[1])) == '#')//不动{}else//箱子前面是终,{*(*(a+(c[0]+2))+(c[1])) = '*';*(*(a+(c[0]+1))+(c[1])) = 'a';*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[0] = c[0]+1;}}else if(*(*(a+(c[0]+1))+(c[1])) == '0'){*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************(*(a+(c[0]+1))+(c[1])) = '@';c[0] = c[0]+1;}else if(*(*(a+(c[0]+1))+c[1]) == '*')//前面是箱子和终点结合{if(*(*(a+(c[0]+2))+c[1]) == ' ')//箱终前面是空{*(*(a+(c[0]+2))+c[1]) = '+';*(*(a+(c[0]+1))+c[1]) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[0] = c[0]+1;}else if(*(*(a+(c[0]+2))+c[1]) == '+'||*(*(a+(c[0]+2))+c[1]) == '#'||*(*(a+(c[0]+2))+c[1]) == '*')//不动{}else//箱子前面是终,{*(*(a+(c[0]+2))+c[1]) = '*';*(*(a+(c[0]+1))+c[1]) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[0] = c[0]+1;}}else//遇墙{}e = print((char **)a,k,m,n);if(e){break;}}else if(b == 'd')//向右移动{if(*(*(a+(c[0]))+(c[1]+1)) == ' '){*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0****************(*(a+(c[0]))+(c[1]+1)) = 'a';c[1] = c[1]+1;}else if(*(*(a+(c[0]))+(c[1]+1)) == '+'){if(*(*(a+(c[0]))+(c[1]+2)) == ' ')//交换{*(*(a+(c[0]))+(c[1]+2)) = '+';*(*(a+(c[0]))+(c[1]+1)) = 'a';*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[1] = c[1]+1;}else if(*(*(a+(c[0]))+(c[1]+2)) == '+'||*(*(a+(c[0]))+(c[1]+2)) == '#')//不动{}else//箱子前面是终,{*(*(a+(c[0]))+(c[1]+2)) = '*';*(*(a+(c[0]))+(c[1]+1)) = 'a';*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[1] = c[1]+1;}}else if(*(*(a+(c[0]))+(c[1]+1)) == '0'){*(*(a+(c[0]))+(c[1])) = *(*(a+(c[0]))+(c[1])) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************(*(a+(c[0]))+(c[1]+1)) = '@';c[1] = c[1]+1;}else if(*(*(a+(c[0]))+(c[1]+1)) == '*')//前面是箱子和终点结合{if(*(*(a+(c[0]))+(c[1]+2)) == ' ')//箱终前面是空{*(*(a+(c[0]))+(c[1]+2)) = '+';*(*(a+(c[0]))+(c[1]+2)) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0***************c[1] = c[1]+1;}else if(*(*(a+(c[0]))+(c[1]+2)) == '+'||*(*(a+(c[0]))+(c[1]+2)) == '#'||*(*(a+(c[0]))+(c[1]+2)) == '*')//不动{}else//箱子前面是终,{*(*(a+(c[0]))+(c[1]+2)) = '*';*(*(a+(c[0]))+(c[1]+1)) = '@';*(*(a+(c[0]))+c[1]) = *(*(a+(c[0]))+c[1]) == 'a'?' ':'0';//若上一次是人终结合,则该地为终。0*************c[1] = c[1]+1;}}else//遇墙{}e = print((char **)a,k,m,n);if(e){break;}}else if(b == 'r'){r = 1;break;}else//其他 不动{k--;printf("输入错误,请重新输入:\n");}k++;}}int print(char **a,int k,int m,int n)//移动后的操作。{int e,i,j;printf("这是你走的第%d步\n",k);for(i=0;i<m;i++){for(j=0;j<n;j++){printf ("%c",*(*(a+i)+j));}printf("\n");}//打印操作后的图。for(i=0;i<m;i++){for(j=0;j<n;j++){if(*(*(a+i)+j) == '0'||*(*(a+i)+j) == '@'){e = 0;break;}else{e = 1;}}if(e == 0){break;}}if(e){printf("you win!!!!\n");//判断游戏是否结束}return(e);//如果e等于1 则弹出}

如果觉得《如何用C语言编写简单的推箱子小游戏》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。