⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于at89c52的乒乓球游戏系统
💻 C
📖 第 1 页 / 共 2 页
字号:
   Delay_x10ms(1000);
   return 1;
 }
/////////////////////////////////////
//P2口读数
/////////////////////////////////////
uchar Read_P2()
{
  P2=0xFF;
  return(P2&0x0F);
}
/////////////////////////////////////
//比赛结果信息显示
/////////////////////////////////////
void infoflash(uchar* a,uchar* b,uchar flag)
{
   uchar i;
   put_picture_half(Bmp1,R);
   LCD_CLR(L);
   put_chinese(chinese[20],4,0,0);//甲
   put_chinese(chinese[21],6,0,0);//乙
   if(flag)  put_chinese(chinese[21],0,8,1);
   else put_chinese(chinese[20],0,8,1);
   put_chinese(chinese[13],0,24,1);put_chinese(chinese[14],0,40,1);//shengli

   put_num(num10[1],2,20,1);
   put_num(num10[2],2,36,1);
   put_num(num10[3],2,52,1);

   for(i=0;i<3;i++){
		if(a[i]>9)
		  put_num(num10[1],4,16+i*16,0);//甲
		else put_num(num10[0],4,16+i*16,0);
		if(a[i]>9)
		  put_num(num10[a[i]-10],4,16+i*16+8,0);
		else put_num(num10[a[i]],4,16+i*16+8,0);

		if(b[i]>9)
		  put_num(num10[1],6,16+i*16,0);//乙
		else put_num(num10[0],6,16+i*16,0);
		if(b[i]>9)
		  put_num(num10[b[i]-10],6,16+i*16+8,0);
		else put_num(num10[b[i]],6,16+i*16+8,0);}
   enter();
}

/////////////////////////////////////
//双打模式控制
/////////////////////////////////////
uchar double_modle_1(uchar send_id)
{
    uchar state=0,value;
    uchar direction;
	put_chinese(chinese[17],4,24,0);//发球
	put_chinese(chinese[16],4,40,0);
	P3=0xFF;
	switch(send_id)
	{
	 case 0://甲1发球
           put_num(num10[10],0,53,0);//甲
		   put_num(num10[11],2,53,0);
		   put_chinese(chinese[20],4,0,0);
           put_num(num10[1],4,16,0);
		   do
		   {
			button=Read_P2();
			pause();
			if(pauseflag==EXIT) return 1;
		   }while(!(button==0x01));
		   if(moveflag==ENTER) direction=0;
		   else direction=2;
	       break;
	 case 1://甲2发球
           put_num(num10[10],0,53,0);//甲
		   put_num(num10[11],2,53,0);
		   put_chinese(chinese[20],4,0,0);
		   put_num(num10[2],4,16,0);
		   do
		   {
			 button=Read_P2();
			 pause();
			if(pauseflag==EXIT) return 1;
		   }while(!(button==0x02));
		   if(moveflag==ENTER) direction=6;
		   else direction=5;
		   break;
	 case 2://乙1发球
		   direction=4;
           put_num(num10[10],2,53,0);//乙
		   put_num(num10[11],0,53,0);
		   put_chinese(chinese[21],4,0,0);
		   put_num(num10[1],4,16,0);
		   do
		   {
			 button=Read_P2();
			 pause();
		   	 if(pauseflag==EXIT) return 1;
		   }while(!(button==0x08));
		   if(moveflag==UP) direction=1;
		   else direction=4;
		   break;
	 case 3://乙2发球
           put_num(num10[10],2,53,0);//乙
		   put_num(num10[11],0,53,0);
		   put_chinese(chinese[21],4,0,0);
		   put_num(num10[2],4,16,0);
		   do
		   {
			 button=Read_P2();
			 pause();
			 if(pauseflag==EXIT) return 1;
		   }while(!(button==0x04));
		   if(moveflag==UP) direction=7;
		   else direction=3;
		   break;
	}

    while(!state)
	{
	    moveflag=0;
	    if(direction==1) value=0x01;
 	    else if(direction==0) value=0x08;
		else if(direction==6) value=0x04;
		else if(direction==7) value=0x02;
	    switch(direction)
		{
	      case 0:
		         state=Ball_MoveP(0x03,1,0,speed,value);
				 switch(state)
				 {
					case 0:
					  if(moveflag==ENTER) direction=1;
					  else direction=4;
					  moveflag=0;
					  break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);//yi
						break;
				 } 
				 break;
	      case 1:
		         state=Ball_MoveP(0x03,0,0,speed,value);
				 switch(state)
				 {
					case 0:
					  if(moveflag==ENTER) direction=0;
					  else direction=2;
					  break;
					case 1://甲犯规,乙得分  
						gamenum.mark2++;
		                put_chinese(chinese[20],6,10,1);//jia
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);
						break;
				 }
				 break;
		  case 2:
		         state=Ball_MoveRightDown(speed);
				 switch(state)
				 {
					case 0:
					  if(moveflag==UP) direction=7;
					  else direction=3;
					  break;
					case 1://甲犯规,乙得分  
				     	gamenum.mark2++;
		                put_chinese(chinese[20],6,10,1);
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);//yi
						break;
				 }
				 break;
	   	  case 3:
		         state=Ball_MoveLeftUp(speed);
				 switch(state)
				 {
					case 0:
					  if(moveflag==ENTER) direction=0;
					  else direction=2;
					  break;
					case 1://甲犯规,乙得分  
						gamenum.mark2++;
		                put_chinese(chinese[20],6,10,1);
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
				    	put_chinese(chinese[21],6,10,1);
				    	break;
				 }
				 break;
		  case 4:
		         state=Ball_MoveLeftDown(speed);
				 switch(state)
				 {
					case 0:
					  if(moveflag==ENTER) direction=6;
					  else direction=5;
					  break;
					case 1://甲犯规,乙得分  
						gamenum.mark2++;
		                put_chinese(chinese[20],6,10,1);
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);
						break;
				 }
				 break;
		  case 5:
		         state=Ball_MoveRightUp(speed);
				 switch(state)
				 {
					case 0:
					  if(moveflag==UP) direction=1;
					  else direction=4;
					  break;
					case 1://甲犯规,乙得分  
						gamenum.mark2++;
		               put_chinese(chinese[20],6,10,1);
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);
						break;
				 }
				 break;
		  case 6:
		         state=Ball_MoveP(0xc0,1,7,speed,value);
				 switch(state)
				 {
					case 0:
					  if(moveflag==UP) direction=7;
					  else direction=3;
					  break;
					case 1://甲犯规,乙得分  
						gamenum.mark2++;
		                put_chinese(chinese[20],6,10,1);
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);
						break;
				 }
				 break;
		  case 7:
		         state=Ball_MoveP(0xc0,0,7,speed,value);
				 switch(state)
				 {
					case 0:
					  if(moveflag==ENTER) direction=6;
					  else direction=5;
					  break;
					case 1://甲犯规,乙得分  
						gamenum.mark2++;
		                put_chinese(chinese[20],6,10,1);
						break;
					case 2://乙犯规,甲得分 
						gamenum.mark1++;
						put_chinese(chinese[21],6,10,1);
						break;
				 }
				 break;
	 	 moveflag=0;
		}

    }
    put_chinese(chinese[18],6,26,1);//犯规
    put_chinese(chinese[19],6,42,1);
}
/*******************************
单人游戏
********************************/
uchar singlaplay()
{
   uchar i,j=0,flag;
   uchar a[3]={0,0,0},b[3]={0,0,0};
   send_num singlaplay_send={0,0,0};//默认开始甲发球
   LCD_CLR(L);LCD_CLR(R);
   //画边框
   for(i=0;i<8;i++){//球与信息分割线
    LCD_WriteData(0xFF,i,63);}
  /* for(i=0;i<64;i++){//上线
    LCD_WriteData(0x03,0,64+i);}
   for(i=0;i<64;i++){//下线
    LCD_WriteData(0xc0,7,64+i);}
   for(i=0;i<8;i++){
    LCD_WriteData(0xFF,i,127);}//右边线 */

   put_chinese(chinese[20],0,4,0);//甲
   put_chinese(chinese[21],2,4,0);//乙
   for(;;){

    infodisplay();
    for(i=0;i<64;i++){//上线
     LCD_WriteData(0x03,0,64+i);}
    for(i=0;i<64;i++){//下线
     LCD_WriteData(0xc0,7,64+i);}
    singlaplay_send=send_ball(singlaplay_send);
    if(singla_modle_1(singlaplay_send.send_id)) return 1;;
    infodisplay();
	//比分局分控制
    if((gamenum.mark1>=11)&&((gamenum.mark1-gamenum.mark2)>=2))
	    {
		 a[j]=gamenum.mark1;
		 b[j]=gamenum.mark2;
		 gamenum.game1++;
		 gamenum.mark1=0;
 		 gamenum.mark2=0;
		 singlaplay_send.send1=0;
		 singlaplay_send.send2=0;
		 put_chinese(chinese[20],0,64,1);
         put_chinese(chinese[13],0,80,1);
		 enter();LCD_CLR(R);j++;
		 }
	  else if((gamenum.mark2>=11)&&((gamenum.mark2-gamenum.mark1)>=2))
 	    {
		 a[j]=gamenum.mark1;
		 b[j]=gamenum.mark2;
		 gamenum.game2++;
		 gamenum.mark1=0;
 		 gamenum.mark2=0;
		 singlaplay_send.send1=0;
		 singlaplay_send.send2=0;
		 put_chinese(chinese[21],0,64,1);
         put_chinese(chinese[13],0,80,1);
		 enter();LCD_CLR(R);j++;
	    }	 
   if(gamenum.game2>=2) {flag=1;break;}
   else if(gamenum.game1>=2) {flag=0;break;}
   }

   infoflash(a,b,flag);
   Delay_x10ms(1000);
   return 1;
}

