C语言实现乒乓球比赛

 更新时间:2020年05月27日 10:59:19   作者:wenmiao_  
这篇文章主要为大家详细介绍了C语言实现乒乓球比赛,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现乒乓球比赛的具体代码,供大家参考,具体内容如下

1)、基本要求

用8个LED发光管(红黄绿)的来回滚动显示来模拟打乒乓球时乒乓球在两边球台上的来回运动。比赛双方用按钮/开关(双方各用1个按钮/开关)的方法来模拟发球与接球,即发球方按动其控制的按钮/开关/健,球从发球方一侧向对方运动(LED发光管从发球方到对方逐个点亮,滚动显示),当球运动至接球方时,接球方立即按动其控制的按钮/开关/键,“击球”使球“弹回”发球方一侧,如此周而复始,直至在规定的击球时间内有一方未能完成击球动作,从而对方得一分,然后继续比赛。比赛规则可参照一般的乒乓球比赛规则。

要求:

(1). 球以每0.5秒滚过1个LED的速度移动;

(2). 回球需在球到达后的0.5秒内进行(按下按钮),否则按失球计;

(3). 球未到达提前按下按钮按失球处理,不起回球作用;

(4). 用扩展的4个七段数码(小键盘上)为双方记分(每方2个八段码, ,按10进制计数,初始值00:00,可自行设计显示及规则)

2)、设计提示

球到达接球方后,立即读接球方的按钮状态,若未按则有效(若已按下则按失球计),然后不断读此按钮状态,直到按下代表“击球”动作。(采用中断,可以用同一个按键轮流按动识别)。

3)、进一步设计要求

(1). 在8×8点阵(虚拟大屏)同步显示球移动情况,设计显示输赢球图形状态、效果等;移动、击球等精确(中断)计时;

(2). 通过拨动开关或键盘设定改变球移动速度,即每个LED管点亮时间分别为0.5秒、0.3秒、0.2秒;通过拨动开关或键盘设定改变允许击球时间0.3秒、0.2秒、0.1秒;球移动速度取决于击球时间,即球移动速度(每个LED点亮时间)在0.2~0.5秒内可变,具体取决于球到达接球方后击球所花的时间0~0.5秒如花费的时间短则回球后球移动速度快反之回球后移动

#include "interface.h"
void init8255(void); 
const unsigned short Port8255Base=0x288;
const unsigned char ControlWord8255=0x80;
Input/Output.PortA:Output
unsigned char gData=0x80;
int flag=0;
int num=0;
const unsigned char ControlWord8255B = 0x82;
const unsigned char ControlWord8255E = 0x88;
void init8255B(void); 
int scoreleft,scoreright;
int speedlamp;
int speed2;
int speed3;
 
void turnleft()
{
 gData=1;
 while(1)
 {
 PortWriteByte(Port8255Base,gData);
 if(gData==128)
 {
 flag=0;
 break;
 }
 gData*=2;
 sleep(speedlamp);
 }
}
void turnright()
{
 gData=128;
 while(1)
 {
 PortWriteByte(Port8255Base,gData);
 if(gData==1)
 {
 flag=1;
 break;
 }
 gData/=2;
 sleep(speedlamp);
 }
}
unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
BYTE pdata;
BYTE reflect;
void main( )
{
 init8255B();
  //int speedlamp=500;
 BYTE controldudu;
 PortReadByte(Port8255Base + 2, &controldudu);
 printf("%d \n",controldudu);
 controldudu/=32;
 int k5=controldudu%2;
 controldudu/=2;
 int k6=controldudu%2;
 if(k6==0)
 speedlamp=500;
 else
 speedlamp=50;
 if(k5==0)
 speed2=500;
 else
 speed2=1;
 printf("%d %d\n",k6,k5);
 pdata/=16;
 scoreleft=0;
 scoreright=0;
 BYTE pdata=0; 
  int k0=0;
 int k7=0;
 int score0=0;
 int score1=0;
 
 BYTE old=0;
 BYTE now;
 int k0old,k0new,k7old,k7new;
 k0old=old%2;
 k7old=old/8;
 while(1)
 {
 printf("\n当前分数:%d : %d\n",scoreleft,scoreright);
 
 int yyy=5;
 while(yyy--){
 PortWriteByte(Port8255Base+2,0x01); 
 PortWriteByte(Port8255Base+1,led[scoreright%10]);
 sleep(1); //delay 100ms
 PortWriteByte(Port8255Base+2,0x02); 
 PortWriteByte(Port8255Base+1,led[scoreright/10]); 
  sleep(1); 
 PortWriteByte(Port8255Base+2,0x04); 
 PortWriteByte(Port8255Base+1,led[scoreleft%10]);
 sleep(1); //delay 100ms
 PortWriteByte(Port8255Base+2,0x08); 
 PortWriteByte(Port8255Base+1,led[scoreleft/10]); 
  sleep(1); 
 PortWriteByte(Port8255Base+2,0);
 }
 PortReadByte(Port8255Base + 2, &pdata);
 pdata/=16;
 sleep(500);
 printf("--%d",pdata);
 printf("old:%d new:%d\n",old,pdata);
 if(old==pdata)
 {
 continue;
 }
 else
 {
 k7old=old/8;
 k0old=old%2;
 k0new=pdata%2;
 k7new=pdata/8;
 if(k7old!=k7new)
 {
  //printf("---here---\n");
 again:
  turnright();
  old=pdata;
  k0old=old%2;
  PortReadByte(Port8255Base + 2, &now);
  now/=16;
  k0old=now%2;
  if(speed2>50)
  {
  sleep(200);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
  pdata=reflect;
  speedlamp=200;
  goto r1;
  }
  else
  {
  sleep(100);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
  pdata=reflect;
  speedlamp=1000;
  goto r1;
  }
  else
  {
  sleep(100);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
   pdata=reflect;
   speedlamp=4000;
   goto r1;
  }
  else
  {
   sleep(100);
   goto r2;
  }
  }
  }
  }
  else
  sleep(speed2);
  r2:
  PortReadByte(Port8255Base + 2, &pdata);
  pdata/=16;
  r1:
  k0new=pdata%2;
  printf("speedlamp:%d\n",speedlamp);
  if(!(old!=pdata&&k0old!=k0new))
  {
  printf("\n--right lose--\n");
  scoreleft++;
  sleep(500);
  PortReadByte(Port8255Base + 2, &pdata);
  pdata/=16;
  old=pdata;
  k7old=old/8;
  k0old=old%2;
  k0new=pdata%2;
  k7new=pdata/8;
  }
  else
  {
  printf("\nback\n");
  turnleft();
  old=pdata;
  k7old=old/8;
  PortReadByte(Port8255Base + 2, &now);
  k7old=now/128;
  if(speed2>50)
  {
  sleep(200);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
  pdata=reflect;
  speedlamp=200;
  goto r3;
  }
  else
  {
  sleep(100);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
   pdata=reflect;
   speedlamp=1000;
   goto r3;
  }
  else
  {
   sleep(100);
   PortReadByte(Port8255Base + 2, &reflect);
   reflect/=16;
   if(!(reflect==pdata))
   {
   pdata=reflect;
   speedlamp=4000;
   goto r3;
   }
   else
   {
   sleep(100);
   goto r4;
   }
  }
  }
  }
  else
  sleep(speed2);
  r4:
  PortReadByte(Port8255Base + 2, &pdata);
  pdata/=16;
  r3:
  k7new=pdata/8;
  if(!(old!=pdata&&k7old!=k7new))
  {
  printf("\n--left lose--\n");
  scoreright++;
  }
  else
  {
  goto again;
  }
  }
 }
 else if(k0old!=k0new)
 {
 again2:
  turnleft();
  old=pdata;
  k7old=old/8;
  PortReadByte(Port8255Base + 2, &now);
  k7old=now/128;
  if(speed2>50)
  {
  sleep(200);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
  pdata=reflect;
  speedlamp=200;
  goto r7;
  }
  else
  {
  sleep(100);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
  pdata=reflect;
  speedlamp=1000;
  goto r7;
  }
  else
  {
  sleep(100);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
   pdata=reflect;
   speedlamp=2000;
   goto r7;
  }
  else
  {
   sleep(100);
   goto r8;
  }
  }
  }
  }
  sleep(speed2);
  r8:
  PortReadByte(Port8255Base + 2, &pdata);
  pdata/=16;
  r7:
  k7new=pdata/8;
  if(!(old!=pdata&&k7old!=k7new))
  {
  printf("\n--left lose--\n");
  scoreright++;
  sleep(500);
  PortReadByte(Port8255Base + 2, &pdata);
  pdata/=16;
  old=pdata;
  k7old=old/8;
  k0old=old%2;
  k0new=pdata%2;
  k7new=pdata/8;
  }
  else
  {
  printf("\nback\n");
  turnright();
  old=pdata;
  k7old=old/8;
  PortReadByte(Port8255Base + 2, &now);
  now/=16;
  k0old=now%2;
  if(speed2>50)
  {
  sleep(200);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
  pdata=reflect;
  speedlamp=200;
  goto r5;
  }
  else
  {
  sleep(100);
  PortReadByte(Port8255Base + 2, &reflect);
  reflect/=16;
  if(!(reflect==pdata))
  {
   pdata=reflect;
   speedlamp=100;
   goto r5;
  }
  else
  {
   sleep(100);
   PortReadByte(Port8255Base + 2, &reflect);
   reflect/=16;
   if(!(reflect==pdata))
   {
   pdata=reflect;
   speedlamp=2000;
   goto r5;
   }
   else
   {
   sleep(100);
   goto r6;
   }
  }
  }
  }
  sleep(speed2);
  r6:
  PortReadByte(Port8255Base + 2, &pdata);
  pdata/=16;
  r5:
  k7new=pdata/8;
  if(!(old!=pdata&&k0old!=k0new))
  {
  printf("\n--right lose--\n");
  scoreleft++;
  }
  else
  {
  goto again2;
  }
  }
 }
 }
 
 }
 Cleanup();
}
 
void init8255(void)
{
 if (!Startup()) 
 {
 printf("\n\n  ERROR: Open Device Error!请打开实验箱电源\n");
 _getch();
 exit(0);
 }
  PortWriteByte(Port8255Base + 3, ControlWord8255); 
}
 
void init8255B(void)
{
 if (!Startup())
 {
 printf("\n\n  ERROR: Open Device Error!请打开实验箱电源\n");
 _getch();
 exit(0); // return to Windows
 }
 PortWriteByte(Port8255Base + 3, ControlWord8255E); 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言小程序 如何判断两个日期之差

    C语言小程序 如何判断两个日期之差

    输入两个日期,计算之间相差多少天。 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样
    2013-07-07
  • C++中double浮点数精度丢失的深入分析

    C++中double浮点数精度丢失的深入分析

    这篇文章主要给大家介绍了关于C++中double浮点数精度丢失的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C++实现LeetCode(38.计数和读法)

    C++实现LeetCode(38.计数和读法)

    这篇文章主要介绍了C++实现LeetCode(38.计数和读法),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 图解C++的STL之stack和queue,轻松理解数据结构

    图解C++的STL之stack和queue,轻松理解数据结构

    聚焦 C++ 的 STL 中的 stack 和 queue,让数据结构变得简单有趣! 通过图解的方式,我们将轻松理解这两个重要的数据结构,准备好开启 STL 学习之旅了吗?让我们一起探索 stack 和 queue 的奥秘吧!
    2024-03-03
  • 在iOS中给视频添加滤镜的方法示例

    在iOS中给视频添加滤镜的方法示例

    这篇文章主要介绍了在iOS中给视频添加滤镜的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 从汇编看c++中多态的应用

    从汇编看c++中多态的应用

    本篇文章是对c++中多态的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现学生打卡系统

    C语言实现学生打卡系统

    这篇文章主要为大家详细介绍了C语言实现学生打卡系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++面试八股文之std::string实现方法

    C++面试八股文之std::string实现方法

    这篇文章主要介绍了C++面试八股文:std::string是如何实现的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • C语言数组元素循环右移问题及解决方法

    C语言数组元素循环右移问题及解决方法

    这篇文章主要介绍了C语言数组元素循环右移问题,本文通过多种方法给大家分享解决方案,通过实例代码讲解,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++ 中类对象类型的转化的实例详解

    C++ 中类对象类型的转化的实例详解

    这篇文章主要介绍了C++ 中类对象类型的转化的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08

最新评论