推箱子C语言

今天浅交一下我的课设——推箱子。

今天教大家写一个简单的游戏。

游戏呢主要分为一下几个主要内容:

1.打印菜单页面

2.初始化地图

3.推箱子

4.判断输赢

5.结束后询问是否继续。

那么来看看代码:

首先是所用到的头文件,以及函数。

#include<stdio.h>
#include<conio.h> 
#include<windows.h>

int play(int map[9][11]);
int drawmain(int map[9][11]);
int tuidong(int map[9][11]);
int isWin(int map[9][11]);

游戏做的比较简单,有三个地图

 int map1[9][11]={
 {0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,1,1,1,0,0,0,0,0},
 {0,0,0,1,4,1,0,0,0,0,0},
 {0,0,0,1,0,1,1,1,1,0,0},
 {0,1,1,1,3,0,3,4,1,0,0},
 {0,1,4,0,3,2,1,1,1,0,0},
 {0,1,1,1,1,3,1,0,0,0,0},
 {0,0,0,0,1,4,1,0,0,0,0},
 {0,0,0,0,1,1,1,0,0,0,0}
};
int map2[9][11]={
 {1,1,1,1,1,0,0,0,0,0,0},
 {1,2,0,0,1,0,0,0,0,0,0},
 {1,0,3,3,1,0,1,1,1,0,0},
 {1,0,3,0,1,0,1,4,1,0,0},
 {1,1,1,0,1,1,1,4,1,0,0},
 {0,1,1,0,0,0,0,4,1,0,0},
 {0,1,0,0,0,1,0,0,1,0,0},
 {0,1,0,0,0,1,1,1,1,0,0},
 {0,1,1,1,1,1,0,0,0,0,0},

};
int map3[9][11]={ 
 {0,0,0,0,0,0,0,0,0,0,0},
 {0,1,1,1,1,1,1,1,0,0,0},
 {0,1,0,0,0,0,0,1,1,1,0},
 {1,1,3,1,1,1,0,0,0,1,0},
 {1,0,2,0,3,0,0,3,0,1,0},
 {1,0,4,4,1,0,3,0,1,1,0},
 {1,1,4,4,1,0,0,0,1,0,0},
 {0,1,1,1,1,1,1,1,1,0,0},
 {0,0,0,0,0,0,0,0,0,0,0},

};

其实可以使用三维数组来做地图,为了方便起见使用了三个二维数组,但其实都是一样的道理。

地图中的元素有空地0、墙1、人2、箱子3、目的地4。分别用数字来代替。那么在推动的过程中,就会箱子和目的地在一起用7表示,同样人+目的地6。

初始化地图

空地用空格表示;墙用■,人♀,箱子☆,终点◎,人+终点♂,箱子+终点★。

int drawmain(int map[9][11])
{ 
  int i,j;
 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");
 }    
} 

这里用switch检索每一个元素,检索到相应的将其打印。打印出来地图长这样:

有了地图,我们要去推动他,

先分析一下,人要推箱子,那么我们需要把人的位置找到是数字2,那么在推动的时候,人和终点重合时6。(第一步找到人的位置,2/6)

找到位置之后就要推动了4个方向主要讲一个方向(向上)

确定人的位置之后,有3种可能

1.人前面时空地,人前面是终点

2.人前面是箱子

         2.1箱子前是空地

         2.2箱子前是终点。

 如图1,如果前面是空地或者是终点,人可以向前一步,那么map[i-1][j]的值为0+2=0(4+2=6)map[i][j]的值为2-2=0;

如图2,如果前面是箱子,箱子前面是空地(终点),可以推动。若为终点,则map[i-2][j]的值为4+3=7.

对于向下推动只需要

 对,map[i+1][j]+2,也就是和向上比起来,将i-1变为i+1;同理向左就是[i-1][j]变为[i][j-1];向右[i][j+1]。

int tuidong(int map[9][11])
{
 int count,caw=0;//行和列 
 int i,j,tui;
 for(i=0;i<9;i++){
  for (j=0;j<11;j++)
  {
   if(map[i][j]==2||map[i][j]==6)
   {
    count=i;
    caw=j;
   }
  }    
 }

 tui=getch();//与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,
                 //比较麻烦 ,getch()则不需要回车就能连续输入多个字符。 
    switch(tui)
 {//上
  case 'W':
  case 'w':
   // 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;
 
//下 
     case 'S':
     case 's'://键值 
       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 'a':
        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 'd':
        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;
       
}
}

推动完后要判断输赢

检索每一个元素,如果有元素等于箱子(3) 就输了。

int isWin(int map[9][11]) 
{
	int k = 0;//初始化
	int j,i;
 	for(i=0;i<9;i++)
 	{
  		for (j=0;j<11;j++)
  		{
    		if(map[i][j]==3)
        		k++;
  		}
 	}
 	if(k==0)
 		return 1;
	return 0;
}

最后,play把这些函数放一起

int play(int map[9][11])
{
 	while(!isWin(map))
    {
    	system("cls");
        drawmain(map);
        tuidong(map);
    }
    system("cls");
    printf("哇!你真棒,过关了!\n继续下一关吧!\n输入任意键进入下一关");
    getch(); 
} 

注意:这里 需要吊桶头文件#include<conio.h> 。这里用到了清屏。

system("cls");,需要对屏幕清空。

最后的最后就是main函数了

在这里实现了页面

int main()//主函数 
{char direction, q;
	printf("******************************************************\n");
	printf("*****            欢迎来到推箱子大赛              *****\n");
	printf("*****       本游戏由让我康康攻略团队制作         *****\n");
	printf("******************************************************\n");
    printf("***************************\n");
	printf("   是否要开始游戏?(y/n)\n");
	printf("***************************\n");
	while(scanf(" %c",&q) && q!='n' && q!='N')   
{
  while(1)
    {
	play(map1);
	play(map2);
	play(map3); 
       
    }
    printf("shuchu \n");
 return 0;}
 } 

页面效果就是这样啦

 推箱子就完成了,

全部代码如下

#include<stdio.h>
#include<conio.h> 
#include<windows.h>
 
int map2[9][11]={
 {1,1,1,1,1,0,0,0,0,0,0},
 {1,2,0,0,1,0,0,0,0,0,0},
 {1,0,3,3,1,0,1,1,1,0,0},
 {1,0,3,0,1,0,1,4,1,0,0},
 {1,1,1,0,1,1,1,4,1,0,0},
 {0,1,1,0,0,0,0,4,1,0,0},
 {0,1,0,0,0,1,0,0,1,0,0},
 {0,1,0,0,0,1,1,1,1,0,0},
 {0,1,1,1,1,1,0,0,0,0,0},

};
 int map1[9][11]={
 {0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,1,1,1,0,0,0,0,0},
 {0,0,0,1,4,1,0,0,0,0,0},
 {0,0,0,1,0,1,1,1,1,0,0},
 {0,1,1,1,3,0,3,4,1,0,0},
 {0,1,4,0,3,2,1,1,1,0,0},
 {0,1,1,1,1,3,1,0,0,0,0},
 {0,0,0,0,1,4,1,0,0,0,0},
 {0,0,0,0,1,1,1,0,0,0,0}
};
int map3[9][11]={ 
 {0,0,0,0,0,0,0,0,0,0,0},
 {0,1,1,1,1,1,1,1,0,0,0},
 {0,1,0,0,0,0,0,1,1,1,0},
 {1,1,3,1,1,1,0,0,0,1,0},
 {1,0,2,0,3,0,0,3,0,1,0},
 {1,0,4,4,1,0,3,0,1,1,0},
 {1,1,4,4,1,0,0,0,1,0,0},
 {0,1,1,1,1,1,1,1,1,0,0},
 {0,0,0,0,0,0,0,0,0,0,0},

};
 //原始的图表,五行六列,其中 0 代表着空白的地方; 1 代表着墙;2 代表着人;
               //3 代表着箱子;4 代表着箱子的终点位置。 
 
                      //图的变化要靠自己来编写数组,通过数字来进行图的构造。
int play(int map[9][11]);
int drawmain(int map[9][11]);
int tuidong(int map[9][11]);
int isWin(int map[9][11]);

