C語言實現推箱子
在網上學習並完成這個推箱子的小遊戲,記錄下來
一、工具介紹
1、easyx圖形庫工具
2、vs2013及以上都可以
二、代碼實現
1、用到的頭文件
#include<stdio.h>
#include <stdlib.h>
#include<easyx.h>
#include"resource.h"
#include<conio.h>
#pragma comment(lib,"winmm.lib")
2、初始化地圖,定義了一個二維數組,利用二維數組來對地圖上的元素實現定義(如:0爲空地,1是圍牆,2是人物,3是目的地,4是箱子,5是箱子進入目的地,6是人進入目的地)
int arr[10][10] =
{
{1,1,1,1,1,1,1,1,1,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,4,4,0,1},
{1,0,0,0,0,2,3,3,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 map[10][10];
int map1[10][10];
IMAGE image[6];//圖片函數 定義圖片數組
int life = 0;//定義血量
3、對遊戲初始化,使定義的全局變量等於定義的二維數組
void init()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
map[i][j] = arr[i][j];
}
}
}
4、利用貼圖函數對遊戲貼圖,
void drawmap()
{
BeginBatchDraw();//開始批量貼圖
putimage(0, 0, &image[0]);//貼空地的圖片
for (int i = 0; i < 10; i++)//遍歷地圖,尋找元素
{
for (int j = 0; j < 10; j++)
{
switch (map[i][j])
{
case 1: putimage(50 * j, 50 * i, &image[1]); break;//圍牆
case 2: putimage(50 * j, 50 * i, &image[2]); break;//人
case 3: putimage(50 * j, 50 * i, &image[3]); break;//目的地
case 4: putimage(50 * j, 50 * i, &image[4]); break;//箱子
case 5: putimage(50 * j, 50 * i, &image[5]); break;//箱子進入目的地
case 6: putimage(50 * j, 50 * i, &image[2]); break;//人進目的地
}
}
}
EndBatchDraw();//結束貼圖
}
5、悔棋的函數(就是保存上一步各個元素的位置)
void huiqi()//返回上一步
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
map1[i][j] = map[i][j];
}
}
}
6、移動的函數,主要的思想就是對人和箱子下一步的位置進行判斷,通過改變值,來使人物和箱子移動
void play()
{
int i, j;
for (int n = 0; n < 10; n++)//遍歷數組,找人
{
for (int m = 0; m < 10; m++)
if (map[n][m] == 2 || map[n][m] == 6)
{
i = n;
j = m;
}
}
char key = _getch();
switch (key)//判斷按鍵
{
case 'r':case 'R':
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
map[i][j] = map1[i][j];
}
}
break;
case'w':case'W': //按w鍵
huiqi();//每次按下w鍵,記錄當前位置後,在進行移動
if (map[i - 1][j] == 0)//人面前是空地
{
map[i - 1][j] = 2;//人往前走
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i - 1][j] == 3)//人面前是目的地
{
map[i - 1][j] = 6;
if (map[i][j] == 6)//人站在目的地
map[i][j] = 3;
else//人站在空地上
map[i][j] = 0;
}
else if (map[i - 1][j] == 4)//人前是空地上的箱子
{
if (map[i - 2][j] == 0)//箱子和人向前走遇見的是空地
{
map[i - 2][j] = 4;
map[i - 1][j] = 2;
if (map[i][j] == 6)//對人原位置進行判斷
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i - 2][j] == 3)//遇見的是目的地
{
map[i - 2][j] = 5;
map[i - 1][j] = 2;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
}
else if (map[i - 1][j] == 5)//人前是在目的地的箱子
{
if (map[i - 2][j] == 0)//箱子前是空地
{
map[i - 2][j] = 4;
map[i - 1][j] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i - 2][j] == 3)//箱子前是目的地
{
map[i - 2][j] = 5;
map[i - 1][j] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
break;
case's':case'S':
huiqi();//每次按下s鍵,記錄當前位置後,在進行移動
if (map[i + 1][j] == 0)//人面前是空地
{
map[i + 1][j] = 2;//人往前走
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i + 1][j] == 3)//人面前是目的地
{
map[i + 1][j] = 6;
if (map[i][j] == 6)//人站在目的地
map[i][j] = 3;
else//人站在空地上
map[i][j] = 0;
}
else if (map[i + 1][j] == 4)//人前是箱子
{
if (map[i + 2][j] == 0)//箱子和人向前走
{
map[i + 2][j] = 4;
map[i + 1][j] = 2;
if (map[i][j] == 6)//對人原位置進行判斷
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i+ 2][j] == 3)
{
map[i + 2][j] = 5;
map[i + 1][j] = 2;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
else if (map[i + 1][j] == 5)
{
if (map[i + 2][j] == 0)
{
map[i + 2][j] = 4;
map[i + 1][j] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i + 2][j] == 3)
{
map[i+ 2][j] = 5;
map[i+ 1][j] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
break;
case'A':case'a':
huiqi();//每次按下a鍵,記錄當前位置後,在進行移動
if (map[i][j - 1] == 0)//人面前是空地
{
map[i][j - 1] = 2;//人往前走
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i][j - 1] == 3)//人面前是目的地
{
map[i][j - 1] = 6;
if (map[i][j] == 6)//人站在目的地
map[i][j] = 3;
else//人站在空地上
map[i][j] = 0;
}
else if (map[i][j-1] == 4)//人前是箱子
{
if (map[i][j - 2] == 0)//箱子和人向前走
{
map[i][j - 2] = 4;
map[i][j - 1] = 2;
if (map[i][j] == 6)//對人原位置進行判斷
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i][j - 2] == 3)
{
map[i][j - 2] = 5;
map[i][j - 1] = 2;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
else if (map[i ][j-1] == 5)
{
if (map[i][j-2] == 0)
{
map[i ][j-2] = 4;
map[i ][j-1] = 6;
if (map[i][j] == 6)
map[i][j] =3;
else
map[i][j] = 0;
}
else if (map[i][j-2] == 3)
{
map[i ][j-2] = 5;
map[i][j-1] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
break;
case'd':case'D':
huiqi();//每次按下d鍵,記錄當前位置後,在進行移動
if (map[i][j + 1] == 0)//人面前是空地
{
map[i][j + 1] = 2;//人往前走
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i][j + 1] == 3)//人面前是目的地
{
map[i][j + 1] = 6;
if (map[i][j] == 6)//人站在目的地
map[i][j] = 3;
else//人站在空地上
map[i][j] = 0;
}
else if (map[i][j + 1] == 4)//人前是箱子
{
if (map[i][j + 2] == 0)//箱子和人向前走
{
map[i][j + 2] = 4;
map[i][j + 1] = 2;
if (map[i][j] == 6)//對人原位置進行判斷
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i ][j+2] == 3)
{
map[i ][j+2] = 5;
map[i ][j+1] = 2;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
else if (map[i][j + 1] == 5)
{
if (map[i][j + 2] == 0)
{
map[i][j + 2] = 4;
map[i][j + 1] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
else if (map[i][j + 2] == 3)
{
map[i][j + 2] = 5;
map[i][j + 1] = 6;
if (map[i][j] == 6)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
break;
}
}
7、判斷輸贏的函數
void win()//判斷輸贏
{
int number = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[i][j] == 4)//說明地圖上還有箱子
number++;
}
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[i][j] == 4)//說明地圖上還有箱子
{
if (map[i - 1][j] == 1 || map[i + 1][j] == 1)
{
if (map[i][j - 1] == 1 || map[i][j + 1] == 1)
{
life = 2;//loss
}
}
}
}
}
if (number == 0)
{
life = 1;//win
}
}
8、在主函數中的調用,用loadimage加載的圖片可以自己在網上找,並把它們保存在自己的項目中,方便調用
int main()
{
initgraph(500, 500);
loadimage(&image[0], L"背景.PNG", 500, 500);//背景
loadimage(&image[1], L"牆.PNG", 50, 50);//50爲加載圖片x的長度和y的長度
loadimage(&image[2], L"推人.PNG", 50, 50);
loadimage(&image[3], L"目的地.PNG", 50, 50);
loadimage(&image[4], L"箱子.png", 50, 50);
loadimage(&image[5], L"箱子和目的地重合.PNG", 50, 50);
init();
drawmap();
while (1)
{
play();
drawmap();
win();
if (life == 1)
{
if (MessageBox(GetHWnd(), L"遊戲勝利", L"是否繼續", MB_YESNO) == IDYES)//如果按下是,進入if語句
{
life = 0;//下次循環不會進入if(語句)
level++;
if (level == 3)//end
{
if (MessageBox(GetHWnd(), L"最後一關結束", L"是否回到第一關", MB_YESNO) == IDYES)
{
level = 0;
init();
drawmap();
}
else return 0;
}
init();
drawmap();
}
else
return 0;
}
if (life == 2)//遊戲失敗
{
life = 0;
if (MessageBox(GetHWnd(), L"遊戲失敗", L"是否重新開始", MB_YESNO) == IDYES)//如果按下是,進入if語句
{
init();
drawmap();
}
}
}
system("pause");
closegraph();
return 0;
}
本文件用作留念,可以適當用來參考