推箱子小游戏1.0版本
程序员文章站
2023-12-23 19:51:33
...
这学期选修了C语言程序设计这门课程,老师要求小组做一个项目,所以我就写了这个程序(小组分工中我负责编程)
<1>这个是游戏的初始界面,总共就设计了三个关卡
<2>第一关游戏界面
<3>第二关游戏界面
<4>第三关游戏界面
<5>游戏代码如下
void color()是借鉴了别人的颜色函数,感谢!!!
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include "map.h"
int score(int q);
void color(short x) //自定义函根据参数改变颜色
{
if(x>=0 && x<=15)//参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
//只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void drawmap(int n)
{
int c=n;
printf(" C语言游戏之推箱子\n");
int i,j;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
switch(map[c][i][j])
{
case 0:
printf(" ");
break;
case 1:
color(4);
printf("■");
break;
case 2:
color(7);
printf("♀");
break;
case 3:
color(6);
printf("田");
break;
case 4:
color(7);
printf("☆");
break;
case 6:
color(7);
printf("♀");
break;
case 7:
color(6);
printf("★");
break;
default:
break;
}
}
color(7);//回复默认颜色
printf("\n");
}
printf("\n");
printf("score=%d\n",score(n-1));
}
void play(int n)
{ int c=n;
int x,y;
int i,j;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
if(map[c][i][j]==2||map[c][i][j]==6)//定位人的位置
{
x=i;
y=j;
break;
}
}
}
switch(getch())
{
case 'W':
case 'w':
if(map[c][x-1][y]==0||map[c][x-1][y]==4)//上面的位置是空 空的目的地
{
map[c][x][y]-=2;//减掉2, 人走了, 变为空地
map[c][x-1][y]+=2;
}
else if(map[c][x-1][y]==3||map[c][x-1][y]==7)//上面是箱子或者箱子在目的地上
{
if(map[c][x-2][y]==0||map[c][x-2][y]==4)//箱子上面是空地
//可以移动
{
map[c][x][y]-=2;//人走了
map[c][x-1][y]-=1;//人来了+2 箱子推上去了-3
map[c][x-2][y]+=3;
}
}
break;
case 'S':
case 's':
if(map[c][x+1][y]==0||map[c][x+1][y]==4)//下面的位置是空 空的目的地
{
map[c][x][y]-=2;//减掉2, 人走了, 变为空地
map[c][x+1][y]+=2;
}
else if(map[c][x+1][y]==3||map[c][x+1][y]==7)//下面是箱子或者箱子在目的地上
{
if(map[c][x+2][y]==0||map[c][x+2][y]==4)//箱子下面是空地
//可以移动
{
map[c][x][y]-=2;//人走了
map[c][x+1][y]-=1;//人来了+2 箱子推下去了-3
map[c][x+2][y]+=3;
}
}
break;
case 'A':
case 'a':
if(map[c][x][y-1]==0||map[c][x][y-1]==4)//上面的位置是空 空的目的地
{
map[c][x][y]-=2;//减掉2, 人走了, 变为空地
map[c][x][y-1]+=2;
}
else if(map[c][x][y-1]==3||map[c][x][y-1]==7)//左面是箱子或者箱子在目的地上
{
if(map[c][x][y-2]==0||map[c][x][y-2]==4)//箱子左面是空地
//可以移动
{
map[c][x][y]-=2;//人走了
map[c][x][y-1]-=1;//人来了+2 箱子推上去了-3
map[c][x][y-2]+=3;
}
}
break;
case 'D':
case 'd':
if(map[c][x][y+1]==0||map[c][x][y+1]==4)//右面的位置是空 空的目的地
{
map[c][x][y]-=2;//减掉2, 人走了, 变为空地
map[c][x][y+1]+=2;
}
else if(map[c][x][y+1]==3||map[c][x][y+1]==7)//右面是箱子或者箱子在目的地上
{
if(map[c][x][y+2]==0||map[c][x][y+2]==4)//箱子右面是空地
//可以移动
{
map[c][x][y]-=2;//人走了
map[c][x][y+1]-=1;//人来了+2 箱子推上去了-3
map[c][x][y+2]+=3;
}
}
break;
default:
break;
}
}
int judge(int n)
{
//游戏结束,所有箱子都推到目的上
//判断数组是否有3,没有3结束,箱子都推到角落,游戏结束
//判断箱子是否在角落
//赢了返回1 输了返回-1 游戏中返回0
int i,j;
int c=n;
int num=0;
int score=0;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
if(map[c][i][j]==3)
{
num++;
if((map[c][i-1][j]==1||map[c][i+1][j]==1)&&(map[c][i][j-1]==1||map[c][i][j+1]==1))//箱子是否在角落
return -1;//游戏结束
}
}
}
if(num==0)
{
return 1;//没有空箱子
}
else
{
score=3-num;
return 0;//游戏进行中
}
}
int score(int q)
{
int c=q;
int n=0;
int i,j;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
if(map[c][i][j]==7)
n++;
}
}
return n;
}
int main(void)
{
//设置窗口标题
SetConsoleTitle("推箱子过关游戏 ");
//设置窗口大小 cols列 lines行
system("mode con cols=40 lines=20");
//begin:
int choice;
printf("欢迎来到推箱子游戏环节!\n"
"本游戏共有多个关卡\n"
"请输入你的选择(1-3)");
scanf("%d",&choice);
system("cls");
begin:
while(judge(choice-1)==0)
{
drawmap(choice-1);
play(choice-1);
system("cls");
}
drawmap(choice-1);
if(judge(choice-1)==1)
{
if(choice==3)
{
printf("\nYOU WIN!\n");
return 0;
}
else
{
choice++;
system("cls");
goto begin;
}
}
else if(judge(choice-1)==-1)
{
printf("Game Over!\a");
}
return 0;
}