當前位置:編程學習大全網 - 編程語言 - 通過編程做壹個遊戲機。

通過編程做壹個遊戲機。

1.問題描述

用8個LED發光管(4紅4綠)的來回滾動顯示,模擬打乒乓球時兩邊乒乓球的來回運動。遊戲雙方采用按鍵的方式(每方使用1按鍵)模擬發球和接發球,即發球方按下由其控制的按鍵,球從發球方移動到對方(led發光管從發球方到對方壹個壹個點亮,顯示滾動)。當球移動到接發球方時,接發球方立即按下由其控制的按鈕,“擊球”使球“反彈”到發球方,以此類推。

2.設計要求

比賽規則可以參考乒乓球的壹般規則。要求:

(1)球以每0.5秒滾過1個led的速度移動;

(2)球到達後0.5秒內回球(按下按鈕),否則算失球;

(3)球到達前按下按鈕,球不會返回;

(4)用四個八段碼為兩邊記分(每邊兩個八段碼,以10為基數計數,初始值0:0)。

設備:單脈沖電路、可編程並行接口8255、可編程定時計數器8253、LED行車燈、七段數碼管、開關等。

壹、實驗原理

1.8253定時器采用模式0實現定時功能。為了實現連續顯示,必須每隔5~10ms刷新兩個七段數碼管,燈的移動速度為300 ~ 500 ms,設置計時周期為5 ms,當計數停止,8253輸出高電平時,將分別顯示分數的高低位置。在壹定數量的定時周期之後,執行燈移動的操作。

2.8255並行接口A口和B口分別用於控制LED流水燈和數碼管的顯示,C口用於讀入各開關的狀態,輸出數碼管的片選信號。

3.單脈沖開關模擬擊球。當8255讀入的脈沖信號為高電平時,通過判斷燈和電池的當前移動方向,可以確定燈的下壹個移動方向。

4.四號。LED跑步燈指示乒乓球的運動。每次燈移動時,都應該給操作員留出足夠的時間來撥動速度開關或按下脈沖開關。

5.七段數碼管與比賽同步顯示比分,0~f對應的16基控數為0x3f、0x06、0x5b、0x4f、0x66、0x6d、0x7d、0x07。

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x71 .

二、硬件接線圖

三、程序框圖

四、源程序

程序源代碼如下:

(包括註釋)

// -

//文件名:table tennis.cpp

//版本:1.0標準版

//創建人:鳳飛

//創建日期:01/12/2010

//說明:可以計分,判斷勝負,調節乒乓球速度。

//這個程序都是我自己寫的。如有雷同,不勝榮幸!

// -

# include & ltstdio.h & gt

# include & ltconio.h & gt

# include & ltstring.h & gt

# include & ltiostream.h & gt

#包含“ApiEx.h”

#pragma註釋(lib," ApiEx.lib ")

int pa = 0x280

int Pb = 0x 281;

int pc = 0x282

int pn 1 = 0x 283;

int p0 = 0x288

int p 1 = 0x 289;

int p2 = 0x28a

int pn2 = 0x28b

int s[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7b,0x 71 };

// 0 1 2 3 4 5 6 7 8 9 a b c d e f

void leddic(無符號字符& ampLed,int f) //燈移動功能

{

int x = led

if(f = = 0)x = x/2;//如果方向對,光向右移動壹個。

else if(f = = 1)x = x * 2;//如果方向是左,燈光向左移動壹個。

else printf("錯誤!");

led = x;

}

虛空速度(int & ampS) //球速控制,從8255C口讀取開關狀態,

{//高的話,調整速度快。

無符號字符數據;

int x;

端口讀取字節(PC & amp;數據);

x =數據;

x = x & amp4;

if(x = = 0)s = 100;//默認為5 * 100毫秒。

if(x = = 1)s = 60;//高速5*60ms

}

void score(int m)//通過數碼管顯示分數。

{

無符號字符數據;

data = s[m];

PortWriteByte(pc,0x 20);//選擇數碼管的高位

PortWriteByte(pa,data);//顯示分數

}

無效分數(整數)

{

無符號字符數據;

data = s[n];

PortWriteByte(pc,0x 10);//選擇數碼管的低位。

PortWriteByte(pa,data);//顯示B分數

}

void start(無符號字符& amp發光二極管,int & ampf,int & amps,int m,int n) //服務器仿函數

{

無符號字符數據;

int x;

PortWriteByte(pn2,0x 57);//8253計數器1初始化,低八位,模式3,控制字01010111b。

PortWriteByte(p1,0x 10);//8253計數器1計數初始值10。

for(;1 & lt;2;)

{

速度;

端口讀取字節(PC & amp;數據);

x =數據;

x = x & amp1;

If(x==1) //如果A發球,光線從左到右。

{

led = 0x80

f = 0;

打破;

}

x =數據;

x = x & amp2;

If(x==1) //如果B發球,光線從右向左。

{

led = 0x 1;

f = 1;

打破;

}

x =數據;

x = x & amp8;

If(x==1) //當8253的輸出為高時,顯示A分。

{

scorem(米);

}

Else //當8253輸出為低電平時,顯示B的分數score(n);

}

}

void out(無符號字符& amp發光二極管,int & ampf,int & ampm,int & ampN) //判斷球是否出界,即球員得分。

{

If(f==1) //當球向左移動時,

{

If(led==0x0) //球出界了。

{

Printf ("B分!\ n ");

n++;

printf(" score:");

printf("%d-%d ",m,n);

printf(" \ n \ n ");

}

}

Else //當球向右移動時,

{

If(led==0x0) //球超出右邊界。

{

Printf ("A分數!\ n ");

m++;

printf(" score:");

printf("%d-%d ",m,n);

printf(" \ n \ n ");

}

}

if((m = = 11)& amp;& amp(m-n & gt;= 2))| |((m & gt;11)& amp;& amp(m-n & gt;= 2))//判斷整場比賽的勝負。

{

Printf("這局A贏了!重新得分!\ n \ n \ n ");

m = n = 0;

}

else if((n = = 11)& amp;& amp(n-m & gt;= 2))| |((n & gt;11)& amp;& amp(n-m & gt;=2)))

{

Printf("這局B贏了!重新得分!\ n \ n \ n ");

m = n = 0;

}

}

無效攻擊(無符號字符& amp發光二極管,int & amp美國國際貿易公司。f,int & ampm,int & ampN) // hitter函數

{

無符號字符數據;

int x,y;

STA:

Printf("請上菜!\ n ");

啟動(led,f,s,m,n);

PortWriteByte(pn2,0x 51);//8253計數器1初始化,低八位,模式0,控制字0101001b。

紅色:

PortWriteByte(pb,led);

for(int I = 1;我& lt= s;i++)

{

PortWriteByte(p1,5);//8253計數器1計數初始值5。

咕:

端口讀取字節(PC & amp;數據);

x =數據;

y =數據;

y = y & amp8;

if(y = = 0)goto Goo;//8253不輸出高電平時繼續讀取。

if(I % 2 = = 1)scorem(m);

else scoren(n);

If(f==1) //球向左移動。

{

x = x & amp1;

if((x = = 1)& amp;& amp(led & gt=0x10)) //球接近A,A擊球。

{

f = 0;//向右調整球的移動方向。

}

}

Else //球向右移動。

{

x =數據;

x = x & amp2;

if((x = = 2)& amp;& amp(led & lt=0x8)) //球接近B and B擊球。

{

f = 1;//向左調整球的移動方向。

}

}

}

leddic(led,f);

out(led,f,m,n);

中頻(led==0x0)

{

PortWriteByte(pb,led);

goto STA

}

轉紅;

}

void main()

{

無符號字符led

int f=1,s = 0;//f是光線的移動方向,默認為向右;s是燈的移動速度。

int m=0,n = 0;//m是分數,n是分數。

startup();//打開設備

PortWriteByte(pn1,0x 81);//8255初始化,A口和B口輸出,

//C口高電平輸出,低電平輸入,控制字1000001b。

PortWriteByte(pn2,0x 27);//8253計數器0初始化,8個高位,模式3,控制字001001111b。

PortWriteByte(p0,0x 20);//8253計數器0計算初始值2000。

攻擊(led,s,f,m,n);//調用擊球手函數

clean up();//關閉設備

}

動詞 (verb的縮寫)結論

實現了壹個可以同步記分和顯示比分的模擬乒乓球比賽。

可以實現或完成的功能如下:

1.LED燈模擬乒乓球的運動。

2.模擬乒乓球擊球和發球。

3.像在實際比賽中壹樣判斷比分和整場比賽的勝負。

4.妳可以調整服務速度。

5.得分和顯示得分同步進行

  • 上一篇:能否給我壹個裝箱子問題的matlab編程
  • 下一篇:理想汽車牽手英偉達、德賽西威 將率先采用Orin自動駕駛芯片
  • copyright 2024編程學習大全網