c语言小游戏-推箱子,废话少说,上代码:
#include <stdio.h>
#include <conio.h> //控制台输入输出的头文件
// getch();
#include <graphics.h> //头文件 必须要安装图形库
//图形库的头文件
//播放音乐的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib") //一个静态库
int Map[8][8] = {
0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
1, 1, 1, 1, 0, 1, 0, 0,
1, 3, 4, 0, 4, 1, 1, 1,
1, 1, 1, 5, 4, 0, 3, 1,
0, 0, 1, 4, 1, 1, 1, 1,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0
};
void Game_InitMap();//加载图片
void Game_Paint(); //贴图
void Game_play(); //操作
int Game_Judgement(); //判断游戏是否结束
// 因为要贴图 所以要给出变量
// 可以用图片数组 把图片放在数组里
IMAGE BackImage, WallImage; //背景 墙
IMAGE Box1, Box2; //箱子
IMAGE Tag1, Tag2; //目的地
IMAGE Boom1, Boom2; //箱子推到目的地
IMAGE Per1, Per2; //人
IMAGE END; //奖励
//IMAGE a[5]; //用数组放多张图也是可以的
void Game_InitMap()
{
loadimage(&BackImage, "./res/Background.jpg", 550, 550);//背景
loadimage(&WallImage, "./res/Wall.jpg", 69, 69);//墙壁
loadimage(&Box2, "./res/Box.jpg", 69, 69);//箱子
loadimage(&Tag2, "./res/Tag.jpg", 69, 69);//目的地
loadimage(&Boom2, "./res/Boom.jpg", 69, 69);//箱子到达目的地
loadimage(&Per2, "./res/Person.jpg", 69, 69);//人物
loadimage(&END, "./res/XiaQi.jpg", 550, 550);//胜利奖品
}
void Game_InitMap2(int live) //给出关卡数 用来判断是第几关
{
loadimage(&BackImage,"./res/Background.jpg",550,550); //背景
loadimage(&WallImage,"./res/Wall.jpg",69,69 );//墙
loadimage(&Box1, "./res/Box1.jpg", 69, 69);//箱子白色
loadimage(&Box2, "./res/Box.jpg", 69, 69);//箱子
loadimage(&Tag1, "./res/Tag1.jpg", 69, 69);//目的地白色
loadimage(&Tag2, "./res/Tag.jpg", 69, 69);//目的地
loadimage(&Boom1, "./res/Boom1.jpg", 69, 69);//箱子到达目的地白色
loadimage(&Boom2, "./res/Boom.jpg", 69, 69);//箱子到达目的地
loadimage(&Per1, "./res/Person1.jpg", 69, 69);//人物白色
loadimage(&Per2, "./res/Person.jpg", 69, 69);//人物
loadimage(&END, "./res/XiaQi.jpg", 550, 550);//胜利奖品
//在这里添加关卡数
// 一个文件操作
FILE *fp = fopen("Map.txt", "r");
if (NULL == fp) //如果打开失败 异常处理
{
MessageBox(NULL, "地图加载失败", NULL, NULL);
exit(0);
// exit 直接退出
}
int FileOffset; // 文件的偏移
FileOffset = 66 * (live - 1);
// 66 = 64+2--- 8*8+2
fseek(fp, FileOffset, SEEK_SET);
// 用来找到文件指针当前的位置
// 打开的哪一个文件 偏移量 文件开始的位置
int i, j;
char c;
//对地图的初始化
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
c = fgetc(fp);
//getc() 从文件中读出一个字符
//c = getchar();
Map[i][j] = c - '0';
// 因为是字符 所以要-48
}
}
fclose(fp); //关闭文件 先写 防止忘记
}
// 第一个要改的地方
//普通方法贴图
void Game_Paint()
{
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
switch (Map[j][i])
{
case 0: //空地
break;
case 1: //墙壁
putimage(69 * i, 69 * j, &WallImage);
break;
case 3://目的地
putimage(69 * i, 69 * j, &Tag2);
break;
case 4://箱子
putimage(69 * i, 69 * j, &Box2);
break;
case 5://人物
putimage(69 * i, 69 * j, &Per2);
break;
case 7://箱子在目的地上
putimage(69 * i, 69 * j, &Boom2);
break;
case 8://人物在目的地上
putimage(69 * i, 69 * j, &Per2);
break;
}
}
}
}
/*
0 空地
1 墙壁
3 目的地
4 箱子
5 人物
7 箱子在目的地
8 人在目的
*/
//透明遮罩法贴图
void Game_Paint2()
{
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
switch (Map[j][i])
{
case 0: //空地
break;
case 1: //墙壁
putimage(69 * i, 69 * j, &WallImage);
break;
case 3://目的地
putimage(69 * i, 69 * j, &Tag1, SRCPAINT); //做或运算
putimage(69 * i, 69 * j, &Tag2, SRCAND); //做与运算
break;
case 4://箱子
putimage(69 * i, 69 * j, &Box1, SRCPAINT);
putimage(69 * i, 69 * j, &Box2, SRCAND);
break;
case 5://人物
putimage(69 * i, 69 * j, &Per1, SRCPAINT);
putimage(69 * i, 69 * j, &Per2, SRCAND);
break;
case 7://箱子在目的地上
putimage(69 * i, 69 * j, &Boom1, SRCPAINT);
putimage(69 * i, 69 * j, &Boom2, SRCAND);
break;
case 8://人物在目的地上
putimage(69 * i, 69 * j, &Per1, SRCPAINT);
putimage(69 * i, 69 * j, &Per2, SRCAND);
break;
}
}
}
}
int Game_Judgement()
{
// 判断时间 判断步数
//方法1
// 因为地图是自己给的 目的地的位置是已知的
//if (map[1][5]== 7 && map[2][4] ==7)
// 方法2
//循环遍历整张图 判断有没有单独的箱子
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (Map[i][j] == 4) //判断 有没有落在空地上的箱子
{
return 1; //游戏还没有结束
}
}
}
return 0;
}
void Game_play()
//第二个要改的地方
{
char ch; //用来获取键盘输入的信息
// ASCII码 和 键码 --- 等会讲
int x, y; //描述当前坐标
int live = 1; //描述关卡
Game_InitMap2(live); //贴图
while (true)
{
BeginBatchDraw();
//如果不用批量绘图 会闪屏
cleardevice();
putimage(0, 0, &BackImage);
//贴背景
mciSendString("open ./res/bgm.mp3 alias bgm",0,0,0);
mciSendString("play bgm repeat", 0, 0, 0);
if (!Game_Judgement()) //判断 每一关是否玩完了
{
live++; // 进入下一关
if (4 == live) // 1 +1 +1 +1
{
Game_Paint2();// 绘图
FlushBatchDraw(); //批量绘图 防闪屏
MessageBox(GetHWnd(), "闯关成功\r\n", "闯关提示", MB_OK);
// 弹出对话框
// 一个函数 作用
//提示语句
//菜单
// 按钮 ok 可以写两个 一个ok 一个取消
putimage(0, 0, &END);// 贴结束图
FlushBatchDraw();
Sleep(5000); //续1S 停留一秒
closegraph(); //关闭窗口
exit(0); //结束程序
// sleep 可以试一下自己的电脑 休眠之后能否打开
}
Game_InitMap2(live);
} // 出入平安
// 遍历地图 找到人在哪儿
//批量绘图要结束
Game_Paint2();
EndBatchDraw();
for (x = 0; x < 8; x++)
{
for (y = 0; y < 8; y++)
{ //如果人在目的地 或者 人在空地
if (Map[x][y] == 5 || Map[x][y] == 8)
{
break;
//goto SummerSeven;
}
}
if (Map[x][y] == 5 || Map[x][y] == 8)
{
break;
}
}
//SummerSeven:x = x;
ch = _getch(); //获取键盘消息
// 主键盘上 都有对应的ASCII码值
// 还有一部分功能键 没有对应的ASCII码值
// 键码 功能键 用两个值表示
// 固定值 有序的值
// 224 72 0 --- F1~F10
// 用后一个值 确定是什么功能
// 用前一个值确定 是哪些功能
//人在 Map[x][y]
switch (ch)
{
case 'w': //case 具有穿透性 如果第一个匹配成功之后没有遇到break 那么会继续往下匹配 直到break或者switch结束为止
case 72://向上
if (Map[x - 1][y] == 0 || Map[x - 1][y] == 3)
//表示上一个位置是目的地或者空地
{
Map[x][y] -= 5; //原来的地方的人不见了
// Map[x][y]=0; 因为不能确定当前位置是空地还是目的地
Map[x - 1][y] += 5; //人上去了
}
else if (Map[x - 1][y] == 4 || Map[x - 1][y] == 7)
//如果上面是一个箱子 或者是一个在目的地的箱子
{
if (Map[x - 2][y] == 0 || Map[x - 2][y] == 3)
//上面的上面是空地或者目的地
{
Map[x - 2][y] += 4; //箱子推到面的上面
Map[x - 1][y] += 1; //人到了上面
Map[x][y] -= 5; //人上去了
}
}
break;
case 75://向左
if (Map[x][y - 1] == 0 || Map[x][y - 1] == 3)
{
Map[x][y] -= 5;
Map[x][y - 1] += 5;
}
else if (Map[x][y - 1] == 4 || Map[x][y - 1] == 7)
{
if (Map[x][y - 2] == 0 || Map[x][y - 2] == 3)
{
Map[x][y - 2] += 4;
Map[x][y - 1] += 1;
Map[x][y] -= 5;
}
}
break;
case 80: // 往下
if (Map[x + 1][y] == 0 || Map[x + 1][y] == 3)
{
Map[x][y] -= 5;
Map[x + 1][y] += 5;
}
else if (Map[x + 1][y] == 4 || Map[x + 1][y] == 7)
{
if (Map[x + 2][y] == 0 || Map[x + 2][y] == 3)
{
Map[x + 2][y] += 4;
Map[x + 1][y] += 1;
Map[x][y] -= 5;
}
}
break;
case 77: //往右
if (Map[x][y + 1] == 0 || Map[x][y + 1] == 3)
{
Map[x][y] -= 5;
Map[x][y + 1] += 5;
}
else if (Map[x][y + 1] == 4 || Map[x][y + 1] == 7)
{
if (Map[x][y + 2] == 0 || Map[x][y + 2] == 3)
{
Map[x][y + 2] += 4;
Map[x][y + 1] += 1;
Map[x][y] -= 5;
}
}
break;
}
}
}
#include "resource.h"
int main()
{
initgraph(550,550);
Game_play();
return 0;
}
/*
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define SIZE 70
#define M 10
#define N 11
int map[M][N];
//用二维数组画图
// 空地为0 墙为1
//目的地为3 箱子为4 人为5
IMAGE img[11];
void Game_Initmap();
void Game_Printmap();
void Game_Initmap(int live)
{
initgraph(SIZE*N, SIZE*M);
mciSendString("open ./res/bgm.mp3 alias music", 0, 0, 0);
loadimage(&img[0], "./res/Background.jpg", SIZE*N, SIZE*M); //背景
loadimage(&img[1], "./res/Wall.jpg", SIZE, SIZE); //墙
loadimage(&img[2], "./res/Tag2.jpg", SIZE, SIZE); //目的地
loadimage(&img[3], "./res/Tag1.jpg", SIZE, SIZE);
loadimage(&img[4], "./res/Box2.jpg", SIZE, SIZE); //箱子
loadimage(&img[5], "./res/Box1.jpg", SIZE, SIZE);
loadimage(&img[6], "./res/Per2.jpg", SIZE, SIZE); //人
loadimage(&img[7], "./res/Per1.jpg", SIZE, SIZE);
loadimage(&img[8], "./res/Boom2.jpg", SIZE, SIZE); //箱子推到目的地
loadimage(&img[9], "./res/Boom1.jpg", SIZE, SIZE);
loadimage(&img[10], "./res/END.jpg", SIZE*N, SIZE*M); //奖励
FILE *fp = fopen("map.txt", "r");
if (NULL == fp)
{
MessageBox(NULL, "亲地图加载失败了", NULL, NULL);
exit(0);
}
int FileOffset;
FileOffset = 112 * (live - 1);//112=10*11+2
fseek(fp, FileOffset, SEEK_SET);
// 用来找到文件指针当前的位置
// 打开的哪一个文件 偏移量 文件开始的位
for (int i = 0; i < M; i++) //对地图的初始化
{
for (int j = 0; j < N; j++)
{
char c = fgetc(fp);
//getc() 从文件中读出一个字符
//c = getchar();
map[i][j] = c - '0';
// 因为是字符 所以要-48
}
}
fclose(fp); //关闭文件 先写 防止忘记
}
int Game_Judgement()
{
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (map[i][j] == 4)
return 1;
}
}
return 0;
}
void Game_Printmap()
{
putimage(0, 0, &img[0]);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
switch (map[j][i])
{
default:
break;
case 0://空地
break;
case 1://墙
putimage(i*SIZE, j*SIZE, &img[1]);
break;
case 3://目的地
putimage(i*SIZE, j*SIZE, &img[2], SRCPAINT); //做或运算
putimage(i*SIZE, j*SIZE, &img[3], SRCAND); //做与运算
break;
case 4://箱子
putimage(i*SIZE, j*SIZE, &img[4], SRCPAINT);
putimage(i*SIZE, j*SIZE, &img[5], SRCAND);
break;
case 5://人为5
putimage(i*SIZE, j*SIZE, &img[6], SRCPAINT);
putimage(i*SIZE, j*SIZE, &img[7], SRCAND);
break;
case 7://箱子在目的地上
putimage(i*SIZE, j*SIZE, &img[8], SRCPAINT);
putimage(i*SIZE, j*SIZE, &img[9], SRCAND);
break;
case 8://人物在目的地上
putimage(i*SIZE, j*SIZE, &img[6], SRCPAINT);
putimage(i*SIZE, j*SIZE, &img[7], SRCAND);
break;
}
}
}
mciSendString("play music repeat", 0, 0, 0);
}
void Game_PlayGame()
{
int live = 0;
char ch;
int i, j;
while (true)
{
BeginBatchDraw();//开始批量绘图,防闪屏
cleardevice();
if (Game_Judgement())
{
live++;
if (7 == live)
{
Game_Printmap();
FlushBatchDraw(); //批量绘图 防闪屏
MessageBox(GetHWnd(), "闯关成功\r\n", "闯关提示", MB_OK);
putimage(0, 0, &img[10]);
FlushBatchDraw();
Sleep(3000); //续1S 停留一秒
closegraph(); //关闭窗口
exit(0); //结束程序
// sleep 可以试一下自己的电脑 休眠之后能否打开
}
Game_Initmap(live);
}
Game_Printmap();
EndBatchDraw();//批量绘图结束
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
if (map[i][j] == 5 || map[i][j] == 8)
break;
}
if (map[i][j] == 5 || map[i][j] == 8)
break;
}
ch = _getch();
switch (ch)
{
default:
break;
case 'W'://上
case 'w':
case 72:
if (map[i - 1][j] == 0 || map[i - 1][j] == 3)//上面为空地或者目的地
{
map[i - 1][j] += 5;
map[i][j] -= 5;
}
else if (map[i - 1][j] == 4 || map[i - 1][j] == 7)
{
if (map[i - 2][j] == 0 || map[i - 2][j] == 3)
{
map[i - 2][j] += 4;
map[i - 1][j] += 1;
map[i][j] -= 5;
}
}
break;
case 'A'://左
case 'a':
case 75:
if (map[i][j - 1] == 0 || map[i][j - 1] == 3)//左面为空地或者目的地
{
map[i][j - 1] += 5;
map[i][j] -= 5;
}
else if (map[i][j - 1] == 4 || map[i][j - 1] == 7)
{
if (map[i][j - 2] == 0 || map[i][j - 2] == 3)
{
map[i][j - 2] += 4;
map[i][j - 1] += 1;
map[i][j] -= 5;
}
}
break;
case 'S'://下
case 's':
case 80:
if (map[i + 1][j] == 0 || map[i + 1][j] == 3)//下面为空地或者目的地
{
map[i + 1][j] += 5;
map[i][j] -= 5;
}
else if (map[i + 1][j] == 4 || map[i + 1][j] == 7)
{
if (map[i + 2][j] == 0 || map[i + 2][j] == 3)
{
map[i + 2][j] += 4;
map[i + 1][j] += 1;
map[i][j] -= 5;
}
}
break;
case 'D'://右
case 'd':
case 77:
if (map[i][j + 1] == 0 || map[i][j + 1] == 3)//右面为空地或者目的地
{
map[i][j + 1] += 5;
map[i][j] -= 5;
}
else if (map[i][j + 1] == 4 || map[i][j + 1] == 7)
{
if (map[i][j + 2] == 0 || map[i][j + 2] == 3)
{
map[i][j + 2] += 4;
map[i][j + 1] += 1;
map[i][j] -= 5;
}
}
break;
}
}
}
int main()
{
Game_PlayGame();
return 0;
}