?? pao.c
字號:
//#define cpuw77e58 //定義使用的MCU
//#define xtal221184 //定義使用的晶振
#include <serial.c> //包含串行處理模塊
bit showclocksign;
bit showblocksign;
bit showfensign;
uchar count;
uint second;
uchar paoplace;
uint zongfen;
uchar speed=32;
idata uint free[16]; //定義行首處理空間
unsigned char idata *freep; //定義指向該數(shù)組的指針
//****
gotoxy(uchar x,y)
{putbyte(0x1b);putbyte('['
);
putbyte((y%100)/10+0x30);
putbyte((y%10)+0x30);
putbyte(';');
putbyte((x%100)/10+0x30);
putbyte((x%10)+0x30);
putbyte('H');
}
//******************
clrscr()
{gotoxy(0,0); putbyte(0x1b); putstring("[J"); }
//**************
showpao()
{gotoxy(1,16); putbyte(0x1b); putstring("[K");
gotoxy(paoplace,16); putbyte('|');
gotoxy(1,17); putbyte(0x1b); putstring("[K");
gotoxy(paoplace-1,17);
putbyte('/');putbyte('H');putbyte('\\');
gotoxy(0,24);
}
//***************
uint bdata showp;
sbit outblock=showp^15;
showblock() //showblock
{uchar i,j;uint bdata p;
uint st;
gotoxy(0,0);
for(i=15;i!=0;i--)
{putbyte('|');
showp=free[i];
st=0x8000;
for(j=0;j!=16;j++)
{ if ((showp&st)!=0) putbyte('@');
else putbyte(' ');
st>>=1;
//showp=showp>>1;
}
putbyte('|');CR;
}
gotoxy(0,24);
showblocksign=0;
}
//*************
showfen()
{gotoxy(6,19);
//putstring("得分: ");
putint(zongfen,1);
showfensign=0;
//putbyte(' ');
//puthex(free[15]/256); puthex(free[15]%256);
//gotoxy(0,24);
}
//******************************************************
void main(void)
{uchar idata c,i,j;bit k;
uint temp,notype;
serial_init(); // ET0=0;
putstring("\r\nSerial ready!\r\n");
start: ET0=1;clrscr();
putstring(" 飛機打東東游戲"
"\r\n 本游戲是為方便51學習者而制作的,任何人可以研究或"
"\r\n 改動本游戲程序用于任何用途,如能和我打個招呼是最好。"
"\r\n 游戲運行在單片機里,一塊51即可,無需任何外擴的"
"\r\n RAM,只要51的串口和計算機連起來就可以玩了。計算機上"
"\r\n 運行的程序是終端仿真程序,用來接收單片機發(fā)出的字符"
"\r\n 串并顯示出由字符組成的畫面和發(fā)出控制字符。有任何問"
"\r\n 題請訪問51單片機世界'MCU51.126.COM'發(fā)郵件給版主。"
"\r\n 游戲控制方法:"
"\r\n 操作者不動鍵盤10秒鐘進入演示狀態(tài),按'a'或'4'飛機"
"\r\n 左移,按'd'或'6'右移,按's'或'0'發(fā)彈,按'-'降低難度,"
"\r\n 按'+'提高難度,按'p'立即進入演示狀態(tài)。"
"\r\n 按任何鍵開始游戲。");
while(!inbufsign);
zongfen=0;showblock();showfen();notype=1000;
gotoxy(0,19);//putstring("lever: h-hard e-easy\r\n5-left 6-right 0-shot");
putstring("得分:\r\n級別: +:高 -:低\r\n5:左移 6:右移 0:發(fā)射");
gotoxy(7,20);putchar(speed,1);
for(i=0;i!=16;i++)
{free[i]=0;
}
paoplace=9;showpao();
while(1) { if (showblocksign) showblock();
if (showfensign) showfen();
if (free[0]!=0)
{ET0=0;notype=1000;free[0]=0;gotoxy(0,22);putstring("游戲結(jié)束!再玩一遍?(y/n)");
while(getbyte()!='y');goto start;//
}
notype--;if(notype==10){notype=1000;goto autoplay;}
delay(100);
if (notype>900) {gotoxy(0,22);putbyte(0x1b); putstring("[K");}
if (inbufsign)
{ c=getbyte();notype=1000;
switch (c)
{case '5': //left move
case 'a':
paoplace--; if (paoplace==1) paoplace=2;
showpao();
break;
case '6': //right move
case 'd':
paoplace++; if (paoplace==18) paoplace=17;
showpao();
break;
case '=':
case '+': speed--;if (speed==0)speed=1;gotoxy(7,20);putchar(speed,1);
break;
case '_':
case '-': speed++;if (speed==255)speed=254;gotoxy(7,20);putchar(speed,1);
break;
case 's':
case '0': //shot
for(i=15,j=1;i!=0;i--,j=16-i)
{gotoxy(paoplace,i); putbyte('o');delay(50);
putbyte(8);putbyte(' ');
//free[i]=0xffff;
temp=0x0001<<(17-paoplace);
if( (free[j]&temp)!=0){ free[j] &= (temp^0xffff);zongfen+=10;showfensign=1;break;}
}
break;
case 'y': goto start;
case 'p':
autoplay: gotoxy(0,22);putbyte(0x1b); putstring("[K");putstring("游戲自動演示中。");
ET0=1;speed=20;gotoxy(7,20);putchar(speed,1);
do
{ if (showblocksign) showblock();
if (showfensign) showfen();
for(i=15,j=1;i!=0;i--,j=16-i)
{gotoxy(paoplace,i); putbyte('o');delay(50);
putbyte(8);putbyte(' ');
temp=0x0001<<(17-paoplace);
if( (free[j]&temp)!=0){ free[j] &= (temp^0xffff);zongfen+=10;showfensign=1;goto again;}
}
again:
if (!(((free[5]&temp)!=0)||((free[4]&temp)!=0))) //
{if (k) {paoplace--;}
else {paoplace++;}
}
if (paoplace==1){ paoplace=2; k=0;}
if (paoplace==18) {paoplace=17;k=1;}
if (free[0]!=0) //if dead?
{ET0=0;notype=1000;free[0]=0;
//while(getbyte()!='y');goto start;
break;
}
showpao();
}while(!inbufsign);
}
}
}
}
// freep=free;
/// putbytes(freep,1);
// getline(freep,1);
//
uint code *getcode;
//******************
void timer0(void) interrupt 1
{uchar i;
TH0=31;TL0=00;
//1/32S
count++;
if (count==speed) //11059200
{count=0; //1s
for(i=0;i<16;i++)
{free[i]=free[i+1];
}
free[15]=*getcode;
getcode++;if (getcode==1000) getcode=0;
showblocksign=1;
showclocksign=1;
second++; //1S
if (second==3600) {second=0;showclocksign=1;}
// if (iftimeover) timeovercount++;
// else timeovercount=0;
//
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -