在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力。
推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图。
/***********************************************文件名称:main.c文件描述:C语言写一个简单的小游戏 编译环境:DEV C++ 初写时间:2018年8月3日 修改时间:2018年8月3日
***********************************************/
#include<stdio.h>
#include<conio.h>
#include<windows.h>int map[9][11]={{0,1,1,1,1,1,1,1,1,1,0},{0,1,0,0,0,1,0,0,0,1,0},{0,1,0,3,3,3,3,3,0,1,0},{0,1,0,3,0,3,0,3,0,1,1},{0,1,0,0,0,2,0,0,3,0,1},{1,1,0,1,1,1,1,0,3,0,1},{1,0,4,4,4,4,4,1,0,0,1},{1,0,4,4,4,4,4,0,0,1,1},{1,1,1,1,1,1,1,1,1,1,0}};//原始的图表,五行六列,其中 0 代表着空白的地方; 1 代表着墙;2 代表着人;//3 代表着箱子;4 代表着箱子的中点位置。 //图的变化要靠自己来编写数组,通过数字来进行图的构造。
int drawmain();
int tuidong();
int winshu();int main()//主函数
{while(1){system("cls");//对其进行清屏 drawmain();tuidong();}printf("shuchu \n");return 0;}
//把图形刻画出来int drawmain()
{ int i,j;winshu();//调用输赢的函数 for(i=0;i<9;i++){for(j=0;j<11;j++){switch(map[i][j]){case 0:printf(" "); //空白的地方break;case 1:printf("■"); //墙 break;case 2:printf("♀"); //人 break;case 3:printf("☆"); //箱子 break;case 4:printf("◎"); //终点地方 break; case 6:printf("♂");//人加终点位置 break;case 7: printf("★") ;//箱子加终点位置break;}}printf("\n");}
} //进行小人的移动,整个移动的过程就是数组变化的过程
int tuidong()
{int count,caw;//行和列 for(int i=0;i<9;i++)//确定人的位置 {for (int j=0;j<11;j++){if(map[i][j]==2||map[i][j]==6){count=i;caw=j;}}} int tui=getch();//与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,//比较麻烦 ,getch()则不需要回车就能连续输入多个字符。 switch(tui){//上case 'W':case 72:// 1.人的前面是空地;// 2.人的前面是终点位置;// 3.人的前面是箱子//3.1.箱子的前面是空地;//3.2.箱子的前面是终点位置。if(map[count-1][caw]==0||map[count-1][caw]==4){map[count][caw]-=2;map[count-1][caw]+=2;} else if(map[count-1][caw]==3||map[count-1][caw]==7){if(map[count-2][caw]==0||map[count-2][caw]==4){map[count][caw]-=2;map[count-1][caw]-=1;map[count-2][caw]+=3;}}break;/* 移动的情况:位置:人 map[count][caw]人的前面是空地 map[count-1][caw]人的前面是终点位置 map[count-1][caw]箱子的前面是空地或终点位置 map[count-2][caw]*/ //下 case 'S':case 80://键值 if(map[count+1][caw]==0||map[count+1][caw]==4){map[count][caw]-=2;map[count+1][caw]+=2;}else if(map[count+2][caw]==0||map[count+2][caw]==4){if(map[count+1][caw]==3||map[count+1][caw]==7){map[count][caw]-=2;map[count+1][caw]-=1;map[count+2][caw]+=3;}}break;
//左 case 'A':case 75:if(map[count][caw-1]==0||map[count][caw-1]==4){map[count][caw]-=2;map[count][caw-1]+=2;}else if(map[count][caw-2]==0||map[count][caw-2]==4){if(map[count][caw-1]==3||map[count][caw-1]==7){map[count][caw]-=2;map[count][caw-1]-=1;map[count][caw-2]+=3;}}break;
//右 case 'D':case 77:if(map[count][caw+1]==0||map[count][caw+1]==4){map[count][caw]-=2;map[count][caw+1]+=2;}else if(map[count][caw+2]==0||map[count][caw+2]==4){if(map[count][caw+1]==3||map[count][caw+1]==7){map[count][caw]-=2;map[count][caw+1]-=1;map[count][caw+2]+=3;}}break;} /*进行小人的上下左右的移动移动的情况:1.人的前面是空地;2.人的前面是终点位置;3.人的前面是箱子3.1.箱子的前面是空地;3.2.箱子的前面是终点位置。不移动的情况:1.人的前面是墙;2.人的前面是箱子;2.1.箱子的前面是墙 ; 2.2.箱子的前面是箱子;*///分析后,要进行确定人的位置以及胜利的条件。 } //整个游戏的输赢
int winshu()
{int k=0;for(int i=0;i<9;i++){for (int j=0;j<11;j++){if(map[i][j]==3)k++;}}if(k==0)printf("恭喜你,你赢了!\n");
}/*总结:整个过程就是数组元素的变换过程,但是我还不会进行两关之间的转换,在以后我会注重逻辑思维的培养以及编写代码时思路简单的撰写,这是我写的第一个小游戏,写完之后感觉很高兴,因为自己学的知识有很大的用处。 */
运行图为:
由于学的比较浅,因此好多功能都没实现,例如:两关之间相连接进行连续游戏、不会使用图形界面等等,需要我以后再努力学习关于C语言的更深入的知识。