C语言课程设计简单的推箱子小游戏新手入门

可实现开始新游戏,选关,返回上一步功能。简单易懂。

#include <stdio.h>
#include <stdlib.h>//主要使用清屏和暂停语句
#include <conio.h>//getch
#include<windows.h>

int map[3][9][9] =
{
{ 1,1,1,1,1,0,0,0,0,
1,0,0,0,1,0,0,0,0,
1,0,4,0,1,0,1,1,1,
1,0,4,0,1,0,1,3,1,
1,1,1,0,1,1,1,3,1,
0,1,1,0,0,0,0,3,1,
0,1,0,4,0,1,0,0,1,
0,1,0,0,5,1,1,1,1,
0,1,1,1,1,1,0,0,0
},
{
1,1,1,1,1,1,1,1,0,
1,0,0,0,0,0,0,1,0,
1,3,1,0,1,1,3,1,0,
1,4,0,0,4,0,3,1,0,
1,0,1,0,1,1,4,1,0,
1,0,0,5,0,0,0,1,0,
1,1,1,1,1,1,1,1,0
},
{
0,0,1,1,1,1,0,0,0,
0,0,1,0,0,1,0,0,0,
0,0,1,0,0,1,0,0,0,
0,0,1,5,0,1,0,0,0,
1,1,1,0,0,1,1,1,0,
1,0,0,0,4,3,0,1,0,
1,0,4,0,0,0,0,1,0,
1,1,1,1,1,3,0,1,0,
0,0,0,0,1,1,1,1,0
},
};
int cas = 0; //为0表示第一关
//记录每一关的箱子数 或者是项目和目的在一起的总数
int boxSum[3] = {3,3,2};
//地图数目,以及每关的箱子数目
void menu();

