溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用C語言怎么編寫一個推箱子小游戲

發(fā)布時間:2020-12-29 14:02:11 來源:億速云 閱讀:167 作者:Leah 欄目:開發(fā)技術

本篇文章給大家分享的是有關利用C語言怎么編寫一個推箱子小游戲,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

游戲原理分析

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

首先從頭文件開始介紹:

#include<stdio.h> 
#include<stdlib.h> //malloc()函數(shù)
#include<string.h> //memcpy()函數(shù)
#include<conio.h> //getch()函數(shù)

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

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

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

上圖是簡單的8*8的圖,我們定義一個二維數(shù)組來保存整張圖,用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};

聲明函數(shù)原型:

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

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

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

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

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

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

//星星的個數(shù)
 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;
 }
 //箱子到了位置的個數(shù)
 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;
 }

最后就是最重要的主函數(shù)了:

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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

 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;
 }
 //箱子要到的位置的個數(shù)
 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;
 }
 //箱子到了位置的個數(shù)
 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");
 }

以上就是利用C語言怎么編寫一個推箱子小游戲,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI