• C语言小游戏---命令行飞船大战


    执行源文件的时候有点问题,建工程然后执行就没问题,不知为啥,难道是编译器问题?

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<windows.h>
    
    #define High 15        //windows dimention
    #define Width 25
    #define EnemyNum 5  //enemy flight num
    
    int canves[High][Width]= {0}; //windows canves ,0 white, 1 flight, 2 bullet,3 enemy_flight
    int position_x, position_y;  //flight position
    int enemy_x[EnemyNum], enemy_y[EnemyNum];         //enemy position
    
    int score;                    //score
    int BulletWidth;            //bullet width
    int EnemyMoveSpeed;         //enemy move speed
    
    //void HideCursor() { // if cursor
    //    CONSOLE_CURSOR_INFO cursor_info= {1,0}; //second value is 0 mean hide cursor
    //    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
    //}
    
    void gotoxy(int x, int y) { // move mouse to x,y position, similer clear screen
        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD pos;
        pos.X = x;
        pos.Y = y;
        SetConsoleCursorPosition(handle, pos);
    }
    
    void startup() { // init data
        position_x = High-1;
        position_y = Width/2;
        canves[position_x][position_y] = 1;
        int k;
        for(k=0; k<EnemyNum; k++) {
            enemy_x[k] = rand() % 2;
            enemy_y[k] = rand() % Width;
            canves[enemy_x[k]][enemy_y[k]] = 3;
        }
        BulletWidth = 0;
        score = 0;
        EnemyMoveSpeed = 20;
    //    HideCursor();
    }
    
    void show() { // show windows
        gotoxy(0,0);  //move mouse to 0,0 origin point, and redraw screen
        int i, j;
        for(i=0; i<High; i++) {
            for(j=0; j<Width; j++) {
                if(canves[i][j] == 0)
                    printf(" ");  //show bird *
                else if(canves[i][j] == 1)
                    printf("*");
                else if(canves[i][j] == 2)
                    printf("|");
                else if(canves[i][j] == 3)
                    printf("@");  //show nothing
            }
            printf("
    ");
        }
        printf("score:%3d
    ",score);
    }
    
    void updateWithoutInput() {
        int i, j, k;
        for(i=0; i<High; i++) {
            for(j=0; j<Width; j++) {
                if(canves[i][j] == 2) {
                    //if fight enemy flight
                    for(k=0; k<EnemyNum; k++) {
                        //bullet hit enemy flight
                        if((i == enemy_x[k]) && (j == enemy_y[k])) {
                            score++;
                            if(score%5==0 && EnemyMoveSpeed>3)//score control enemy flight speed become more quickly
                                EnemyMoveSpeed--;
                            if(score%5==0)//score control bullet become more powerful
                                BulletWidth++;
                            canves[enemy_x[k]][enemy_y[k]] = 0;
                            enemy_x[k] = rand() % 2;
                            enemy_y[k] = rand() % Width;
                            canves[enemy_x[k]][enemy_y[k]] = 3;
    //                        canves[i][j] = 0;
                        }
                    }
                    // bullet move up
                    canves[i][j] = 0;
                    if(i>0)
                        canves[i-1][j] = 2;
                }
            }
        }
        static int speed = 0;
        if(speed<EnemyMoveSpeed)
            speed++;
    
        for(k=0; k<EnemyNum; k++) {
            if((position_x==enemy_x[k]) && (position_y==enemy_y[k])) { //died,enemy flight meet user flight
                printf("GAME OVER!");
                Sleep(3000);
                system("pause");
                exit(0);
            }
            if(enemy_x[k] > High) { //enemy over screen high size
                canves[enemy_x[k]][enemy_y[k]] = 0;
                enemy_x[k] = rand() % 2;
                enemy_y[k] = rand() % Width;
                canves[enemy_x[k]][enemy_y[k]] = 3;
                score--;
            }
            if(speed == EnemyMoveSpeed) {
                //enemy flight auto falling down
                for(k=0; k<EnemyNum; k++) {
                    canves[enemy_x[k]][enemy_y[k]] = 0;
                    enemy_x[k]++;
                    speed = 0;
                    canves[enemy_x[k]][enemy_y[k]] = 3;
                }
            }
        }
    }
    
    //    Sleep(50);
    
    
    void updateWithInput() {
        char input;
        if(kbhit()) { //runing while user push keyboard
            input = getch();
            if(input == 'a' && position_y>0) { //flight move left
                canves[position_x][position_y]=0;
                position_y--;
                canves[position_x][position_y]=1;
            }
            if(input == 'd' && position_y<Width) { //flight move right
                canves[position_x][position_y++]=0;
                canves[position_x][position_y]=1;
            }
            if(input == 'w') { //flight move up
                canves[position_x--][position_y]=0;
                canves[position_x][position_y]=1;
            }
            if(input == 's') { //flight move down
                canves[position_x++][position_y]=0;
                canves[position_x][position_y]=1;
            }
            if(input == ' ') { //flight move down
                int left, right;
                left = position_y - BulletWidth;
                if(left<0)
                    left = 0;
                right = position_y + BulletWidth;
                if(right>Width-1)
                    right = Width-1;
                int x;
                for(x=left; x<=right; x++)
                    canves[position_x-1][x]=2;
            }
        }
    }
    int main() {
        startup(); // init data
        while(1) { // game loop run
            show(); // show windows
            updateWithoutInput(); //update don't need user
            updateWithInput(); //update need user
        }
        return 0;
    }

     学习B站  https://www.bilibili.com/video/av34118200?p=18

  • 相关阅读:
    链表中倒数第K个结点
    关于栈的经典问题---判断一个栈的出栈序列是不是有效的
    剑指Offer-用两个栈实现队列
    Netty与NIO
    牛客-反转数字
    N叉树的最大深度-DFS
    version can neither be null, empty nor blank
    剑指 Offer 16. 数值的整数次方
    Vue基础语法与指令
    ES6常用语法
  • 原文地址:https://www.cnblogs.com/lely/p/12188118.html
Copyright © 2020-2023  润新知