c语言贪吃蛇键盘控制程序,C语言控制台(贪吃蛇)

用最笨的方法写的贪吃蛇,大神勿喷!小白刚看完老潭的书写的,也是第一次写这么长的代码,写的太烂了!。。。。。。此代码用winTC直接编译运行即可!!!!

#include

#include/*随机产生数(rand())和结束(exit(0))函数*/

#include/*控制刷新时间函数,clock_t,clock()*/

#include/*监控键盘,bioskey(1)*/

#include/*定位坐标gotoxy(),清屏clrscr()*/

#define X_MAX 79

#define X_S 60

#define Y_S 25

#define GO(a,b) gotoxy(a,b),printf("*")

#define B_J(a,b) (a==b?a_j(keyy):a_j(key))

#define O_K(a) for(i=X_S+1;i

#define D_W gotoxy(x,y),printf("$")

double t;

clock_t end;

#define GO_T end=clock()+t*1.1;while(clock()

const int shang=0x4800,xia=0x5000,zuo=0x4b00,/*功能按键码*/

you=0x4d00,jia=0xd3d,zan_t=0x3920,cai_d=0x3f00,

du_q=0x3c00,bao_c=0x3b00,tui_c=0x11b,jian=0xc2d;

void w_k();/*外层框架*/

void k_s();/*游戏开始菜单*/

void d_m();/*读秒函数*/

void j_s();/*游戏结束框架*/

void a_j(int);/*判断按键取运行方向*/

void s_j();/*随机产生坐标*/

void ou();/*保存数据*/

void of(); /*读取数据*/

void Y_S_J();/*初始化数据函数*/

short n,x,y;

int keyy;

struct P{short x;short y;}p[300];

/*主函数功能调用*/