void drawMap()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (j == 0)
printf("\t\t");
switch (map[cas][i][j])
{
case 0:
printf(" “);
break;
case 1:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);
printf(“■”);//墙
break;
case 3:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14);
printf(“◎”);//终点位置
break;
case 4:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
printf(“☆”); //箱子
break;
case 5:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
printf(“♀”);//人
break;
case 7:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
printf(“★”);//箱子在终点
break;
case 8:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
printf(“♂”);//人加终点位置
break;
}
}
printf(”\n");
}
}
//按键处理
void keyPush()
{

//分析按键过程
//定位人在哪里
//人有两种情况:第一个是:人,第二个:人站在目的上
int i, j;
for (i = 0; i < 9; i++)
{
	for (j = 0; j <9; j++)
	{
		if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
		{
			break;
		}
	}
	if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
	{
		break;
	}
}

int tui = getch();	//看不见的字符输入,+头文件 conio.h
					//与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,
                	//getch()则不需要回车就能连续输入多个字符。
switch (tui)
{
	case'r':
	case'R':
	 if(map[cas][i+1][j]==4||map[cas][i+1][j]==7)//人下边是箱子 
	 {
	 	map[cas][i+1][j]-=4;
	 	map[cas][i][j]-=1;
	 	map[cas][i-1][j]+=5;
	 }
	 if(map[cas][i+1][j]==4||map[cas][i+1][j]==7)//人上边是箱子 
	 {
	 	map[cas][i-1][j]-=4;
	 	map[cas][i][j]-=1;
	 	map[cas][i+1][j]+=5;
	  } 
	if(map[cas][i][j+1]==4||map[cas][i][j+1]==7)//人右边是箱子 
	{
		map[cas][i][j+1]-=4;
		map[cas][i][j]-=1;
		map[cas][i][j-1]+=5;
	}
	if(map[cas][i][j-1]==4||map[cas][i][j-1]==7)//人左边是箱子 
	{
		map[cas][i][j-1]-=4;
		map[cas][i][j]-=1;
		map[cas][i][j+1]+=5;
	}
	break;
	//72 80   7[i5 77
case 'w':
case 'W':
case 72:
	//下一个地方等于空地或者是目的 能走
	if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
	{
		//3+5=8 :表示目的和人在一起
		//新地方(map[i-1][j])人(5)来了
		map[cas][i - 1][j] += 5;
		//老地方(map[i][j])人(5)走了
		map[cas][i][j] -= 5;
	}
	//如果下一个是箱子,要进一步判断能走
	//注意点:箱子两种状态:箱子,箱子和目的在一起
	else if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
	{
		//做箱子的下一个地方判断能不能走
		if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
		{
			//新的地方箱子来了
			map[cas][i - 2][j] += 4;
			//箱子的位置:箱子(-4)走了 人来(+5)
			map[cas][i - 1][j] += 1;
			//原来的地方人走了
			map[cas][i][j] -= 5;
		}

	}

	break;
case 's':
case 'S':
case 80:
	//下一个地方等于空地或者是目的 能走
	if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
	{
		//3+5=8 :表示目的和人在一起
		//新地方(map[i-1][j])人(5)来了
		map[cas][i + 1][j] += 5;
		//老地方(map[i][j])人(5)走了
		map[cas][i][j] -= 5;
	}
	else if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
	{
		//做箱子的下一个地方判断能不能走
		if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
		{
			//新的地方箱子来了
			map[cas][i + 2][j] += 4;
			//箱子的位置:箱子(-4)走了 人来(+5)
			map[cas][i + 1][j] += 1;
			//原来的地方人走了
			map[cas][i][j] -= 5;
		}

	}
	break;

case 'a':
case 'A':
case 75:
	//下一个地方等于空地或者是目的 能走
	if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
	{
		//3+5=8 :表示目的和人在一起
		//新地方(map[i-1][j])人(5)来了
		map[cas][i][j - 1] = map[cas][i][j - 1] + 5;
		//老地方(map[i][j])人(5)走了
		map[cas][i][j] = map[cas][i][j] - 5;
		//j+=5  j=j+5

	}
	else if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
	{
		//做箱子的下一个地方判断能不能走
		if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
		{
			//新的地方箱子来了
			map[cas][i][j - 2] += 4;
			//箱子的位置:箱子(-4)走了 人来(+5)
			map[cas][i][j - 1] += 1;
			//原来的地方人走了
			map[cas][i][j] -= 5;
		}

	}

	break;
case 'D':
case 'd':
case 77:
	//下一个地方等于空地或者是目的 能走
	if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
	{
		//3+5=8 :表示目的和人在一起
		//新地方(map[i-1][j])人(5)来了
		map[cas][i][j + 1] += 5;
		//老地方(map[i][j])人(5)走了
		map[cas][i][j] -= 5;
	}
	
	//下一个地方是箱子,判断箱子的下一个地方是不是目的和空地
	else if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
	{
		//做箱子的下一个地方判断能不能走
		if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
		{
			//新的地方箱子来了
			map[cas][i][j + 2] += 4;
			//箱子的位置:箱子(-4)走了 人来(+5)
			map[cas][i][j + 1] += 1;
			//原来的地方人走了
			map[cas][i][j] -= 5;
		}

	}
}

}
//胜负判断
//用什么判断胜负: 箱子到达目的的个数
int gameOver()
{
int count = 0;
//所有的地方找一遍
for (int i = 0; i < 9; i++)
{
for (int j = 0; j <9; j++)
{
if (map[cas][i][j] == 7)
count++;
}
}
return count;
}
//箱子数是零的时候也是胜利
int gameOver2()
{
int count = 3;
//所有的地方找一遍
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (map[cas][i][j] == 3)
count–;
}
}
return count;
}

void menu()
{
char choose=0;
char choose2=0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
printf("\n *推箱子\n\n\n");
printf(" 1.新的游戏\n\n");
printf(" 2.选择关卡\n\n");
printf(" 3.游戏需知\n\n");
printf("\n ********************************\n\n\n\n");
while(1)
{
scanf("%c",&choose);
if(choose==‘1’)
{
break;

	}
	else if(choose=='2')
	{
		printf("\n               选择关卡\n\t 1\n\t 2\n\t 3\n\t");
		choose2=getch();   
		
       	switch(choose2)
        {
    		case '1':
    			cas=0;
    			break;
		 
    		case '2':
	            cas=1;
    			break;	 
    		case '3':
    			cas=2;
    			break;
    	}
    
    	break;
	}
	else if(choose=='3')
	{   
	    system("cls");
		printf("\n\n\t\t按'W'S'A'D'或'↑'↓'←''→'\n\n\t\t操控小人推动箱子到达终点") ;
    	printf("\n\n\t\t按'R'返回上一步\n"); 
		system("pause");
		break;
		 
	 } 

}

}
int main() //游戏实现函数
{
system(“mode con cols=55 lines=25”);
SetConsoleTitleA(“推箱子小游戏”); //设置窗口

menu();
system(“cls”);
while (1)
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
printf("\n\n\t\t 第【%d】关\n\n",cas+1);
drawMap();
if (gameOver() == boxSum[cas])
{
cas++;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
if(cas<3)
printf("\n\n\t\t恭喜进入第【%d】关!",cas+1);
if (cas == 3)
break;
}
keyPush();
system(“cls”);
}
printf("\t\t恭喜通关 游戏胜利!!");
system(“pause”);
return 0;
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值