C语言实现乒乓球比赛

所属分类: 软件编程 / C 语言 阅读数: 128
收藏 0 赞 0 分享

本文实例为大家分享了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++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多