程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> c語言實現的推箱子小游戲

c語言實現的推箱子小游戲

編輯:關於C

本次游戲是個推箱子第一關最簡單的小游戲
有詳細注釋,下面是做出來的游戲界面

做出來的游戲界面

這裡寫圖片描述
游戲操作說明和功能說明:

按wasd控制小人的上下左右移動。 按 r 重新開始游戲 游戲開始有操作介紹 游戲結束有勝利提示

游戲原理分析

游戲開始時的星星個數 = 箱子在星星上的個數時 , 游戲勝利。 按 r 鍵重新開始游戲, 我們需要定義一個量 map_1[8][8] 來保存游戲初始時的界面, 操作時我們將其賦值給 map[8][8] 來進行操作,以便重新歸位, 這裡就用到了memcpy()函數。 wasd 代表上下左右 操作人物移動, 分別需要為其定義一個函數。 判斷人物移動之前我們需要定位到人物的位置,這裡我們用find()函數來定義。

首先從頭文件開始介紹:

#include  
#include   //malloc()函數
#include   //memcpy()函數
#include    //getch()函數

函數名稱:malloc
函數原型: void * malloc(unsigned size);
函數功能: 分配size字節的存儲區
函數返回: 所分配的內存區地址,如果內存不夠,返回0

函數函數:memcpy
函數原型:void *memcpy(void *dest, const void *src, size_t n);
函數功能:從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中
函數返回:函數返回指向dest的指針。

函數名稱:getch
函數原型: int getch(void);
函數功能: 從控制台讀取一個字符,但不顯示在屏幕上
函數返回: 讀取的字符

上圖是簡單的8*8的圖,我們定義一個二維數組來保存整張圖,用0,1,2,3,4 來代表游戲界面中的每個符號。代碼如下:

 int map_1[8][8]={
     {0,0,1,1,1,0,0,0},
     {0,0,1,4,1,0,0,0},
     {0,0,1,2,1,1,1,1},
     {1,1,1,0,0,2,4,1},
     {1,4,0,2,3,1,1,1},
     {1,1,1,1,2,1,0,0},
     {0,0,0,1,4,1,0,0},
     {0,0,0,1,1,1,0,0}
 }; 

定義全局變量:

int x, y;
int map[8][8] = {0};

聲明函數原型:

int count1();     // 星星的個數
 int count2();    // 箱子到了星星的位置的個數

 int up();        
 int down();
 int left();
 int right();

 int shuchu();
 int find();          //找到自己
 int zhujiemian();    //輸出主界面

接著我們來給每個數字賦值他們所代表的符號, 代碼如下:

int shuchu()
 {
     for(x=0; x<8; x++)
     {
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 1)
                 printf("■"); //輸出磚塊的樣子
             if(map[x][y] == 3)
                 printf("⊙"); //輸出自己的位置
             if(map[x][y] == 2)
                 printf("□"); //輸出箱子
             if(map[x][y] == 4)
                 printf("☆"); //輸出箱子要到的位置
             if(map[x][y] == 0)
                 printf("  "); //輸出空白
             if(map[x][y] == 5) 
                 printf("★"); //輸出箱子到了該到的位置
         }
         printf("\n");
     }
     return 0;
 }

接著我們需要一個開始游戲之前的一個主界面來提示游戲玩法, 代碼如下:

 //制作主界面
int zhujiemian()
 {
     printf("*************************\n"
            "****請按任意鍵游戲開始~*****\n"
            "****制作:菜學匠************\n"
            "****請按wasd 控制上下左右****\n"
            "****請按r重新開始游戲*******\n"
            "*************************\n");
            }

接著要想操作人物移動首先要找到界面中人物的位置:

 //找到自己的位置
 int find()
 {
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 3)
                 return 0;
         }
         return 0;
 }

再來記錄游戲開始之前星星的個數, 和箱子到了星星位置的個數:

//星星的個數
 int count1()
 {
     int n=0;
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 4)
                 n++;
         }
    return n;
 }
 //箱子到了位置的個數
 int count2()
 {
     int m=0;
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 5)
                 m++;
         }
         return m;
 }