/////////////////////////////////////
//等待确认
/////////////////////////////////////
void enter()
{
   do{
      button=P2&0xF0;
   }while(!(button==ENTER));
}
/////////////////////////////////////
//击球中断
/////////////////////////////////////
void int0() interrupt 0 using 1
{  
   P2=0xFF;
   buttonplay=1;
   button=P2&0x0F;
}

/*******************************
发球控制。换发球每人两个(单打)
********************************/
send_num send_ball(send_num singlaplay_send)
{
  if(singlaplay_send.send2==2) {singlaplay_send.send_id=0;singlaplay_send.send2=0;}
  if(singlaplay_send.send1==2) {singlaplay_send.send_id=1;singlaplay_send.send1=0;}

  if(singlaplay_send.send_id) singlaplay_send.send2++;
  else singlaplay_send.send1++;

  return singlaplay_send;
}

/*******************************
单人游戏-----
********************************/
uchar singla_modle_1(uchar send_id)
{
    uchar state=0;
    uchar direction,value;
	put_chinese(chinese[17],4,26,0);//发球
	put_chinese(chinese[16],4,42,0);
	switch(send_id)
	{
	 case 0://甲发球
		   direction=1;
           put_num(num10[10],0,53,0);//甲
		   put_num(num10[11],2,53,0);
		   put_chinese(chinese[20],4,10,0);
		   do//yifa
		   {
			 button=Read_P2();
             pause();
			 if(pauseflag==EXIT) return 1;
		   }while(!(button==0x01));
	       break;
	 case 1://乙发球
		   direction=0;
           put_num(num10[10],2,53,0);//乙
		   put_num(num10[11],0,53,0);
		   put_chinese(chinese[21],4,10,0);
		   do//jiafa
		   {
			button=Read_P2();
			pause();
			if(pauseflag==EXIT) return 1;
		   }while(!(button==0x08));
		   break;
	}
	while(!state)
	 {
	    if(direction) value=0x08;
	    else value=0x01;
		state=Ball_MoveP(0x18,direction,3,speed,value);
		switch(state)
		{
			case 0:
			  if(direction==0) direction=1;
			  else direction=0;
			  break;
			case 1://甲犯规,乙得分  
				gamenum.mark2++;
                put_chinese(chinese[20],6,10,1);
				break;
			case 2://乙犯规,甲得分 
				gamenum.mark1++;
				put_chinese(chinese[21],6,10,1);
				break;
		}
		put_chinese(chinese[18],6,26,1);//犯规
		put_chinese(chinese[19],6,42,1);
		pauseflag=0;
     }
    return 0;
}
/////////////////////////////////////
//比分实时显示
/////////////////////////////////////
void infodisplay()
{   
   uchar i;
   for(i=0;i<8;i++){
    LCD_WriteData(0xFF,i,127);}//右边线

    put_num(num10[gamenum.game1],0,24,1);//局分甲
	put_num(num10[gamenum.game2],2,24,1);//局分乙
	if(gamenum.mark1>9)
	  put_num(num10[1],0,36,0);
	else put_num(num10[0],0,36,0);
	if(gamenum.mark1>9)
	  put_num(num10[gamenum.mark1-10],0,44,0);
	else put_num(num10[gamenum.mark1],0,44,0);

	if(gamenum.mark2>9)
	  put_num(num10[1],2,36,0);
	else put_num(num10[0],2,36,0);

	if(gamenum.mark2>9)
	  put_num(num10[gamenum.mark2-10],2,44,0);
	else put_num(num10[gamenum.mark2],2,44,0);
} 

/////////////////////////////////////
//暂停
/////////////////////////////////////
void  pause()
{
    uchar i;
    if(pauseflag==DOWN){
        put_picture_half(Bmp1,R);
        while(pauseflag==DOWN);
        LCD_CLR(R);}
	 
    for(i=0;i<8;i++){
    LCD_WriteData(0xFF,i,127);}//右边线
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -