【发布时间】:2021-08-26 13:01:00
【问题描述】:
我目前正在为大学课程使用 C 语言开发一款 Duck Hunt 风格的游戏,但我遇到了一个问题,即我无法在保持目标移动的同时移动玩家的目标,出于某种原因,我只能分别移动它们。这是代码的精简版本,如果有人可以提供帮助,我将非常高兴。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <windows.h>
#define Projetil 207
#define ESC 27
//formato da parabola (fazer ainda)
//substituir o sleep
int cx = 55;
int cy = 25;
void atirarpcima(){
int q;
q = cy+1;
while (q!=0){
gotoxy(cx+4, q);
printf("%c", Projetil);
Sleep(37);
gotoxy(cx+4, q);
printf(" ");
q--;
}
}
void pacman(){
gotoxy(cx, cy);
printf(" * *");
gotoxy(cx, cy+1);
printf("*** ***");
gotoxy(cx, cy+2);
printf("**** ****");
gotoxy(cx, cy+3);
printf(" *******");
}
void fantasmasaida(){
srand(time(NULL));
int y = (rand() % 9)+1;
int x = (rand() % 7)+14;
while(x<100){
gotoxy(x, y);
printf(" ****** ");
gotoxy(x, y+1);
printf("** ** **");
gotoxy(x, y+2);
printf("********");
gotoxy(x, y+3);
printf("** ** **");
gotoxy(x, y);
printf(" ");
gotoxy(x, y+1);
printf(" ");
gotoxy(x, y+2);
printf(" ");
gotoxy(x, y+3);
printf(" ");
x++;
}
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
int main(){
system("mode con: lines=30 cols=120");
char tecla;
pacman();
while (1){
while(!kbhit()){
fantasmasaida();
}
tecla = getch();
if (tecla == 'q'){
atirarpcima();
}
if (tecla == ESC){
break;
}
}
return 0;
}
【问题讨论】:
-
这是哪个编译器?通常,您会使用多线程将用户输入与两个不同线程中的图形分开。 kbhit() 是旧的单线程 MS DOS 东西。而且用 Sleep() 来停止程序也不是一个好主意。
-
kbhit也是deprecated,并替换为_kbhit。 -
我正在运行它,它是用 GNU GCC 编译的,文本在屏幕上飞得很快。阻塞函数将阻止同时功能,即使用输入应该在它自己的执行管道中,而用户界面更新(控制台写入)在另一个。
-
这个大学班是几级?
-
@Lundin,
gotoxy()也是老式的 MS-DOS 风格。并且包括<conio.h>也...白色和瓶中...(我敢打赌它是Turbo-C 或其他一些Borland 的) 但是在某些时候devcpp 编译器模仿了这个接口。