C 언어 탁구 경기 실현
1)기본 요구
LED 발광 관(빨간색,노란색,녹색)8 개의 스크롤 디 스 플레이 로 탁 구 를 칠 때 탁구 가 양쪽 탁구대 에서 왔다갔다 하 는 운동 을 모 의 한다.경기 쌍방 은 버튼/스위치(쌍방 은 각각 1 개의 버튼/스위치)의 방법 으로 서브 와 리시브 를 모 의 한다.즉,서브 하 는 측 이 제어 하 는 버튼/스위치/건 을 누 르 고 공 은 서브 하 는 측 에서 상대방 을 향 해 운동 한다(LED 발광 관 은 서브 하 는 측 에서 상대방 까지 하나하나 밝 히 고 스크롤 디 스 플레이).공이 리시브 하 는 측 까지 운동 할 때 리시브 하 는 측 이 바로 제어 하 는 버튼/스위치/키 를 누른다.'타격'은 공 을 서브 하 는 쪽 에 튕 기 게 한다.이렇게 반복 해서 규정된 타격 시간 에 한 쪽 이 타격 동작 을 완성 하지 못 해서 상대방 이 1 점 을 얻 은 후에 경 기 를 계속 한다.경기 규칙 은 일반적인 탁구 경기 규칙 을 참조 할 수 있다.
요청:
(1).공 은 0.5 초 마다 LED 1 개 를 굴 리 는 속도 로 이동한다.
(2)리 턴 은 공이 도착 한 후 0.5 초 안에(버튼 을 누 르 고)해 야 하 며 그렇지 않 으 면 실 점 계 를 눌 러 야 한다.
(3).공이 도착 하지 않 으 면 미리 버튼 을 누 르 고 실 점 처 리 를 누 르 면 리 턴 작용 을 하지 않 는 다.
(4).확 장 된 4 개의 7 단 디지털(작은 키보드 에)로 쌍방 에 게 점 수 를 매 긴 다(각 방 2 개의 8 단 코드,10 진법 으로 계산 하고 초기 값 은 00:00 이 며 자체 적 으로 디 스 플레이 와 규칙 을 설계 할 수 있다).
2)、디자인 팁
공이 리시브 측 에 도착 하면 바로 리시브 측의 버튼 상 태 를 읽 고 누 르 지 않 으 면 유효 하 다(이미 누 르 면 실 점 계 를 누 르 고).그리고 이 버튼 상 태 를 계속 읽 고'타격'동작 을 대표 할 때 까지 계속 읽는다.(인 터 럽 트 를 사용 하여 같은 버튼 으로 돌아 가면 서 식별 할 수 있 습 니 다.
3)추가 설계 요구
(1).×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
",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
",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("
:%d : %d
",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
",old,pdata);
if(old==pdata)
{
continue;
}
else
{
k7old=old/8;
k0old=old%2;
k0new=pdata%2;
k7new=pdata/8;
if(k7old!=k7new)
{
//printf("---here---
");
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
",speedlamp);
if(!(old!=pdata&&k0old!=k0new))
{
printf("
--right lose--
");
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("
back
");
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("
--left lose--
");
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("
--left lose--
");
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("
back
");
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("
--right lose--
");
scoreleft++;
}
else
{
goto again2;
}
}
}
}
}
Cleanup();
}
void init8255(void)
{
if (!Startup())
{
printf("
ERROR: Open Device Error!
");
_getch();
exit(0);
}
PortWriteByte(Port8255Base + 3, ControlWord8255);
}
void init8255B(void)
{
if (!Startup())
{
printf("
ERROR: Open Device Error!
");
_getch();
exit(0); // return to Windows
}
PortWriteByte(Port8255Base + 3, ControlWord8255E);
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.