最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言代碼實(shí)現(xiàn)推箱子小游戲

 更新時(shí)間:2020年12月29日 10:43:05   作者:菜學(xué)匠  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)推箱子小游戲的具體代碼,供大家參考,具體內(nèi)容如下

本次游戲是個(gè)推箱子第一關(guān)最簡(jiǎn)單的小游戲
有詳細(xì)注釋?zhuān)旅媸亲龀鰜?lái)的游戲界面

游戲操作說(shuō)明和功能說(shuō)明:

1、按wasd控制小人的上下左右移動(dòng)。
2、按 r 重新開(kāi)始游戲
3、游戲開(kāi)始有操作介紹
4、游戲結(jié)束有勝利提示

游戲原理分析

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

首先從頭文件開(kāi)始介紹:

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

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

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

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

上圖是簡(jiǎn)單的8*8的圖,我們定義一個(gè)二維數(shù)組來(lái)保存整張圖,用0,1,2,3,4 來(lái)代表游戲界面中的每個(gè)符號(hào)。代碼如下:

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

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

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

接著我們來(lái)給每個(gè)數(shù)字賦值他們所代表的符號(hào), 代碼如下:

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

接著我們需要一個(gè)開(kāi)始游戲之前的一個(gè)主界面來(lái)提示游戲玩法, 代碼如下:

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

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

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

再來(lái)記錄游戲開(kāi)始之前星星的個(gè)數(shù), 和箱子到了星星位置的個(gè)數(shù):

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

接著來(lái)給wasd 四個(gè)方向上的人物移動(dòng)做判斷, 確定人物的移動(dòng):

// 按w的時(shí)候的輸出結(jié)果
 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) /*判斷下一格子是不是箱子,下下個(gè)格子是不是箱子要到的地方*/
   {
    map[x][y] = 0;
    map[x-1][y] = 3;
    map[x-2][y] = 5;
   }
  }
  return 0;
 }
 //按d的時(shí)候的輸出結(jié)果
 int down()
 {
  if(map[x][y] == 3)    //找到自己
  {
   if(map[x+1][y] == 0)  //判斷下個(gè)格子是否空格
   {
   map[x+1][y] = 3;
   map[x][y] = 0;
   }
   if(map[x+1][y] == 2 && map[x+2][y] == 4) /*判斷下個(gè)格子是不是箱子且箱子后面的是不是星星*/
   {
    map[x][y] = 0;
    map[x+1][y] = 3;
    map[x+2][y] = 5;
   }
  }
  return 0;
 }
 //按a的時(shí)候的輸出結(jié)果
 int left()
 {
  if(map[x][y] == 3)
  {
   if(map[x][y-1] == 0)  //判斷下個(gè)格子是否空格
   {
    map[x][y-1] = 3;
    map[x][y] = 0;
   }
  if(map[x][y-1] == 2 && map[x][y-2] == 4) /*判斷下個(gè)格子是不是箱子且箱子后面的是不是星星*/  
  {
   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) /*判斷下個(gè)格子是不是箱子且箱子后面的格子是不是空格*/
  {
   map[x][y] = 0;
   map[x][y-1] = 3;
   map[x][y-2] = 2;
  }
  }
  return 0;
 }
 //按d的時(shí)候的輸出結(jié)果
 int right()
 {
  if(map[x][y] == 3)
  {
   if(map[x][y+1] == 0)  //判斷下個(gè)格子是否空格
   {
    map[x][y+1] =3;
    map[x][y] = 0;
   }
   if(map[x][y+1] == 2 && map[x][y+2] == 4)/*判斷下個(gè)格子是不是箱子且箱子后面的是不是星星*/
   {
    map[x][y] = 0;
    map[x][y+1] = 3;
    map[x][y+2] = 5;
   }
  }
  return 0;
 } 

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

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

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

接下來(lái)給出整個(gè)完整的程序,經(jīng)過(guò)gcc 編譯可以運(yùn)行,代碼如下:

