#include
#include
#include
#include
sbit keystar = P3^0;
sbit keyup = P3^1;
sbit keylift = P3^5;
sbit keydown = P3^6;
sbit keyright = P3^7;
int n;
int dir = 1; // lift->1 up->2 right->3 down->4
int timer1count = 0;
int state_point = 1;
int time = 50000;
char green_point_row = 0x01;
char green_point_list = 0xfe;
char row[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char redlist[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
char greenlist[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int temp_point_row[8] = {1,2,4,8,16,32,64,128};
int temp_point_list[8] = {254, 253, 251, 247, 239, 223, 191, 127};
idata char snakerow[64] = {0x08,0x08,0x08};
idata char snakelist[64] = {0xfe,0xfd,0xfb};
void delay_ms (int time) // Every time 1 millisecond
{
int i, k;
for (i = 0; i < time; i++)
{
for (k = 0; k < 901; k++);
}
}
void init () // Initialize timer // Every time 50 milliseconds
{
TMOD = 0x01; // Open the two timers
EA = 1;
ET0 = 1;
TH0 = (65536 - time) / 256;
TL0 = (65536 - time) % 256;
keyup = 1;
}
void keyscan (void)
{
if (0 == keylift)
{
delay_ms(3);
if (0 == keylift)
{
dir = 1;
}
return;
}
if (0 == keyup)
{
delay_ms(3);
if (0 == keyup)
{
dir = 2;
}
return;
}
if (0 == keydown)
{
delay_ms(3);
if (0 == keydown)
{
dir = 4;
}
return;
}
if (0 == keyright)
{
delay_ms(3);
if (0 == keyright)
{
dir = 3;
}
return;
}
}
void arr_con (int i) // An array of conversion
{
int num;
switch(dir)
{
case 1: //lift
{
if (snakelist[strlen(snakerow) - 1] == 0x7f)
{
while(1)
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
}
}
snakerow[i] = snakerow[i - 1];
snakerow[i + 1] = '\0';
for (num = 0; num < 8; num++)
{
if (snakelist[i - 1] == redlist[num])
{
break;
}
}
snakelist[i] = redlist[num - 1];
snakelist[i + 1] = '\0';
for (i = 0; i < strlen(snakerow); i++)
{
snakerow[i] = snakerow[i + 1];
snakelist[i] = snakelist[i + 1];
}
}; break;
case 2: //up
{
if (snakerow[strlen(snakerow) - 1] == 0x01)
{
while(1)
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
}
}
snakelist[i] = snakelist[i - 1];
snakelist[i + 1] = '\0';
for (num = 0; num < 8; num++)
{
if (snakerow[i - 1] == row[num])
{
break;
}
}
snakerow[i] = row[num - 1];
snakerow[i + 1] = '\0';
for (i = 0; i < strlen(snakerow); i++)
{
snakerow[i] = snakerow[i + 1];
snakelist[i] = snakelist[i + 1];
}
};break;
case 3: // rignt
{
if (snakelist[strlen(snakelist) - 1] == 0xfe)
{
while(1)
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
}
}
snakerow[i] = snakerow[i - 1];
snakerow[i + 1] = '\0';
for (num = 0; num < 8; num++)
{
if (snakelist[i - 1] == redlist[num])
{
break;
}
}
snakelist[i] = redlist[num + 1];
snakelist[i + 1] = '\0';
for (i = 0; i < strlen(snakerow); i++)
{
snakerow[i] = snakerow[i + 1];
snakelist[i] = snakelist[i + 1];
}
}; break;
case 4: //down
{
if (snakerow[strlen(snakerow) - 1] == 0x80)
{
while(1)
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
}
}
snakelist[i] = snakelist[i - 1];
snakelist[i + 1] = '\0';
for (num = 0; num < 8; num++)
{
if (snakerow[i - 1] == row[num])
{
break;
}
}
snakerow[i] = row[num + 1];
snakerow[i + 1] = '\0';
for (i = 0; i < strlen(snakerow); i++)
{
snakerow[i] = snakerow[i + 1];
snakelist[i] = snakelist[i + 1];
}
};break;
}
}
void longer (void)
{
int length;
length = strlen(snakerow);
snakerow[length] = snakerow[length - 1];
snakerow[length + 1] = '\0';
snakelist[length] = snakelist[length - 1];
snakelist[length + 1] = '\0';
}
void main (void)
{
int i;
int length_point;
int temp;
init();
while(1)
{
if (0 == keystar) // If press keystar,go on.
{
delay_ms(2);
if (0 == keystar) // The key to eliminate jitter
{
P0 = 0x01;
TR0 = 1;
while (1)
{
for (i = 0; i < strlen(snakerow); i++) // The original image
{
P1 = 0xff;
P2 = 0xff;
P0 = snakerow[i];
P2 = snakelist[i];
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P2 = 0xff;
P0 = green_point_row;
P1 = green_point_list;
}
for (i = 0; i < 8; i++)
{
if (green_point_list == greenlist[i])
{
break;
}
}
length_point = strlen(snakerow);
if ((snakerow[length_point - 1] == green_point_row)&&(snakelist[length_point - 1] == redlist[i]))
{
time = time + 1000;
if (state_point)
{
do
{
green_point_row = temp_point_row[rand() % 8]; // 1 2 4 8 16 32 64 128
green_point_list = temp_point_list[rand() % 8]; // 254 253 251 247 239 223 191 127
for (temp = 0; temp < strlen(snakerow); temp++) //To test whether red dot green dot overlap
{
if ((green_point_row == snakerow[temp])&&(green_point_list == snakelist[temp]))
{
break;
}
}
}while(temp < strlen(snakerow));
longer();
state_point = 0;
}
}
for (temp = 0; temp < (strlen(snakerow) - 3); temp++)
{
if ((snakerow[strlen(snakerow) - 1] == snakerow[temp])&&(snakelist[strlen(snakerow) - 1] == snakelist[temp]))
{
while(1)
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
}
}
}
keyscan();
}
}
}
}
}
void timer0 (void) interrupt 1
{
int i;
TH0 = (65536 - time) / 256;
TL0 = (65536 - time) % 256;
n++;
if (n >= 20)
{
i = strlen(snakerow);
arr_con(i);
state_point = 1;
n = 0;
}
}