#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> int position_x, position_y; //飞机位置 int bullet_x, bullet_y; //子弹位置 int enemy_x, enemy_y; //敌机位置 int high, width; //游戏画面尺寸 int score; //得分 void gotoxy(int x, int y){ //类似于清屏函数,光标移动到原点位置进行重画 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle, pos); } void startup(){ //数据初始化 high = 20; width = 30; position_x = high / 2; position_y = high / 2; bullet_x = -2; bullet_y = position_y; enemy_x = 0; enemy_y = position_y; score = 0; } void show(){ //显示画面 gotoxy(0,0); // 光标移动到原点位置进行重画清屏 int i, j; for(i = 0; i < high; i++){ for(j = 0; j < width; j++){ if((i == position_x) && (j == position_y)) printf("*"); //输出飞机 else if((i == enemy_x) && (j == enemy_y)) printf("@"); //输出敌机 else if((i == bullet_x) && (j == bullet_y)) printf("|"); //输出子弹 else printf(" "); } printf("\n"); } printf("Score: %d", score); } void updateWithoutInput(){ if(bullet_x > -1) bullet_x--; if((bullet_x == enemy_x) && (bullet_y == enemy_y)){ //子弹击中敌机 score++; //分数加1 enemy_x = -1; //产生新的敌机 enemy_y = rand() % width; bullet_x = -2; //子弹无效 } if(enemy_x > high){ //敌机跑出屏幕 enemy_x = -1; //产生新的飞机 enemy_y = rand() % width; } // 用来控制敌机向下移动的速度。每隔几次循环,才移动一次敌机 // 这样修改的话,用户按键交互速度还是保持很快,但我们NPC的移动显示可以降速 static int speed = 0; if(speed < 10) speed++; if(speed == 10){ enemy_x++; speed = 0; } } void updateWithInput(){ char input; if(kbhit()){ input = getch(); if(input == 'a') position_y--; if(input == 'd') position_y++; if(input == 'w') position_x--; if(input == 's') position_x++; if(input == ' '){ bullet_x = position_x - 1; //子弹的初始位置在飞机正上方 bullet_y = position_y; } } } void main(){ startup(); //数据初始化 while(1){ show(); //显示画面 updateWithoutInput(); //与用户输入无关的更新 updateWithInput(); //与用户输入有关的更新 } }