#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的時(shí)候的輸出結(jié)果
 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) //判斷下一格子是不是箱子,下下個(gè)格子是不是箱子要到的地方
   {
    map[x][y] = 0;
    map[x-1][y] = 3;
    map[x-2][y] = 5;
   }
  }
  return 0;
 }
 //按d的時(shí)候的輸出結(jié)果
 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的時(shí)候的輸出結(jié)果
 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的時(shí)候的輸出結(jié)果
 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;
 }
 //箱子要到的位置的個(gè)數(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;
 }
 //箱子到了位置的個(gè)數(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"
   "***請(qǐng)按任意鍵游戲開(kāi)始~***\n"
   "*********制作:小菜*******\n"
   "**請(qǐng)按wasd 控制上下左右**\n"
   "**請(qǐng)按r重新開(kāi)始游戲******\n"
   "*************************\n");
 }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器

    C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解C++編程中的析構(gòu)函數(shù)

    詳解C++編程中的析構(gòu)函數(shù)

    這篇文章主要介紹了C++編程中的析構(gòu)函數(shù),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++中約數(shù)定理的實(shí)例詳解

    C++中約數(shù)定理的實(shí)例詳解

    這篇文章主要介紹了C++中約數(shù)定理的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

    C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

    用來(lái)映射Unicode字符串的WideCharToMultiByte函數(shù)經(jīng)常被用來(lái)進(jìn)行UTF-8編碼的轉(zhuǎn)換,以下我們將看到C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法,首先先來(lái)對(duì)WideCharToMultiByte作一個(gè)詳細(xì)的了解:
    2016-06-06
  • QT5中使用QRegularExpression代替QRegExp方法代碼

    QT5中使用QRegularExpression代替QRegExp方法代碼

    這篇文章主要給大家介紹了關(guān)于QT5中使用QRegularExpression代替QRegExp的相關(guān)資料,正則表達(dá)式(regep)是處理字符串和文本的強(qiáng)大工具,驗(yàn)證regexp可以測(cè)試子字符串是否滿(mǎn)足某些條件,例如是整數(shù)或不包含空格,需要的朋友可以參考下
    2024-04-04
  • Assert(斷言實(shí)現(xiàn)機(jī)制深入剖析)

    Assert(斷言實(shí)現(xiàn)機(jī)制深入剖析)

    言前后最好空一格[編程風(fēng)格的問(wèn)題,按你自已的喜好,適合自已就最好]。斷言只是用來(lái)檢查程序的邏輯正確性,不能代替條件替換。斷言比printf語(yǔ)句這種形式的打印好使
    2013-09-09
  • C++編寫(xiě)生成不重復(fù)的隨機(jī)數(shù)代碼

    C++編寫(xiě)生成不重復(fù)的隨機(jī)數(shù)代碼

    本文給大家匯總介紹了3種c++實(shí)現(xiàn)生成不重復(fù)的隨機(jī)數(shù)的函數(shù),十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • C語(yǔ)言平衡二叉樹(shù)真題練習(xí)

    C語(yǔ)言平衡二叉樹(shù)真題練習(xí)

    平衡二叉樹(shù)又被稱(chēng)為AVL樹(shù)(有別于AVL算法),且具有以下性質(zhì):它是一棵空樹(shù)或它的左右兩個(gè)子樹(shù)的高度差的絕對(duì)值不超過(guò)1,并且左右兩個(gè)子樹(shù)都是一棵平衡二叉樹(shù)。本文將詳解介紹一下平衡二叉樹(shù)的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-04-04
  • 基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼

    基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼

    今天通過(guò)本文給大家分享基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • OpenCV 2.4.3 C++ 平滑處理分析

    OpenCV 2.4.3 C++ 平滑處理分析

    平滑也稱(chēng)模糊, 是一項(xiàng)簡(jiǎn)單且使用頻率很高的圖像處理方法,本文將詳細(xì)介紹OpenCV 2.4+ C++ 平滑處理,需要了解更多的朋友可以詳細(xì)參考下
    2012-11-11

最新評(píng)論

神木县| 准格尔旗| 龙游县| 建阳市| 漠河县| 临泽县| 华容县| 临漳县| 郓城县| 博湖县| 辽源市| 中方县| 弥渡县| 鄂托克旗| 潮州市| 安平县| 绍兴县| 扎兰屯市| 深州市| 稷山县| 陵川县| 霍山县| 师宗县| 绿春县| 蒲城县| 教育| 鄂伦春自治旗| 九龙县| 遂宁市| 广州市| 凤台县| 厦门市| 利辛县| 香港| 弋阳县| 明溪县| 沛县| 滨海县| 和硕县| 浪卡子县| 庆云县|