欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)簡單的推箱子小游戲

 更新時間:2022年07月22日 08:58:10   作者:~小煤球  
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單的推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

此推箱子游戲可以實現(xiàn)人物移動,箱子移動,人物不出框,自義定文件關(guān)卡,重新開始以及回退復(fù)位等功能的實現(xiàn),由于系統(tǒng)或版本問題,關(guān)卡和人物及物體未做美化處理,希望美化的可自行美化。

1.所用到的宏

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#define MAX_ROWS 16
#define MAX_CLOS 16
#define MAX_LEVEL 5
#define FILE_NAME_LEN 40
#define ROAD 0 ?//路?
#define WALL 1 ?//墻?
#define BOX ?2 ?//箱子?
#define TERM 3 ?//門?
#define MOUS 4 ?//老鼠?
#define IGN ?224 //無效的鍵值?
#define LEFT ?75 //上下左右相對應(yīng)的鍵值?
#define RIGHT 77
#define UP ? ?72
#define DOWN ?80
#define MINT MOUS+TERM ? //老鼠在門上
#define BINT BOX+TERM ? ?//箱子在門上?
#define QUIT 'q'//退出?
#define RESET 'r'//重新開始?
#define BACK 'b'//回退?
#define NM ?0
#define MM ?1
#define BM ?2
#define MAX_BACK_STEP 10//回退最多的步數(shù)?

2.變量聲明

struct Act{
?? ?int dir;
?? ?int sta;?? ?
};
struct Act acts[MAX_BACK_STEP] = {};
int stepsize = 0;//用于記錄回退的數(shù)量
int newindex = -1;//用于記錄產(chǎn)生一個新的動作?
int board[MAX_ROWS][MAX_CLOS] = {};
int row, col;
int mx = 0,my = 0;//記錄老鼠位置?
int bcnt = 0;//記錄箱子

3.地圖文件開啟

