C語(yǔ)言實(shí)現(xiàn)乒乓球比賽
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)乒乓球比賽的具體代碼,供大家參考,具體內(nèi)容如下
1)、基本要求
用8個(gè)LED發(fā)光管(紅黃綠)的來(lái)回滾動(dòng)顯示來(lái)模擬打乒乓球時(shí)乒乓球在兩邊球臺(tái)上的來(lái)回運(yùn)動(dòng)。比賽雙方用按鈕/開(kāi)關(guān)(雙方各用1個(gè)按鈕/開(kāi)關(guān))的方法來(lái)模擬發(fā)球與接球,即發(fā)球方按動(dòng)其控制的按鈕/開(kāi)關(guān)/健,球從發(fā)球方一側(cè)向?qū)Ψ竭\(yùn)動(dòng)(LED發(fā)光管從發(fā)球方到對(duì)方逐個(gè)點(diǎn)亮,滾動(dòng)顯示),當(dāng)球運(yùn)動(dòng)至接球方時(shí),接球方立即按動(dòng)其控制的按鈕/開(kāi)關(guān)/鍵,“擊球”使球“彈回”發(fā)球方一側(cè),如此周而復(fù)始,直至在規(guī)定的擊球時(shí)間內(nèi)有一方未能完成擊球動(dòng)作,從而對(duì)方得一分,然后繼續(xù)比賽。比賽規(guī)則可參照一般的乒乓球比賽規(guī)則。
要求:
(1). 球以每0.5秒滾過(guò)1個(gè)LED的速度移動(dòng);
(2). 回球需在球到達(dá)后的0.5秒內(nèi)進(jìn)行(按下按鈕),否則按失球計(jì);
(3). 球未到達(dá)提前按下按鈕按失球處理,不起回球作用;
(4). 用擴(kuò)展的4個(gè)七段數(shù)碼(小鍵盤上)為雙方記分(每方2個(gè)八段碼, ,按10進(jìn)制計(jì)數(shù),初始值00:00,可自行設(shè)計(jì)顯示及規(guī)則)
2)、設(shè)計(jì)提示
球到達(dá)接球方后,立即讀接球方的按鈕狀態(tài),若未按則有效(若已按下則按失球計(jì)),然后不斷讀此按鈕狀態(tài),直到按下代表“擊球”動(dòng)作。(采用中斷,可以用同一個(gè)按鍵輪流按動(dòng)識(shí)別)。
3)、進(jìn)一步設(shè)計(jì)要求
(1). 在8×8點(diǎn)陣(虛擬大屏)同步顯示球移動(dòng)情況,設(shè)計(jì)顯示輸贏球圖形狀態(tài)、效果等;移動(dòng)、擊球等精確(中斷)計(jì)時(shí);
(2). 通過(guò)撥動(dòng)開(kāi)關(guān)或鍵盤設(shè)定改變球移動(dòng)速度,即每個(gè)LED管點(diǎn)亮?xí)r間分別為0.5秒、0.3秒、0.2秒;通過(guò)撥動(dòng)開(kāi)關(guān)或鍵盤設(shè)定改變?cè)试S擊球時(shí)間0.3秒、0.2秒、0.1秒;球移動(dòng)速度取決于擊球時(shí)間,即球移動(dòng)速度(每個(gè)LED點(diǎn)亮?xí)r間)在0.2~0.5秒內(nèi)可變,具體取決于球到達(dá)接球方后擊球所花的時(shí)間0~0.5秒如花費(fèi)的時(shí)間短則回球后球移動(dòng)速度快反之回球后移動(dòng)
#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āng)前分?jǐn)?shù):%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!請(qǐng)打開(kāi)實(shí)驗(yàn)箱電源\n"); _getch(); exit(0); } PortWriteByte(Port8255Base + 3, ControlWord8255); } void init8255B(void) { if (!Startup()) { printf("\n\n ERROR: Open Device Error!請(qǐng)打開(kāi)實(shí)驗(yàn)箱電源\n"); _getch(); exit(0); // return to Windows } PortWriteByte(Port8255Base + 3, ControlWord8255E); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中double浮點(diǎn)數(shù)精度丟失的深入分析
這篇文章主要給大家介紹了關(guān)于C++中double浮點(diǎn)數(shù)精度丟失的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)
聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單有趣!?通過(guò)圖解的方式,我們將輕松理解這兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好開(kāi)啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!2024-03-03C語(yǔ)言實(shí)現(xiàn)學(xué)生打卡系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生打卡系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++面試八股文之std::string實(shí)現(xiàn)方法
這篇文章主要介紹了C++面試八股文:std::string是如何實(shí)現(xiàn)的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06C語(yǔ)言數(shù)組元素循環(huán)右移問(wèn)題及解決方法
這篇文章主要介紹了C語(yǔ)言數(shù)組元素循環(huán)右移問(wèn)題,本文通過(guò)多種方法給大家分享解決方案,通過(guò)實(shí)例代碼講解,對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C++ 中類對(duì)象類型的轉(zhuǎn)化的實(shí)例詳解
這篇文章主要介紹了C++ 中類對(duì)象類型的轉(zhuǎn)化的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08