int main(){

int key=1,i;

w_k();

k_s();

clrscr();

w_k();

d_m();

for(i=0;i

while(1){

if(bioskey(1)){

key=bioskey(0);

if(key==shang)B_J(keyy,xia);

else if(key==xia)B_J(keyy,shang);

else if(key==zuo)B_J(keyy,you);

else if(key==you)B_J(keyy,zuo);

else if(key==zan_t){

i=1;

while(i!=key){

clrscr();w_k();

gotoxy(15,10);

printf("\\a\\\\----@@@@ * STOP * @@@@----/\\a");

bioskey(1);

i=bioskey(0);}

}

else if(key==jia){if(t>1)t/=1.1;}

else if(key==jian){if(t<15)t*=1.1;}

else if(key==bao_c)ou();

else if(key==cai_d)clrscr(),w_k(),k_s();

else if(key==tui_c)exit(0);

else s_j(),a_j(keyy);

}

else a_j(keyy);

}

return 0;

}

/*制框函数*/

void w_k(){

int i,j;

for(j=1;j<=Y_S;j+=Y_S-1)

for(i=1;i<=X_MAX;GO(i,j),i++);

for(i=1;i<=Y_S;i++)

GO(1,i),GO(X_S,i),GO(X_MAX,i);

O_K(6);O_K(10);O_K(20);

gotoxy(X_S+1,3),printf(" S-E-I-Z-O-F");

gotoxy(X_S+1,5),printf("|-_-!- %-d -!-_-|",n);

gotoxy(X_S+1,7),printf(" # Xiao Yi #");

gotoxy(X_S+1,9),printf(" ^_^ ^_^");

gotoxy(X_S+1,12),printf(" --M-E-N-U--");

gotoxy(X_S+1,13),printf("------- -------");

gotoxy(X_S+1,14),printf(" # Blank: stop");

gotoxy(X_S+1,15),printf(" # Acceleration:+");

gotoxy(X_S+1,16),printf(" # Slowdown: -");

gotoxy(X_S+1,17),printf(" # Conserve: F1");

gotoxy(X_S+1,18),printf(" # Main Menu: F5");

gotoxy(X_S+1,19),printf(" # Quit: Esc");

gotoxy(X_S+1,22),printf(" ^_^ E_Fabricator");

}

/*开始菜单*/

void k_s(){

int i,key,j=21;

while(1){

for(i=0;i<6;i++){

GO(10,11+i);GO(17,11+i);GO(23,9+i);

GO(27,9+i);GO(40,8+i);GO(46,8+i);

GO(11+i,11);GO(31+i,6);GO(30+i,19);

GO(14+i,5+i);GO(13-i,5+i);GO(48,13+i);

GO(40+i,8);GO(40+i,13);GO(40+i,19);

GO(48+i,5);GO(48+i,19);

}

GO(13,9);GO(50,4);GO(13,4);

for(i=0;i<3;i++){

GO(14-i,12+i);GO(12,14+i);GO(11-i,17+i);

GO(14+i,14+i);GO(16+i,17+i);GO(24+i,9);

GO(24+i,14);GO(30,4+i);GO(30-i,6+i);

GO(29,16+i);GO(45+i,17+i);GO(53,17+i);

GO(53-i,12+i);GO(53,5+i);GO(47,5+i);

}

for(i=0;i<2;i++){

GO(50,8+i);GO(36,18+i);GO(50,15+i);

}

for(i=0;i<15;GO(43,4+i),i++);

for(i=0;i<8;GO(29+i,9),GO(36-i,9+i),i++);

for(i=0;i<4;GO(49,10+i),i++);

for(i=2;i<59;gotoxy(i++,20),printf("=="));

gotoxy(30,21);printf("# \\aStart");

gotoxy(30,22);printf("# Read");

gotoxy(30,23);printf("# Quit");

gotoxy(25,j);printf("-->");

gotoxy(1,1);

while(!bioskey(1));

key=bioskey(0);

if(key==shang)

{ j--;

if(j<21)j=23;

}

else if(key==xia){

j++;

if(j>23)j=21;}

else if(key==0x1c0d){/*如果巧回车,判断在哪个选项中执行*/

switch(j){

case 21:Y_S_J();return;

case 22:of();return;

case 23:exit(0);

}

}

clrscr();

w_k();

}

}

/*GAME OVER*/

void j_s(){

int i,key,j=20;

while(1){

for(i=0;i<13;i++){

GO(16,4+i);GO(21,4+i);

GO(23,4+i);GO(44,4+i);GO(52,4+i);

}

for(i=0;i<11;i++){

GO(3,5+i);GO(37,4+i);GO(42,4+i);

GO(10,6+i);GO(14,6+i);GO(18,16-i);GO(19,16-i);

}

for(i=0;i<5;i++){

GO(4+i,16);GO(8,15-i);GO(10+i,11);

GO(24+i,4);GO(24+i,9);GO(24+i,16);

GO(45+i,4);GO(45+i,9);GO(45+i,16);

GO(57-i,8+i);GO(53+i,12+i);

}

for(i=0;i<3;i++){

GO(4+i,4);GO(6+i,4+i);GO(6+i,11);

GO(17+i,4+i);GO(20-i,4+i);GO(12-i,4+i);

GO(12+i,4+i);GO(33-i,4+i);GO(33+i,4+i);

GO(33-i,16-i);GO(33+i,16-i);GO(37+i,14+i);

GO(42-i,14+i);GO(53+i,4);GO(55+i,4+i);

GO(57,6+i);

}

for(i=0;i<7;i++)

GO(31,7+i),GO(35,7+i);

/*以上是‘GAME OVER’坐标*/

for(i=2;i<60;i++)gotoxy(i,18),printf("=");

gotoxy(25,20);printf("\\a# Restart");

gotoxy(25,21);printf("# Read");

gotoxy(25,22);printf("# Quit");

gotoxy(21,j);printf("-->");

gotoxy(1,1);

while(!bioskey(1));

key=bioskey(0);

if(key==shang){

j--;

if(j<20)j=22;

}

else if(key==xia){

j++;

if(j>22)j=20;

}

else if(key==0x1c0d)

switch(j){

case 20:Y_S_J();return;

case 21:of();return;

case 22:exit(0);

}

clrscr();

w_k();

}

}

/*判定:反键,撞墙,吃到点增长。*/

void a_j(int key1){

int i;clrscr();w_k();D_W;

if(key1==shang){

if(p[0].y-1==y&&p[0].x==x)n++,x=0;

i=n;

while(--i!=0)

p[i]=p[i-1];

p[0].y--;

}

else if(key1==xia){if(p[0].y+1==y&&p[0].x==x)n++,x=0;

i=n;

while(--i!=0)

p[i]=p[i-1];

p[0].y++;

}

else if(key1==zuo){if(p[0].y==y&&p[0].x-1==x)n++,x=0;

i=n;

while(--i!=0)

p[i]=p[i-1];

p[0].x--;

}

else {if(p[0].y==y&&p[0].x+1==x)n++,x=0;

i=n;

while(--i!=0)

p[i]=p[i-1];

p[0].x++;

}

keyy=key1;

for(i=0;i

if(p[0].y>=Y_S||p[0].x>=X_S||p[0].y<=1||p[0].x<=1)

clrscr(),w_k(),j_s(0);

for(i=1;i

if(p[0].x==p[i].x&&p[0].y==p[i].y)

clrscr(),w_k(),j_s(0);

GO_T;

w_k();

s_j();

}

/*(随机产生坐标)*/

void s_j(){

int i=0;

if(x==0||y==0){

while(1){

srand(time(NULL));

x=rand()%60;

y=rand()%25;

if(x>1&&y>1){

for(i=0;i

if(p[i].x==x&&p[i].y==y)

break;

}

if(i==n)break;

}

}

D_W;

}

/*保存函数*/

void ou(){

int i;

FILE*pf;

pf=fopen("D:\\\\T_C_S_data.txt","wb");

fwrite(&n,sizeof(short),1,pf);

fwrite(&t,sizeof(double),1,pf);

fwrite(&keyy,sizeof(int),1,pf);

for(i=0;i

fwrite(&p[i],sizeof(struct P),1,pf);

fclose(pf);

}

/*读取函数*/

void of(){

int i;

FILE*pf;

pf=fopen("D:\\\\T_C_S_data.txt","rb");

fread(&n,sizeof(short),1,pf);

fread(&t,sizeof(double),1,pf);

fread(&keyy,sizeof(int),1,pf);

for(i=0;i

fread(&p[i],sizeof(struct P),1,pf);

fclose(pf);

if(!n)

Y_S_J();

}

/*初始化数据*/

void Y_S_J(){

int i,j=8;

n=5,

x=0,

y=0,

t=10.0;

keyy=0x4d00;

for(i=0;i<5;i++,j--)

p[i].x=j,p[i].y=3;

}

/*读秒*/

void d_m(){

int i=5;

clock_t end1;

while(i>2){

end1=clock()+3*10;

while(end1>clock()){

gotoxy(23-i,8-i);printf("|");

gotoxy(23-i,9-i);printf("|");

gotoxy(23-i,18-i);printf("|");

gotoxy(23-i,17-i);printf("|");

gotoxy(17-i,13-i);

printf("\\a-- %d -- ",i-2);

}

clrscr();w_k();

i--;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言实现单片机的键盘程序 #include "SST89x5x4.H" #include #define uchar unsigned char #define uint unsigned int #define _Nop() _nop_() unsigned char code Key_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff, 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void Key_Init(void); unsigned char GetScanKey(void); unsigned char GetKey(void); void LCD_Init(void); void LCD_Init2(void); //void WriteW(uint a); void CheckBF(void); unsigned char Key_ASC2(unsigned char); void WritD(unsigned char); void Delay_ns(int i); void Delay_ms(int ms); unsigned char key; unsigned char key_asc2; unsigned char bKeyUp_Flag; uchar xdata *ptr; //函数功能描述:键盘初始化,将标志位置1; void Key_Init(void) { bKeyUp_Flag=1;//标志(全局变量)位置1 } //函数功能描述:键盘扫描函数,得到键的行列位置; unsigned char GetScanKey(void) { unsigned char key, i, temp; unsigned char xdata * ptr; key=0xff; for (i=1; i<0x10; i<<=1) //i的低4位为行数位,行依次检测 循环4次 { ptr=0x8fff; //数码管位选地址 * ptr =i; temp = * ptr; //取键盘IO口的值 temp &= 0x0f; //屏蔽高四位 if (temp!=0x00) //是否有有效键值 { key = i<<4; //取行数位的值并将其放入返回值高4位 key|=temp; //列数位的值放入返回值低4位 break; } } return key; //返回行位(高四)和列位(低四) } /*函数功能描述:取键值,长按无效; unsigned char code Key_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff, 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 说明:计算因子,定义在函数外部。此数组在计算键值的中间过程起作用。比如右下方键按下(行列值为0x88),通过查找数组得到行对应的中间值0x03,列对应的中间值0x03。 */ unsigned char GetKey(void) { unsigned char key, temp; if (!bKeyUp_Flag) //判断标志,是0执行 /*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值,直至按键无效返回无效按键值,置"1"标志位。按键输入恢复有效。屏蔽这部分则长按键有效*/ { key=GetScanKey(); if (key==0xff) //没有按键,置标志位 bKeyUp_Flag=1; else //保持按键 return 0xff; //因为0xff大于15,故为无效键值,实现长按键无效 } key=GetScanKey(); if (key==0xff) //没有按键 return key; else //有按键有效 temp=key; //取键值 Delay_ms(20); //延时20ms 消抖 key=GetScanKey(); //键盘扫描 if(key!=temp) //判断两次键值是否相同,排除干扰信号影响 确认有效信号 { key=0xff; return key; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值