void load(int level){//將地圖文件存放在Dev-CC文件夾下?
?? ?char fileName[FILE_NAME_LEN] = "";
?? ?sprintf(fileName,"%d.txt",level);
?? ?FILE *fp = fopen(fileName,"r");//只讀形式打開文件?
?? ?if(fp == NULL){
?? ??? ?printf("%s文件打開失敗\n",fileName);
?? ??? ?exit(-1);//失敗退出?
?? ?}?
?? ?fscanf(fp,"%d %d",&row,&col);
?? ?int i,j;
?? ?bcnt = 0;
?? ?for(i=0;i<row;i++){
?? ??? ?for(j=0;j<col;j++){
?? ??? ??? ?fscanf(fp,"%d",&board[i][j]);//讀取地圖行和列?
?? ??? ??? ?if(board[i][j] == MOUS || board[i][j] == MINT){
?? ??? ??? ??? ?mx = i;
?? ??? ??? ??? ?my = j;
?? ??? ??? ?}?
?? ??? ??? ?else if(board[i][j] == BOX || board[i][j] == BINT){
?? ??? ??? ??? ?++bcnt;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?fclose(fp);
?? ?stepsize = 0;
?? ?newindex = -1;//返回值初始化?
}?

4.地圖顯示及記錄模塊

//顯示地圖,記錄箱子到達(dá)終點?
int show(void){
?? ?int i,j;
?? ?int bs = 0;
?? ?for(i=0;i<row;i++){
?? ??? ?for(j=0;j<col;j++){
?? ??? ??? ?switch(board[i][j]){//畫出地圖?
?? ??? ??? ??? ?case ROAD:
?? ??? ??? ??? ??? ?printf(" ");
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?case WALL:
?? ??? ??? ??? ??? ?printf("#");
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?case BINT:
?? ??? ??? ??? ??? ?++bs;
?? ??? ??? ??? ?case BOX:
?? ??? ??? ??? ??? ?printf("@");
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?case TERM:
?? ??? ??? ??? ??? ?printf("O");
?? ??? ??? ??? ??? ?break;?
?? ??? ??? ??? ?case MOUS:
?? ??? ??? ??? ?case MINT:
?? ??? ??? ??? ??? ?printf("&");
?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?return bs;
}

5.物體的移動和關(guān)卡的延續(xù)

int move(int stepx,int stepy){//老鼠和箱子的移動?
?? ?int nx = mx + stepx;
?? ?int ny = my + stepy;
?? ?if (board[nx][ny] == ROAD || board[nx][ny] == TERM){
?? ??? ?board[mx][my] -= MOUS;
?? ??? ?board[nx][ny] += MOUS;
?? ??? ?mx = nx;
?? ??? ?my = ny;
?? ??? ?return MM;
?? ?}
?? ?else if(board[nx][ny] == BOX || board[nx][ny] == BINT){//推著箱子走?
?? ??? ?int nnx = nx + stepx;
?? ??? ?int nny = ny + stepy;//箱子的坐標(biāo)?
?? ??? ?if(board[nnx][nny] == ROAD || board[nnx][nny] == TERM){
?? ??? ??? ?board[nnx][nny] += BOX;//箱子到達(dá)新的地方?
?? ??? ??? ?board[nx][ny] -= BOX;//箱子從原來的地方離開
?? ??? ??? ?board[mx][my] -= MOUS;//老鼠離開?
?? ??? ? ? ?board[nx][ny] += MOUS;//老鼠到達(dá)的新的點?
?? ??? ? ? ?mx = nx;
?? ??? ? ? ?my = ny;
?? ??? ? ? ?return BM;
?? ??? ?}
?? ?}
?? ?return NM;
}

6.回退功能的實現(xiàn)(最難部分)

void moveback(int stepx,int stepy){//回退?
?? ?int nx = mx+stepx;
?? ?int ny = my+stepy;
?? ?board[mx][my] -= MOUS;
?? ?board[nx][ny] += MOUS;
?? ?if(acts[newindex].sta == BM){
?? ??? ?int bx = mx-stepx;
?? ??? ?int by = my-stepy;
?? ??? ?board[bx][by] -=BOX;
?? ??? ?board[mx][my] +=BOX;
?? ?}
?? ?mx = nx;
?? ?my = ny;
}
?
void back(void){
?? ?if(stepsize >0){
?? ??? ?switch(acts[newindex].dir){
?? ??? ??? ?case UP:
?? ??? ??? ??? ?moveback(+1,0);
?? ??? ??? ??? ?break;
?? ??? ??? ?case DOWN:
?? ??? ??? ??? ?moveback(-1,0);
?? ??? ??? ??? ?break;
?? ??? ??? ?case LEFT:
?? ??? ??? ??? ?moveback(0,+1);
?? ??? ??? ??? ?break;
?? ??? ??? ?case RIGHT:
?? ??? ??? ??? ?moveback(0,-1);
?? ??? ??? ??? ?break;?
?? ??? ?}
?? ??? ?--stepsize;
?? ??? ?--newindex;
?? ??? ?if(newindex == -1){
?? ??? ??? ?newindex = MAX_BACK_STEP -1;
?? ??? ?}
?? ?}
}

7.游戲運行主要部分

void play(int level){
?? ?while(1){
?? ??? ?system("cls");//清屏?
?? ??? ?int ret = show();
?? ??? ?if(ret == bcnt){//箱子和被推到終點的箱子數(shù)一樣時?
?? ??? ??? ?printf("恭喜過關(guān),按任意鍵進入下一關(guān)!!");
?? ??? ??? ?getch();
?? ??? ??? ?return;?
?? ??? ?}
?? ??? ?int key = getch();
?? ??? ?if(key == IGN){
?? ??? ??? ?key = getch();
?? ??? ?}
?? ??? ?if(key == QUIT){//退出?
?? ??? ??? ?printf("GAME OVER\n");
?? ??? ??? ?exit(0);
?? ??? ?}?
?? ??? ?else if(key == RESET){//重新開始?
?? ??? ??? ?load(level);//重新加載地圖?
?? ??? ?}
?? ??? ?else if(key == BACK){//回退功能?
?? ??? ??? ?back();?
?? ??? ?}
?? ??? ?ret = NM;
?? ??? ?switch(key){
?? ??? ??? ?case UP:
?? ??? ??? ??? ?ret = move(-1,0);
?? ??? ??? ??? ?break;
?? ??? ??? ?case DOWN:
?? ??? ??? ??? ?ret = move(+1,0);
?? ??? ??? ??? ?break;
?? ??? ??? ?case LEFT:
?? ??? ??? ??? ?ret = move(0,-1);
?? ??? ??? ??? ?break;
?? ??? ??? ?case RIGHT:
?? ??? ??? ??? ?ret = move(0,+1);
?? ??? ??? ? ? ?break;?? ??? ??? ??? ?
?? ??? ?}
?? ??? ?if(ret == MM || ret == BM){//保存有效動作 用于回退 ?
?? ??? ??? ?struct Act act = {key,ret}; //記錄動作
?? ??? ??? ?++newindex;
?? ??? ??? ?if(newindex>= MAX_BACK_STEP){
?? ??? ??? ??? ?newindex = 0;
?? ??? ??? ?}
?? ??? ??? ?acts[newindex] = act;
?? ??? ??? ?if(stepsize<MAX_BACK_STEP){
?? ??? ??? ??? ?++stepsize;//可以退回的步數(shù)+1?
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
?
//運行函數(shù)?
void run(void){
?? ?int level;
?? ?for(level=1;level<=MAX_LEVEL;level++){
?? ??? ?load(level);
?? ??? ?play(level);
?? ?}
}
//主函數(shù)?
int main(int argc, char *argv[]) {
?? ?run();
?? ?return 0;
}

8.參考關(guān)卡文件(可使用windos記事本以.txt 形式保存,第一列均為空格)

具體解釋存在于代碼中。如有不足,請指正!

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

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之堆的具體使用

    數(shù)據(jù)結(jié)構(gòu)之堆的具體使用

    本文主要介紹了數(shù)據(jù)結(jié)構(gòu)之堆的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Qt透明無邊框窗口的實現(xiàn)示例

    Qt透明無邊框窗口的實現(xiàn)示例

    這篇文章主要介紹了Qt透明無邊框窗口的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 淺談MFC 改變控件大小和位置

    淺談MFC 改變控件大小和位置

    在用VC開發(fā)應(yīng)用程序時,經(jīng)常會要做一些可以改變大小的對話框,而這個時候就要求對話框上的控件會隨著對話框大小的改變而改變自己的位置和大小。下面我們就來探討下在MFC中如何改變控件大小和位置
    2015-06-06
  • 淺談C++內(nèi)存分配及變長數(shù)組的動態(tài)分配

    淺談C++內(nèi)存分配及變長數(shù)組的動態(tài)分配

    下面小編就為大家?guī)硪黄獪\談C++內(nèi)存分配及變長數(shù)組的動態(tài)分配。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • c++ STL常用遍歷算法

    c++ STL常用遍歷算法

    這篇文章主要介紹了c++ STL常用遍歷算法的實現(xiàn),幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-12-12
  • C++超詳細(xì)分析順序表

    C++超詳細(xì)分析順序表

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示
    2022-03-03
  • 用VC++6.0實現(xiàn)石頭剪刀布游戲的程序

    用VC++6.0實現(xiàn)石頭剪刀布游戲的程序

    最先看到這個游戲代碼是python版的,后來看到有小伙伴用VC++重寫了一遍,運行之后發(fā)現(xiàn)有些小bug,便嘗試這修復(fù)了一下,并增加了些小功能,這里分享給大家。
    2015-03-03
  • C++定時器實現(xiàn)和時間輪介紹

    C++定時器實現(xiàn)和時間輪介紹

    這篇文章主要介紹了C++定時器實現(xiàn)和時間輪介紹,定時器可以由很多種數(shù)據(jù)結(jié)構(gòu)實現(xiàn),比如最小堆、紅黑樹、跳表、甚至數(shù)組都可以,其本質(zhì)都是拿到最小時間的任務(wù),然后取出該任務(wù)并執(zhí)行,更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-09-09
  • C++中的Lambda表達(dá)式及表達(dá)式語句

    C++中的Lambda表達(dá)式及表達(dá)式語句

    這篇文章主要介紹了C++中的Lambda表達(dá)式及表達(dá)式語句,表達(dá)式這個概念在C++中屬于比較細(xì)節(jié)的知識了,很多時候我們只用知道怎么用,對于編譯器內(nèi)部怎么處理我們并不關(guān)心;并且關(guān)于左值和右值這個概念,也是C++比較深的一個小知識點,需要的朋友可以參考一下
    2021-12-12
  • c++ 內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別

    c++ 內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別

    內(nèi)聯(lián)函數(shù)是c++為了提高程序的運行速度做的改進,那么內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別是什么,本文就來詳細(xì)的介紹一下,感興趣的朋友可以了解一下
    2021-05-05

最新評論