Код:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <time.h>
unsigned char far *screen = MK_FP (0xA000,0);
void SetMode (int Mode)
{
union REGS regs;
regs.h.ah = 0;
regs.h.al = Mode;
int86 (0x10, ®s, ®s);
}
void ClearScreen (void)
{
unsigned i;
for (i=0; i<64000l; i++) screen [i]=0;
}
void drawBody (int x, int y, unsigned char *draw)
{
int x1,y1;
x += 2;
y += 3;
for (y1=0;y1<14;y1++)
for (x1=0;x1<17;x1++)
if (draw[y1*17+x1] !=0) screen[320*(y1+y)+x1+x] = draw[y1*17+x1];
}
void clearBody (int x, int y)
{
int x1,y1;
x += 2;
y += 3;
for (y1=0;y1<14;y1++)
for (x1=0;x1<17;x1++)
screen[320*(y1+y)+x1+x] = 0;
}
void drawObstacle (int x, int y, unsigned char *draw)
{
int x1,y1;
x += 4;
y += 5;
for (y1=0;y1<10;y1++)
for (x1=0;x1<12;x1++)
if (draw[y1*12+x1] !=0) screen[320*(y1+y)+x1+x] = draw[y1*12+x1];
}
void WaitSync(void)
{
while(inportb(0x3DA) &0x8);
while(!(inportb(0x3Da)&0x8));
}
void drawLine1 (int x)
{
int y;
for (y=0;y<=200;y++)
screen[320*y+x] = 8;
}
void drawLine2 (int y)
{
int x;
for (x=0;x<=320;x++)
screen[320*y+x] = 8;
}
unsigned char robot[17*14] = {
0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,
0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,
1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,
1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,
0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,
0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,
0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,
1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1
};
unsigned char obstacle[12*10] = {
8,8,8,8,8,8,8,8,8,8,8,8,
8,3,1,1,1,1,1,1,1,1,3,8,
8,1,3,1,1,1,1,1,1,3,1,8,
8,1,1,3,1,1,1,1,3,1,1,8,
8,1,1,1,3,3,3,3,1,1,1,8,
8,1,1,1,3,3,3,3,1,1,1,8,
8,1,1,3,1,1,1,1,3,1,1,8,
8,1,3,1,1,1,1,1,1,3,1,8,
8,3,1,1,1,1,1,1,1,1,3,8,
8,8,8,8,8,8,8,8,8,8,8,8
};
void goNow(int go, int *kx, int *ky ) {
int x = *kx;
int y = *ky;
if( go == 1) y--;
else if( go == 2) {y--; x++;}
else if( go == 3) {x++;}
else if( go == 4) {x++; y++;}
else if( go == 5) {y++;}
else if( go == 6) {y++; x--;}
else if( go == 7) {x--;}
else if( go == 8) {x--; y--;}
*kx = x;
*ky = y;
}
void main ()
{
int x, y, i = 1;
int up = 0;
int r_max = 0;
int kx = 0, ky = 0;
int r = 0;
int go = 0;
// все шаги
int xs[1000];
int xy[1000];
//препятствия
int ss[161];
int xx;
long j;
time_t t;
SetMode (0x13);
srand((unsigned) time(&t) );
r = rand() % 1000000;
//for(x=0; x <= 320; x += 20) drawLine1(x);
//for(y=0; y <= 200; y += 20) drawLine2(y);
for (xx=0; xx < 160; xx++) ss[i] = 0;
xs[0] = 0;
xy[0] = 0;
while (kx != 15 || ky != 9) {
srand(i * i * r * r);
if (ky == 0 && kx == 0) { up = 2; r_max = 3; }
else if (ky == 0 && kx == 15) { up = 4; r_max = 2; }
else if (ky == 9 && kx == 15) { up = 1; r_max = 2; }
else {
if (ky == 0) {up = 2; r_max = 4;}
else if (kx == 0) {up = 1; r_max = 4;}
else if (kx == 15) {up = 4; r_max = 2;}
else if (ky == 9) {up = 0; r_max = 3;}
else { up = 1; r_max = 5;}
}
go = (rand() % (r_max - 1) ) + up + 1;
goNow( go, &kx, &ky );
xs[i] = kx;
xy[i] = ky;
ss[ky*16+kx] = 1;
i++;
}
for (xx=0; xx < 160; xx++) {
if (ss[xx] == 0) {
srand(r * r * xx * xx);
go = rand() % 5;
if (go > 1) drawObstacle( (xx % 16) * 20, (xx / 16) * 20, obstacle);
}
}
for(xx = 0 ; xx < i; xx++) {
drawBody( xs[xx]*20, xy[xx]*20, robot);
for (j = 0; j < 200000000; j++) {}
clearBody(xs[xx]*20, xy[xx]*20);
}
SetMode(3);
}