我正在 Dos 中用 C 制作 Pong...我正在使用 DosBox 和 Turbo C++ 3.0,因为它有最好的仿真系统。
为了让球移动,我使用了简单的公式:
dx = speed*cos(direction*(M_PI/180))
,dy = speed*sin(direction*(M_PI/180))
,但是,每当我保存对代码的更改时,这些函数崩溃,给我奇怪的值......
我注意到,如果我将函数cos
(应该是double
)的结果转换为float
,它会给我正确的结果,任何其他方法都不起作用......
我会把我的代码留在下面...请注意其他函数来自我构建的一组库,它们实际上什么都不做 rn...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <time.h>
#include "libssg/ssg.c"
#include "pki.c"
#include "pfl.c"
//DEFINES
#define BSP 5
#define PSX 3
#define PSY 15
#define PADX1 75
#define X 320
#define Y 200
#define PADX2 X-PADX1
#define BSIZE 3
//headers for PFL.c
int random_dir();
double DegtoRad(int x);
void check_quit();
void main();
void paddle_player();
int player1(); //it uses INT16h
int player2(int prev); //it reads PORT60h
int move_paddle(int state, int y1, int PSP,int PSD);
int check_collision(int angle, int x, int y);
byte *paddle_gen(int size);
int check_collision(int angle, int x, int y){
int a1 = 0;
//up
if (y >= 0){
a1 = angle - 180;
return a1;
}
return angle;
}
void main(){
//joysticks...
double v;
byte frame[64000];
byte ball[BSIZE*BSIZE];
double angle = 0;
int PSP = 10;
int p2_key = 0;
int p1_key = 0;
int *paddle = 0;
int y1 = (Y/2)-(PSY/2);
int y2 = y1;
int by = (int)Y/2;
int bx = (int)X/2;
float dx = 0;
float dy = 0;
v = (M_PI/180);
/* +++ INIT +++ */ //code that executes once at game startup...
paddle = paddle_gen(PSX*PSY);
init_vga();
fill_buff(0x0,frame);
memset(ball, 15, BSIZE*BSIZE);
srand(time(0));
angle = 45;
/* +++ MAIN LOOP +++ */ //game logic and execution loop
while (1){
p1_key = player1();
p2_key = player2(p2_key);
//draw players...
// draw_sprite(PADX1,y1,PSX,PSY,paddle,frame);
// draw_sprite(PADX2,y2,PSX,PSY,paddle,frame);
draw_sprite(by,bx,BSIZE,BSIZE,ball,frame);
y1+= move_paddle(p1_key, y1, PSP, PSY);
y2+= move_paddle(p2_key, y2, PSP, PSY);
dx = (float) cos(45*v); //here is it... v is pi/180
dy = (float) sin(45*v);
bx += (int)BSP*dx;
by += (int)BSP*dy;
//angle = check_collision(angle, bx, by);
//exit... change key... I suggest 'Q'
check_quit();
//write and refresh
write_buff(frame);
fill_buff(0x0,frame);
}
}
有时它可以工作,但是,一旦我更改代码中的任何内容,它就会崩溃...