基於VS 2010下圖形庫版本的 C++程式之推箱子
/********** 2017.2.21 make by qiu **********/
/***牆 1,箱子 4,目的地 3,人 5,空地0 ********/
/*********箱子在目地地 4+3 *****/
/*********人在目地地 5+3 ********/
#include <stdio.h>
#include <graphics.h> //圖形庫 //TC2.0 VC6.0
#include <mmsystem.h> //多媒體
#pragma comment(lib,"winmm.lib") //庫檔案
#include <conio.h>
IMAGE backImage, blankImg, boxImg, peopleImg, darkboxImg, endpointImg, wallImg;
int map[8][8] = { //用不同的數字去表示不同的元素 打印出介面.
{ 0,0,1,1,1,1,0,0 },
{ 0,0,1,3,3,1,0,0 },
{ 0,1,1,0,3,1,1,0 },
{ 0,1,0,0,4,3,1,0 },
{ 1,1,0,4,0,0,1,1 },
{ 1,0,0,1,4,4,0,1 },
{ 1,0,5,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1 }
};
void DrawMap();
void PlayGame();
void Game_inti();
//主函式
int main()
{
initgraph(800,800);
Game_inti();
PlayGame();
return 0;
}
//畫出來
void DrawMap()
{
//for迴圈遍歷二維陣列
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
switch (map[i][j])
{
case 0: //空地
putimage(i * 100, j * 100, &blankImg);
break;
case 1:
putimage(i * 100, j * 100, &wallImg);
break;
case 3:
putimage(i * 100, j * 100, &endpointImg);
break;
case 4:
putimage(i * 100, j * 100, &boxImg);
break;
case 5:
putimage(i * 100, j * 100, &peopleImg);
break;
case 7:
putimage(i * 100, j * 100, &darkboxImg);
break;
case 8:
putimage(i * 100, j * 100, &peopleImg);
break;
}
}
printf("\n");
}
}
//玩遊戲 原理:不斷改變陣列元素,然後重新列印
void PlayGame()
{
//
char input;
int i, j; //迴圈控制變數
int peoR, peoC; //人的下標
while (1)
{
cleardevice();
DrawMap();
//確定人的位置
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
if (map[i][j] == 5 || map[i][j] == 8) //5人
{
peoR = i;
peoC = j;
}
}
}
printf("(%d %d)", peoR, peoC);
input = getch();
//對不同的鍵盤輸入採取不同的處理 //分支結構
switch (input)
{
case 'W': //上 WASD 上下左右鍵控制方向
case 'w':
case 72: //鍵值
//判斷人的前面是空地或者目的地 //改變兩個位置
if (map[peoR][peoC - 1] == 0 || map[peoR][peoC - 1] == 3)
{
map[peoR][peoC - 1] += 5;
map[peoR][peoC] -= 5;
}
//改變三個位置 箱子
else if (map[peoR][peoC - 1] == 4 || map[peoR][peoC - 1] == 7)
{
if (map[peoR][peoC - 2] == 0 || map[peoR][peoC - 2] == 3)
{
map[peoR][peoC - 2] += 4;
map[peoR][peoC - 1] += 1;
map[peoR][peoC] -= 5;
}
}
break;
case 'S': //下
case 's':
case 80: //map[peoR + 1][peoC]
//判斷人的前面是空地或者目的地 //改變兩個位置
if (map[peoR][peoC + 1] == 0 || map[peoR][peoC + 1] == 3)
{
map[peoR][peoC + 1] += 5;
map[peoR][peoC] -= 5;
}
//改變三個位置 箱子
else if (map[peoR][peoC + 1] == 4 || map[peoR][peoC + 1] == 7)
{
if (map[peoR][peoC + 2] == 0 || map[peoR][peoC + 2] == 3)
{
map[peoR][peoC + 2] += 4;
map[peoR][peoC + 1] += 1;
map[peoR][peoC] -= 5;
}
}
break;
case 'A': //map[peoR][peoC - 1]
case 'a':
case 75:
//判斷人的前面是空地或者目的地 //改變兩個位置
if (map[peoR - 1][peoC] == 0 || map[peoR - 1][peoC] == 3)
{
map[peoR - 1][peoC] += 5;
map[peoR][peoC] -= 5;
}
//改變三個位置 箱子
else if (map[peoR - 1][peoC] == 4 || map[peoR - 1][peoC] == 7)
{
if (map[peoR - 2][peoC] == 0 || map[peoR - 2][peoC] == 3)
{
map[peoR - 2][peoC] += 4;
map[peoR - 1][peoC] += 1;
map[peoR][peoC] -= 5;
}
}
break;
case 'D':
case 'd':
case 77:
//判斷人的前面是空地或者目的地 //改變兩個位置
if (map[peoR + 1][peoC] == 0 || map[peoR + 1][peoC] == 3)
{
map[peoR + 1][peoC] += 5;
map[peoR][peoC] -= 5;
}
//改變三個位置 箱子
else if (map[peoR + 1][peoC] == 4 || map[peoR + 1][peoC] == 7)
{
if (map[peoR + 2][peoC] == 0 || map[peoR + 2][peoC] == 3)
{
map[peoR + 2][peoC] += 4;
map[peoR + 1][peoC] += 1;
map[peoR][peoC] -= 5;
}
}
break;
}
}
}
void Game_inti()
{
PlaySound(L"夢中的婚禮.wav", NULL, SND_LOOP | SND_ASYNC | SND_FILENAME); //迴圈播放, 非同步處理, 檔案的名稱
loadimage(&backImage, L"./Image/background.jpg", 800, 800);
loadimage(&blankImg, L"./Image/blank.jpg", 100, 100);
loadimage(&boxImg, L"./Image/box.jpg", 100, 100);
loadimage(&peopleImg, L"./Image/people.jpg", 100, 100);
loadimage(&darkboxImg, L"./Image/Darkbox.jpg", 100, 100);
loadimage(&wallImg, L"./Image/wall.jpg", 100, 100);
loadimage(&endpointImg, L"./Image/EndPoint.jpg", 100, 100);
}