需要 C 标识符吗?

标签 c maze

我正在开发一个迷宫游戏,所以我查找了一些迷宫生成代码并发现了这个 http://en.wikipedia.org/wiki/User:Purpy_Pupple/Maze首先,我得到 Expected ',',一旦我在该行添加 , ,它就会给我“Mze.c:33: 预期标识符”

这是我的修改版本(仅修复错误) 我刚刚开始学习C。

//Purpy Pupple's amazing maze generator. 
//Released under the CC-BY-SA 3.0 License and the GFDL
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define UP 0     //-y
#define DOWN 1   //+y
#define LEFT 2   //-x
#define RIGHT 3  //+x
#define OUTFILE "MAZE"
#define WHITE fprintf(outfile, "%c%c%c", 255,255,255)
#define BLACK fprintf(outfile, "%c%c%c", 0,0,0)
#define RED   fprintf(outfile, "%c%c%c", 0,0,255)

//#define nodeadend//generate a maze without any dead ends! (consequently, many solutions to maze)
#define prim    //enable this to generate mazes using prim's algorithm.
#define backtrack//enable this to generate mazes using depth-first search. Don't enable both.
//#define movie   //this option spams bitmaps to illustrate each step of generation.

long numin=1;     //Number of cells in the maze.
const int xsize=152;
const int ysize=122;

void initialize();
void generate();
void savebmp(int xspecial, int yspecial);


struct cell; 

struct cell {
//I have no idea why it wanted the ',' there
        ,bool in, up, left;//Does the wall to the left of this cell exist?
        int prevx, prevy; //The coordinates of the previous cell, used for backtracking.
};

cell MAZE[xsize][ysize];

int main(){
        srand((unsigned int)time(NULL)); //seed random number generator with system time
        initialize();      //initialize the maze
        generate();        //generate the maze
#ifdef movie
        for(int i=1;i<10;i++){
                numin++;
                savebmp(0,0);      //output the bitmap
        }
#else movie
        savebmp(0,0);
#endif
        return 0;
}

void initialize(){
        //Initialize the maze!
        for(int x=0;x<xsize;x++){
                for(int y=0;y<ysize;y++){
                        //The maze cells on the edges of the maze are "in" to provide padding. Otherwise, all maze cells are not in.
                        MAZE[x][y].in   = (x==0||x==xsize-1||y==0||y==ysize-1)?1:0;
                        //All maze cells have all walls existing by default, except the perimeter cells.
                        MAZE[x][y].up   = (x==0||x==xsize-1||y==0)?0:1;
                        MAZE[x][y].left = (x==0||y==0||y==ysize-1)?0:1;
                }
        }
        return;
}

void generate(){
        int xcur=1, ycur=1;//start growing from the corner. It could theoretically start growing from anywhere, doesn't matter.
        MAZE[xcur][ycur].in = 1;
        int whichway;
        bool success;
        do{
#ifdef movie
                savebmp(xcur,ycur);
#endif
#ifdef nodeadend
                if( MAZE[xcur][ycur-1].in&&MAZE[xcur][ycur+1].in&&
                           MAZE[xcur-1][ycur].in&&MAZE[xcur+1][ycur].in ){
                                   //If at a dead end, randomly destroy a wall to make it not a dead end!
                        do{
                                success=0;
                                whichway=rand()%4;
                                switch(whichway){
                                case UP:
                                        if(MAZE[xcur][ycur].up&&ycur!=1){
                                                success=1;
                                                MAZE[xcur][ycur].up=0;
                                        }
                                        break;
                                case DOWN:
                                        if(MAZE[xcur][ycur+1].up&&ycur!=ysize-2){
                                                success=1;
                                                MAZE[xcur][ycur+1].up=0;
                                        }
                                        break;
                                case LEFT:
                                        if(MAZE[xcur][ycur].left&&xcur!=1){
                                                success=1;
                                                MAZE[xcur][ycur].left=0;
                                        }
                                        break;
                                case RIGHT:
                                        if(MAZE[xcur+1][ycur].left&&xcur!=xsize-2){
                                                success=1;
                                                MAZE[xcur+1][ycur].left=0;
                                        }
                                        break;
                                }
                        }while(!success);
                }
#endif
#ifdef backtrack
                while( MAZE[xcur][ycur-1].in&&MAZE[xcur][ycur+1].in&&
                           MAZE[xcur-1][ycur].in&&MAZE[xcur+1][ycur].in ){
                                   //If all the neighbourhood cells are in, backtrack.
                                int xcur2=MAZE[xcur][ycur].prevx;
                                ycur=MAZE[xcur][ycur].prevy;
                                xcur=xcur2;
                }
#endif
#ifdef prim
                do{
                        //randomly find a cell that's in the maze
                        xcur=rand()%(xsize-2)+1;
                        ycur=rand()%(ysize-2)+1;
                }while(!MAZE[xcur][ycur].in ||
                        MAZE[xcur][ycur-1].in&&MAZE[xcur][ycur+1].in&&
                        MAZE[xcur-1][ycur].in&&MAZE[xcur+1][ycur].in);
#endif
                do{
                        //Randomly grow the maze if possible.
                        success=0;
                        whichway=rand()%4;
                        switch(whichway){
                        case UP:
                                if(!MAZE[xcur][ycur-1].in){
                                        success=1;
                                        MAZE[xcur][ycur].up=0;
                                        MAZE[xcur][ycur-1].prevx=xcur;
                                        MAZE[xcur][ycur-1].prevy=ycur;
                                        ycur--;
                                }
                                break;
                        case DOWN:
                                if(!MAZE[xcur][ycur+1].in){
                                        success=1;
                                        MAZE[xcur][ycur+1].up=0;
                                        MAZE[xcur][ycur+1].prevx=xcur;
                                        MAZE[xcur][ycur+1].prevy=ycur;
                                        ycur++;
                                }
                                break;
                        case LEFT:
                                if(!MAZE[xcur-1][ycur].in){
                                        success=1;
                                        MAZE[xcur][ycur].left=0;
                                        MAZE[xcur-1][ycur].prevx=xcur;
                                        MAZE[xcur-1][ycur].prevy=ycur;
                                        xcur--;
                                }
                                break;
                        case RIGHT:
                                if(!MAZE[xcur+1][ycur].in){
                                        success=1;
                                        MAZE[xcur+1][ycur].left=0;
                                        MAZE[xcur+1][ycur].prevx=xcur;
                                        MAZE[xcur+1][ycur].prevy=ycur;
                                        xcur++;
                                }
                                break;
                        }
                }while(!success);
                MAZE[xcur][ycur].in=1;
                numin++; //Every iteration of this loop, one maze cell is added to the maze.
        }while(numin<(xsize-2)*(ysize-2));
#ifdef movie
        savebmp(xcur,ycur);
#endif
        return;
}

void savebmp(int xspecial, int yspecial){
        //save a bitmap file! the xspecial, yspecial pixel is coloured red.
        FILE * outfile;
        int extrabytes, paddedsize;
        int x, y, n;
        int width=(xsize-1)*2-1;
        int height=(ysize-1)*2-1;

        extrabytes = (4 - ((width * 3) % 4))%4; 

        char filename[200];

        sprintf(filename, "%s_%dx%d_n%d.bmp", OUTFILE, xsize, ysize, numin);
        paddedsize = ((width * 3) + extrabytes) * height;

        unsigned int headers[13] = {paddedsize + 54, 0, 54, 40, width, height, 0, 0, paddedsize, 0, 0, 0, 0};

        outfile = fopen(filename, "wb");
        fprintf(outfile, "BM");

        for (n = 0; n <= 5; n++){
           fprintf(outfile, "%c", headers[n] & 0x000000FF);
           fprintf(outfile, "%c", (headers[n] & 0x0000FF00) >> 8);
           fprintf(outfile, "%c", (headers[n] & 0x00FF0000) >> 16);
           fprintf(outfile, "%c", (headers[n] & (unsigned int) 0xFF000000) >> 24);
        }

        fprintf(outfile, "%c", 1);fprintf(outfile, "%c", 0);
        fprintf(outfile, "%c", 24);fprintf(outfile, "%c", 0);

        for (n = 7; n <= 12; n++){
           fprintf(outfile, "%c", headers[n] & 0x000000FF);
           fprintf(outfile, "%c", (headers[n] & 0x0000FF00) >> 8);
           fprintf(outfile, "%c", (headers[n] & 0x00FF0000) >> 16);
           fprintf(outfile, "%c", (headers[n] & (unsigned int) 0xFF000000) >> 24);
        }

        //Actual writing of data begins here:
        for(y = 0; y <= height - 1; y++){
                for(x = 0; x <= width - 1; x++){
                        if(x%2 == 1 && y%2 == 1){
                                if(x/2+1 == xspecial && y/2+1 == yspecial) RED;
                                else{
                                        if(MAZE[x/2+1][y/2+1].in) WHITE; else BLACK;
                                }
                        }else if(x%2 == 0 && y%2 == 0){
                                BLACK;
                        }else if(x%2 == 0 && y%2 == 1){
                                if(MAZE[x/2+1][y/2+1].left) BLACK; else WHITE;
                        }else if(x%2 == 1 && y%2 == 0){
                                if(MAZE[x/2+1][y/2+1].up) BLACK; else WHITE;
                        }
                }
                if (extrabytes){     // See above - BMP lines must be of lengths divisible by 4.
                        for (n = 1; n <= extrabytes; n++){
                                fprintf(outfile, "%c", 0);
                        }
                }
        }
        printf("file printed: %s\n", filename); 
        fclose(outfile);
        return;
}

最佳答案

在 C 中,bool 并不表示类型,除非您使用 C99 并包含 stdbool.h

struct cell {
//I have no idea why it wanted the ',' there
        ,bool in, up, left;

所以它不需要 ,,它试图告诉你它不知道 bool 是什么。

关于需要 C 标识符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9829680/

相关文章:

javascript - 按位运算 - 这到底是怎么回事?

c - C 结构末尾有两个零长度数组成员

c - 错误 : c:87:(. 文本+0x247):重定位被截断以适合:针对 undefined symbol `course_insert' 的 R_X86_64_PC32

c - sizeof argv[1] 不工作

java - 我怎么能停止在我的 ascii 迷宫中打印一面墙的两面?

java - 在 Java 中创建迷宫求解算法

c - 关于 `size_t`和它们测量的指针类型

c - 将多个(离散的)操作折叠成一个(连续的)操作

c - C中的随机迷宫生成器

c - 迷宫死端过滤器检查