int main()//主函数 
{char direction, q;
	printf("******************************************************\n");
	printf("*****            欢迎来到推箱子大赛              *****\n");
	printf("*****       本游戏由让我康康攻略团队制作         *****\n");
	printf("******************************************************\n");
    printf("***************************\n");
	printf("   是否要开始游戏?(y/n)\n");
	printf("***************************\n");
	while(scanf(" %c",&q) && q!='n' && q!='N')   
{
  while(1)
    {
	play(map1);
	play(map2);
	play(map3); 
       
    }
    printf("shuchu \n");
 return 0;}
 } 
//把图形刻画出来
 
int play(int map[9][11])
{
 	while(!isWin(map))
    {
    	system("cls");
        drawmain(map);
        tuidong(map);
    }
    system("cls");
    printf("哇!你真棒,过关了!\n继续下一关吧!\n输入任意键进入下一关");
    getch(); 
} 
int drawmain(int map[9][11])
{ 
  int i,j;
 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 map[9][11])
{
 int count,caw=0;//行和列 
 int i,j,tui;
 for(i=0;i<9;i++){
  for (j=0;j<11;j++)
  {
   if(map[i][j]==2||map[i][j]==6)
   {
    count=i;
    caw=j;
   }
  }    
 }

 tui=getch();//与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,
                 //比较麻烦 ,getch()则不需要回车就能连续输入多个字符。 
    switch(tui)
 {//上
  case 'W':
  case 'w':
   // 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;
 
//下 
     case 'S':
     case 's'://键值 
       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 'a':
        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 'd':
        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;
       
}
}
int isWin(int map[9][11]) 
{
	int k = 0;//初始化
	int j,i;
 	for(i=0;i<9;i++)
 	{
  		for (j=0;j<11;j++)
  		{
    		if(map[i][j]==3)
        		k++;
  		}
 	}
 	if(k==0)
 		return 1;
	return 0;
}

  • 20
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
推箱子是一种经典的游戏,以下是一个基本的推箱子游戏的C语言程序代码,供参考: ``` #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #define MAP_WIDTH 10 #define MAP_HEIGHT 10 #define MAX_STEP 100 int map[MAP_HEIGHT][MAP_WIDTH] = { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,2,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}, }; int player_x = 1, player_y = 1; //玩家初始位置 int box_x = 2, box_y = 2; //箱子初始位置 int steps = 0; //步数 void draw_map() { system("cls"); //清屏 for(int i=0; i<MAP_HEIGHT; i++) { for(int j=0; j<MAP_WIDTH; j++) { if(i == player_y && j == player_x) //画玩家 printf("P"); else if(i == box_y && j == box_x) //画箱子 printf("B"); else if(map[i][j] == 1) //画墙 printf("#"); else //画空地 printf(" "); } printf("\n"); } printf("Steps: %d/%d\n", steps, MAX_STEP); //显示步数 } int is_win() { return (map[box_y-1][box_x] == 3 && map[box_y][box_x+1] == 3 && map[box_y+1][box_x] == 3 && map[box_y][box_x-1] == 3); } void game_over() { system("cls"); printf("Game Over!\n"); system("pause"); exit(0); } void move_player(int dx, int dy) { if(map[player_y+dy][player_x+dx] == 1) //如果前方是墙,返回 return; if(player_x+dx == box_x && player_y+dy == box_y) //如果前方是箱子 { if(map[box_y+dy][box_x+dx] == 1 || map[box_y+dy][box_x+dx] == 2) //如果箱子前方是墙或者另一个箱子,返回 return; box_x += dx; box_y += dy; steps++; if(is_win()) //如果胜利了,游戏结束 game_over(); } player_x += dx; player_y += dy; steps++; } int main() { while(1) { draw_map(); int key = getch(); switch(key) { case 72: //Up move_player(0, -1); break; case 80: //Down move_player(0, 1); break; case 75: //Left move_player(-1, 0); break; case 77: //Right move_player(1, 0); break; default: break; } if(steps >= MAX_STEP) //如果步数达到上限,游戏结束 game_over(); } return 0; } ``` 这个程序实现了一个简单的推箱子游戏,玩家可以用方向键控制移动,将箱子推到目标位置即可胜利,当步数达到上限或者无法继续移动时游戏结束。程序中使用了二维数组来表示地图,使用了函数来封装游戏逻辑,同时也用到了一些C语言库函数和系统调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值