孔老了 2017-05-07 10:40 采纳率: 0%
浏览 746

游戏运行不稳定,逻辑应该是正确的,不知道是哪儿的问题。求详细解答

希望每次按空格让@上升两个坐标并减慢下落速度,问题是如果按空格频率不够慢或者一打开游戏就按空格就出现只上升不再下落。不知道是哪儿的问题
/*
简易版flappy bird
按空格让@上升两个坐标并减慢下落速度
*/
#include stdio.h
#include conio.h
#include Windows.h
#include ctime
int hight, width;//游戏的长和宽
int bird_x, bird_y;//@的坐标
int barl_1x, barl_1yTop, barl_1yDown;//管道1的关键坐标
int barl_2x, barl_2yTop, barl_2yDown;//管道2的关键坐标
int n1 = 15, m1 = 5;//管道的Top坐标随机的参数
int n2 = 10, m2 = 25;//管道的Down坐标随机的参数
int bird_drop = 0;//改变@下落速度的参数

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() {//游戏初始化函数
hight = 40;
width = 100;
bird_x = 10;
bird_y = hight / 3;
barl_1x = 20;
barl_2x = 40;
barl_1yTop = rand() % n1 + m1;
barl_1yDown = rand() % n2 + m2;
barl_2yTop = rand() % n1 + m1;
barl_2yDown = rand() % n2 + m2;
}
void change1() {//管道1的坐标参数改变函数
srand((unsigned)time(0));
barl_1x = rand() % 15+20+barl_2x;
barl_1yTop = rand() % n1 + m1;
barl_1yDown = rand() % n2 + m2;
}
void change2() {//管道2的坐标参数改变函数
srand((unsigned)time(0));
barl_2x = rand() % 15 + 20 + barl_1x;
barl_2yTop = rand() % n1 + m1;
barl_2yDown = rand() % n2 + m2;
}
void show() {//利用双重循环展示游戏画面
gotoxy(0, 0);
int h, l;
for (h = 0; h < hight; h++) {
for (l = 0; l < width; l++) {
if ((h == bird_y) && (l == bird_x)) {
printf("@");
}
else if ((l == barl_1x) && ((h > barl_1yDown) || (h < barl_1yTop))|| (l == barl_2x) && ((h > barl_2yDown) || (h < barl_2yTop))) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
printf("\n");
}
void updateWithoutInput() {//当没有键盘输入时对游戏各元素的参数改变
static int wait_bird = 0;//让@在游戏中运行时等待指定循环次数
static int wait_barl = 0;//让管道在游戏中运行时等待指定循环次数

wait_barl++;
wait_bird++;
bird_drop++;//没按空格会在游戏运行中让该值不断变大,在switch中起到速度加快的作用

switch (bird_drop)//根据bird_drop的值改变@的下落速度,bird_drop在按了空格后会初始化
{
case 1: if (wait_bird == 5) {
            bird_y++;
            wait_bird = 0;
        }   
    break;
case 2: if (wait_bird == 4) {
            bird_y++;
            wait_bird = 0;
        }
    break;
case 3: if (wait_bird == 3) {
            bird_y++;
            wait_bird = 0;
        }
    break;
default:if (wait_bird == 2) {
            bird_y++;
            wait_bird = 0;
        }
    break;
}

if (wait_barl == 5) {//利用if调整管道的移动速度
    barl_1x--;
    barl_2x--;
    wait_barl = 0;
}
if (barl_1x < 0) {//当管道1移除界面时为管道赋新坐标值
    change1();
}
if (barl_2x < 0) {//当管道2移除界面时为管道赋新坐标值
    change2();
}

}

void updateWithInput() {//当有键盘输入是的各元素坐标参数的变化
char input;
if (kbhit()) {//判断是否有键盘输入,有则进入,无则跳过
input = getch();
if (input == ' ') {
bird_y -= 2;
bird_drop = 0;
}
}
if (bird_y < 0) {//防止@移到屏幕外
bird_y = 0;
}
if (bird_y > hight) {//防止@移到屏幕外
bird_y = hight-1;
}
}
int main() {
startup();//游戏数据初始化
while (1) {
show();//清屏并画新图,达到动画效果
updateWithoutInput();//当没有键盘输入时各元素坐标参数的变化
updateWithInput();//当有键盘输入时各元素坐标参数的变化
}
return 0;
}

  • 写回答

1条回答 默认 最新

  • 孔老了 2017-05-07 11:00
    关注

    不知道为什么加上<>就看不到,所以把这个删了

    评论

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常