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;
   }

本文件用作留念,可以適當用來參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章