接著來給wasd 四個方向上的人物移動做判斷, 確定人物的移動:

// 按w的時候的輸出結果
 int up()
 {
     if(map[x][y] == 3) //找到自己的位置
     {
         if(map[x-1][y] == 0) //判斷下一格子是不是空
         {
             map[x-1][y] = 3;
             map[x][y] = 0;
         }
         if(map[x-1][y] == 2 && map[x-2][y] == 4) /*判斷下一格子是不是箱子,下下個格子是不是箱子要到的地方*/
         {
             map[x][y] = 0;
             map[x-1][y] = 3;
             map[x-2][y] = 5;
         }
     }
     return 0;
 }
 //按d的時候的輸出結果
 int down()
 {
     if(map[x][y] == 3)             //找到自己
     {
         if(map[x+1][y] == 0)       //判斷下個格子是否空格
         {
            map[x+1][y] = 3;
            map[x][y] = 0;
         }
         if(map[x+1][y] == 2 && map[x+2][y] == 4)  /*判斷下個格子是不是箱子且箱子後面的是不是星星*/
         {
             map[x][y] = 0;
             map[x+1][y] = 3;
             map[x+2][y] = 5;
         }
     }
     return 0;
 }
 //按a的時候的輸出結果
 int left()
 {
     if(map[x][y] == 3)
     {
         if(map[x][y-1] == 0)     //判斷下個格子是否空格
         {
             map[x][y-1] = 3;
             map[x][y] = 0;
         }
        if(map[x][y-1] == 2 && map[x][y-2] == 4)    /*判斷下個格子是不是箱子且箱子後面的是不是星星*/      
        {
            map[x][y] = 0;
            map[x][y-1] = 3;
            map[x][y-2] = 5;
        }
        if(map[x][y-2] == 0 && map[x][y-1] == 2) /*判斷下個格子是不是箱子且箱子後面的格子是不是空格*/
        {
            map[x][y] = 0;
            map[x][y-1] = 3;
            map[x][y-2] = 2;
        }
     }
     return 0;
 }
 //按d的時候的輸出結果
 int right()
 {
     if(map[x][y] == 3)
     {
         if(map[x][y+1] == 0)     //判斷下個格子是否空格
         {
             map[x][y+1] =3;
             map[x][y] = 0;
         }
         if(map[x][y+1] == 2 && map[x][y+2] == 4)/*判斷下個格子是不是箱子且箱子後面的是不是星星*/
         {
             map[x][y] = 0;
             map[x][y+1] = 3;
             map[x][y+2] = 5;
         }
     }
     return 0;
 } 

最後就是最重要的主函數了:

int main()
 {
     int n,m;
     system("title 推箱子游戲~");    //給一個標題

     memcpy(map, map_1, sizeof(map_1));   

     zhujiemian();

     getch();

     system("cls");               //清屏

     n=count1();                  

     while(1)
     {
         system("cls");
         shuchu();
         m= count2();
         find();

         switch(getch())
         {
             case 'w':up(); break;
             case 's':down(); break;
             case 'a':left(); break;
             case 'd':right(); break;
             case 'r':memcpy(map, map_1, sizeof(map_1)); break;
         }

         if(n==m)
         {
            system("cls");
            printf("游戲勝利~\n");
            getch();
            return 0;
         }
     }
 }

接下來給出整個完整的程序,經過gcc 編譯可以運行,代碼如下:

#include
#include
#include
#include

 int x=0,y=0;

 int map[8][8]={0};
 // 定義的游戲界面模型
 int map_1[8][8]={
     {0,0,1,1,1,0,0,0},
     {0,0,1,4,1,0,0,0},
     {0,0,1,2,1,1,1,1},
     {1,1,1,0,0,2,4,1},
     {1,4,0,2,3,1,1,1},
     {1,1,1,1,2,1,0,0},
     {0,0,0,1,4,1,0,0},
     {0,0,0,1,1,1,0,0}
 };

 int count1();
 int count2();

 int ();
 up();
 int down();
 int left();
 int right
 int shuchu();
 int find();
 int zhujiemian();

 int main()
 {
     int n,m;
     system("title 推箱子游戲~");

     memcpy(map, map_1, sizeof(map_1));

     zhujiemian();

     getch();

     system("cls");

     n=count1();

     while(1)
     {
         system("cls");
         shuchu();
         m= count2();
         find();

         switch(getch())
         {
             case 'w':up(); break;
             case 's':down(); break;
             case 'a':left(); break;
             case 'd':right(); break;
             case 'r':memcpy(map, map_1, sizeof(map_1)); break;
         }

         if(n==m)
         {
            system("cls");
            printf("游戲勝利~\n");
            getch();
            return 0;
         }
     }
 }
 // 按w的時候的輸出結果
 int up()
 {
     if(map[x][y] == 3) //找到自己的位置
     {
         if(map[x-1][y] == 0) //判斷下一格子是不是空
         {
             map[x-1][y] = 3;
             map[x][y] = 0;
         }
         if(map[x-1][y] == 2 && map[x-2][y] == 4) //判斷下一格子是不是箱子,下下個格子是不是箱子要到的地方
         {
             map[x][y] = 0;
             map[x-1][y] = 3;
             map[x-2][y] = 5;
         }
     }
     return 0;
 }
 //按d的時候的輸出結果
 int down()
 {
     if(map[x][y] == 3)
     {
         if(map[x+1][y] == 0)
         {
            map[x+1][y] = 3;
            map[x][y] = 0;
         }
         if(map[x+1][y] == 2 && map[x+2][y] == 4)
         {
             map[x][y] = 0;
             map[x+1][y] = 3;
             map[x+2][y] = 5;
         }
     }
     return 0;
 }
 //按a的時候的輸出結果
 int left()
 {
     if(map[x][y] == 3)
     {
         if(map[x][y-1] == 0)
         {
             map[x][y-1] = 3;
             map[x][y] = 0;
         }
        if(map[x][y-1] == 2 && map[x][y-2] == 4)
        {
            map[x][y] = 0;
            map[x][y-1] = 3;
            map[x][y-2] = 5;
        }
        if(map[x][y-2] == 0 && map[x][y-1] == 2)
        {
            map[x][y] = 0;
            map[x][y-1] = 3;
            map[x][y-2] = 2;
        }
     }
     return 0;
 }
 //按d的時候的輸出結果
 int right()
 {
     if(map[x][y] == 3)
     {
         if(map[x][y+1] == 0)
         {
             map[x][y+1] =3;
             map[x][y] = 0;
         }
         if(map[x][y+1] == 2 && map[x][y+2] == 4)
         {
             map[x][y] = 0;
             map[x][y+1] = 3;
             map[x][y+2] = 5;
         }
     }
     return 0;
 } 

 int shuchu()
 {
     for(x=0; x<8; x++)
     {
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 1)
                 printf("■"); //輸出磚塊的樣子
             if(map[x][y] == 3)
                 printf("⊙"); //輸出自己的位置
             if(map[x][y] == 2)
                 printf("□"); //輸出箱子
             if(map[x][y] == 4)
                 printf("☆"); //輸出箱子要到的位置
             if(map[x][y] == 0)
                 printf("  "); //輸出空白
             if(map[x][y] == 5) 
                 printf("★"); //輸出箱子到了該到的位置
         }
         printf("\n");
     }
     return 0;
 }
 //找到自己的位置
 int find()
 {
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 3)
                 return 0;
         }
         return 0;
 }
 //箱子要到的位置的個數
 int count1()
 {
     int n=0;
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 4)
                 n++;
         }
    return n;
 }
 //箱子到了位置的個數
 int count2()
 {
     int m=0;
     for(x=0; x<8; x++)
         for(y=0; y<8; y++)
         {
             if(map[x][y] == 5)
                 m++;
         }
         return m;
 }
 //制作主界面
 int zhujiemian()
 {
     printf("*************************\n"
            "***請按任意鍵游戲開始~***\n"
            "*********制作:小菜*******\n"
            "**請按wasd 控制上下左右**\n"
            "**請按r重新開始游戲******\n"
            "*************************\n");
            }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved