久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

5編寫一個(gè)C語言程序(五篇范文)

時(shí)間:2019-05-12 18:56:06下載本文作者:會(huì)員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《5編寫一個(gè)C語言程序》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《5編寫一個(gè)C語言程序》。

第一篇:5編寫一個(gè)C語言程序

前面幾節(jié)介紹了常量和變量、運(yùn)算符、表達(dá)式和語句的概念,對它們的使用有了一個(gè)大概的了解。也許剛學(xué)程序的人會(huì)覺得有些枯燥,下面我們就來編寫第一個(gè)C語言程序。

#define PI 3.1416 main(){ float Radius,Area;scanf(%f,&Radius);/*輸入半徑的值*/ Area=PI*Radius*Radius;printf(%fn,Area);/*輸出圓的面積*/ }

1.一個(gè)C語言程序,通常由帶有#號的編譯預(yù)處理語句開始。關(guān)于預(yù)處理我們在以后介紹,這里的#define PI 3.1415926相當(dāng)于PI代表3.1416,下面在程序中遇到PI,我們就用3.1416替代一下。在以后的程序中,在學(xué)習(xí)預(yù)處理之前,我們都將不使用預(yù)處理語句。

2.main()任何一個(gè)完整的程序都需要main(),這是一個(gè)函數(shù),具體什么是函數(shù),以后再講,這兒你就要記住就行。后面有一對{}把所有的語句都括在里面,表明那些語句都屬于main()里面。程序運(yùn)行時(shí)從這個(gè)左大括號開始。

3.{}里面的4行語句大家應(yīng)該都能明白,先定義兩個(gè)變量,一個(gè)代表半徑,一個(gè)代表面積,然后輸入半徑的值,然后求面積,最后在屏幕上輸出面積。程序到main()的那對{}的右大括號結(jié)束。求面積的語句Area=PI*Radius*Radius;相當(dāng)于Area=3.1416*Radius*Radius;(完全用3.1416替代PI)。

具體程序從編寫到運(yùn)行得到結(jié)果的步驟為: 1.雙擊tc.exe,進(jìn)入Turbo C 2.0編譯界面 2.ALT+E 進(jìn)入編輯模式 3.書寫程序

4.F2 存儲程序(也可進(jìn)入File菜單,選擇save),第一次存儲需要寫上程序名稱(*.C),回車

5.ALT+F9 編譯,如果有錯(cuò)誤和警告,光標(biāo)停留在錯(cuò)誤行,回車進(jìn)行修改,修改后,回到4;沒有錯(cuò),下一步 6.CTRL+F9 連接和運(yùn)行程序

7.用ALT+F5查看程序運(yùn)行結(jié)果,任意鍵返回程序

如何打開一個(gè)已有的C文件:

1.雙擊tc.exe,進(jìn)入Turbo C 2.0編譯界面

2.F3 進(jìn)入load狀態(tài),找到所要打開文件的目錄,找到文件,回車;后面都一樣。具體的有哪些快捷鍵及其它們的作用,請查看第一節(jié)概述。

說明:

1.必須在程序的最開始部分定義所有用到的變量,例如這里的Area,Radius。2.變量的命名要盡量有意義,如用代表該意思的英文單詞、或者是漢語拼音,例如這里的Radius,Area,絕對禁止用毫無干系的字母,如a,b,c。例如下面的程序,雖然意思和上面的一樣,但是看上去意思不明朗,時(shí)間長了,很可能忘記程序本身的意思。對于僅僅是控制程序運(yùn)行,不代表實(shí)際意思時(shí),可以用一些簡單字母。main(){ float a,b;scanf(%f,&a);b=3.1416*a*a;printf(%fn,b);} 3.采用層次書寫程序的格式,要有合理的縮進(jìn),必要的時(shí)候要有空行,一行只書寫一個(gè)語句。所有語句盡量不分行,除非太長(分行時(shí)變量、運(yùn)算符,格式字符等等不能拆開),例如下面兩個(gè)程序看起來就不好看了,雖然它們的功能和前面是一樣的。main(){float Radius,Area;scanf(%f,&Radius);Area=3.1416*Radius*Radius;printf(%fn,Area);}

main(){ float Radius,Area;scanf(%f, %Radius);Area=3.1416*Radius *Radius;printf(%fn, Area);} 4.程序在適當(dāng)?shù)牡胤揭?*……*/注釋,它的意思表示在/* */里面的所有字符都不參加編譯。因?yàn)橐粋€(gè)較大的程序,經(jīng)過一段時(shí)間,有些地方可能連編程者都忘記了,增加注釋可以幫助恢復(fù)記憶,調(diào)試程序時(shí),也容易找出錯(cuò)誤。注釋也可以分行寫。5.在書寫{}時(shí)要對齊。雖然不對應(yīng)也不影響程序運(yùn)行,但對齊后方便以后檢查程序,也是為了美觀,特別是后面學(xué)到流程控制時(shí),{}一定要對齊。

程序設(shè)計(jì)方法:

1.從問題的全局出發(fā),寫出一個(gè)概括性的抽象的描述。

2.定義變量,選取函數(shù),確定算法。算法這個(gè)東西不好說,遇到的問題多了,自然就會(huì)形成自己一整套的算法。

3.按照解決問題的順序把語句和函數(shù)在main()里面堆砌起來。一個(gè)好的C程序員應(yīng)該做到: 1.在運(yùn)行程序之前存盤

2.所有在程序中用到的常量都用預(yù)處理語句在程序開頭定義 3.所有在程序中用到的函數(shù)都在程序開頭聲明 4.頭文件的#ifndef 5.變量名和函數(shù)名使用有意思的英文單詞或漢語拼音 6.盡量少用全局變量或不用全局變量

7.采用層次的書寫程序格式,對for,while,if_else,do_while,switch_case等控制語句或他們的多重嵌套,采用縮格結(jié)構(gòu) 8.所有對應(yīng)的{}都對齊

9.盡量用for,而不用while做記數(shù)循環(huán) 10.盡量不用goto語句

11.一個(gè)函數(shù)不宜處理太多的功能,保持函數(shù)的小型化,功能單一化 12.一個(gè)函數(shù)要保持自己的獨(dú)立性,如同黑匣子一樣,單進(jìn)單出 13.函數(shù)的返回類型不要省略

14.用malloc()分配內(nèi)存空間時(shí),以后一定要用free()釋放 15.打開文件后,記住在退出程序前要關(guān)閉 16.出錯(cuò)情況的處理 17.寫上必要的注釋

這里說的是一些基本的,經(jīng)常遇到的情況,還有其他很多要注意的地方,在實(shí)際編程中都會(huì)遇到.

第二篇:編寫一個(gè)以C 語言為基礎(chǔ)的DSP程序

實(shí)驗(yàn)1.2 : 編寫一個(gè)以C 語言為基礎(chǔ)的DSP程序 一.實(shí)驗(yàn)?zāi)康?/p>

1.學(xué)習(xí)用標(biāo)準(zhǔn)C語言編制程序;了解常用的C語言程序設(shè)計(jì)方法和組成部分。2.學(xué)習(xí)編制連接命令文件,并用來控制代碼的連接。

3.學(xué)會(huì)建立和改變map文件,以及利用它觀察DSP內(nèi)存使用情況的方法。4.熟悉使用軟件仿真方式調(diào)試程序。

二.實(shí)驗(yàn)設(shè)備

PC兼容機(jī)一臺,操作系統(tǒng)為Windows2000(或Windows98,WindowsXP,以下默認(rèn)為 Windows2000),安裝Code Composer Studio 2.0軟件。

三.實(shí)驗(yàn)原理 1.標(biāo)準(zhǔn)C語言程序

CCS支持使用標(biāo)準(zhǔn)C語言開發(fā)DSP應(yīng)用程序。當(dāng)使用標(biāo)準(zhǔn)C語言編制的程序時(shí),其CCS在編譯標(biāo)準(zhǔn)C語言程序時(shí),首先將其編譯成相應(yīng)匯編語言程序,再進(jìn)一步編譯成源程序文件名的后綴應(yīng)為.c(如:volume.c)。

目標(biāo)DSP的可執(zhí)行代碼。最后生成的是coff格式的可下載到DSP中運(yùn)行的文件,其文件名后綴為.out。由于使用C語言編制程序,其中調(diào)用的標(biāo)準(zhǔn)C的庫函數(shù)由專門的庫提供,在編譯連接時(shí)編譯系統(tǒng)還負(fù)責(zé)構(gòu)建C運(yùn)行環(huán)境。所以用戶工程中需要注明使用C的支持庫。2.命令文件的作用 命令文件(文件名后綴為cmd)為鏈接程序提供程序和數(shù)據(jù)在具體DSP硬件中的位置分配信息。通過編制命令文件,我們可以將某些特定的數(shù)據(jù)或程序按照我們的意圖放置在DSP 所管理的內(nèi)存中。命令文件也為鏈接程序提供了DSP外擴(kuò)存儲器的描述。在程序中使用CMD文件描述硬件存儲區(qū),可以只說明使用部分,但只要是說明的,必須和硬件匹配,也就是只要說明的存儲區(qū)必須是存在的和可用的。3.內(nèi)存映射(map)文件的作用 一般地,我們設(shè)計(jì)、開發(fā)的DSP程序在調(diào)試好后,要固化到系統(tǒng)的ROM中。為了更

精確地使用ROM空間,我們就需要知道程序的大小和位置,通過建立目標(biāo)程序的map文件可以了解DSP代碼的確切信息。當(dāng)需要更改程序和數(shù)據(jù)的大小和位置時(shí),就要適當(dāng)修改cmd文件和源程序,再重新生成map文件來觀察結(jié)果。另外,通過觀察map文件,可以掌握DSP存儲器的使用和利用情況,以便進(jìn)行存儲器方面的優(yōu)化工作。4.程序設(shè)計(jì)要求 程序框圖(圖2-1):

四.實(shí)驗(yàn)內(nèi)容與步驟

1.實(shí)驗(yàn)準(zhǔn)備 設(shè)置軟件仿真模式。

2.建立新的工程文件(1)雙擊桌面上圖標(biāo),啟動(dòng)Code Composer Studio 2.21。(2)進(jìn)行以下設(shè)置(如圖2-2):

3.編輯輸入源程序(1)C語言程序-先新建源程序窗口:-輸入源程序: intx,y,z;main(){ x=1;y=2;while(1){ z=x+y;} }

圖2-3 新建源文件

-保存源程序?yàn)镃Program.c:(2)連接命令文件

-如同第(1)步操作,建立空的源程序窗口。-輸入連接命令文件內(nèi)容:-l rts2800.lib-stack 400h-heap 100 MEMORY { PAGE 0 : PROG(R): origin = 0x3E8000, length = 0x10000 PAGE 0 : BOOT(R): origin = 0x3FF000, length = 0xFC0 PAGE 0 : RESET(R): origin = 0x3FFFC0, length = 0x2 PAGE 0 : VECTORS(R): origin = 0x3FFFC2, length = 0x3E PAGE 1 : M0RAM(RW): origin = 0x000000, length = 0x400 PAGE 1 : M1RAM(RW): origin = 0x000400, length = 0x400 PAGE 1 : L0L1RAM(RW): origin = 0x008000, length = 0x2000 圖2-4 保存為c文件

PAGE 1 : H0RAM(RW): origin = 0x3F8000, length = 0x2000 } SECTIONS { /* 22-bit program sections */.reset : > RESET, PAGE = 0 vectors : > VECTORS, PAGE = 0.pinit : > PROG, PAGE = 0.cinit : > PROG, PAGE = 0.text : > PROG, PAGE = 0 /* 16-Bit data sections */.const : > L0L1RAM, PAGE = 1.bss : > L0L1RAM, PAGE = 1.stack : > M1RAM, PAGE = 1.sysmem : > M0RAM, PAGE = 1 /* 32-bit data sections */.ebss : > H0RAM, PAGE = 1.econst : > H0RAM, PAGE = 1.esysmem : > H0RAM, PAGE = 1 }-l rts2800.lib-如同第(1)步操作,將文件存為:

C:ICETEK-F2812-A-EDUlabDSP281x_examplesLab0102-CProgram CProgram.cmd(3)將上述編譯的源程序加入工程CProgram.pjt。4.編譯源文件、下載可執(zhí)行程序(1)單擊菜單“Project”、“Rebuild All”。

(2)執(zhí)行FileàLoad Program,在隨后打開的對話框中選擇剛剛建立的

C:ICETEK-F2812-EDULabLab0102-CProgramdebugCProgram.out 文件。完成后,系

統(tǒng)自動(dòng)打開一個(gè)反匯編窗口“Disassembly”,并在其中指示程序的入口地址為 “_c_int00”。

5.打開觀察窗口

開啟CPU寄存器觀察窗口:單擊菜單View->Registers->Core。6.觀察程序運(yùn)行結(jié)果

這時(shí),在“Disassembly”代表程序運(yùn)行位置的綠色箭頭指向程序的入口地址,程序?qū)?此開始執(zhí)行。

(1)選擇菜單中Debug->Go Main,CCS自動(dòng)打開CProgram.c,程序會(huì)停在用戶主程序入

口main上,這從反匯編窗口和CProgram.c窗口中的指示箭頭位置可以看出。(2)在內(nèi)存觀察窗口中觀察變量的值:

選擇“View”菜單中“Memory…”項(xiàng),在“Memroy Window Options”窗口中的“Adress” 項(xiàng)中輸入&x,單擊“OK”完成設(shè)置;“Memory”窗口中x 的當(dāng)前取值顯示在第1個(gè)地 址的后。

(3)將變量x、y、z分別加入觀察窗口:

在源程序中雙擊變量名,再單擊鼠標(biāo)右鍵,選擇“Add to Watch Window”。這時(shí),這3 個(gè)變量還未作初始化。

(4)單步運(yùn)行2次,在觀察窗中觀察到變量x、y被賦值。變化的值被顯示成紅色。同時(shí) 在“Memory”窗口中也能觀察到x和y值的改變。

(5)再單步運(yùn)行,可觀察到z 的值被計(jì)算出來。雙擊觀察窗口中變量x、y在“Value”欄 中的取值并修改成其他取值,單步運(yùn)行后觀察結(jié)果。

(6)雙擊觀察窗口中變量x、y在“Value”欄中的取值,并修改成0;選擇菜單 Debug->Restart,返回程序起點(diǎn)。

(7)重新單步運(yùn)行程序

7.內(nèi)存映像文件

(1)選擇菜單Project->Build Options…,啟動(dòng)“Build Options”工程設(shè)置對話框。(2)單擊“Linker”屬性頁,在“Map Filename”項(xiàng)中觀察生成的map文件名和路徑。(3)單擊“取消”退出。

8.對照觀察map文件和cmd文件的內(nèi)容(1)選擇菜單File->Open…,將找到

C:ICETEK-F2812-A-EDUlabDSP281x_examplesLab0102-CProgram Debug目錄,將文

件類型改為“Memory Map Files”,選擇CProgram.map文件、打開。(2)打開CProgram.cmd 文件。(3)程序的入口地址:map文件中“ENTRY POINT SYMBOL”中說明了程序入口地址(_c_int00)。(4)內(nèi)存使用情況:

-map文件中“MEMORY CONFIGURATION”標(biāo)明了程序占用RAM 的使用情況,共占 用aaH個(gè)存儲單元。

-觀察map文件中的“SECTION ALLOCATION MAP”段,可以看出CProgram.obj的入 口地址為0x3e801e,這也是main函數(shù)的入口地址。

-用戶堆棧段從400H 開始,程序運(yùn)行到main函數(shù)中后,變量x、y、z 均開設(shè)在棧中。-還能看出程序運(yùn)行都需要調(diào)用rts2800.lib 中的哪些模塊。9.改變內(nèi)存分配 修改cmd文件中的

PAGE 0 : PROG(R): origin = 0x3E8000, length = 0x10000 改為

PAGE 0 : PROG(R): origin = 0x3E9000, length = 0x10000 重新編譯工程,觀察map文件中有何變化。

10.退出CCS 五.注意事項(xiàng)

在重新單步運(yùn)行程序,注意觀察在CPU寄存器窗口中,各寄存器使用情況,觀察哪個(gè) 寄存器參與了運(yùn)算。

六.實(shí)驗(yàn)結(jié)果

1.通過實(shí)驗(yàn)可以發(fā)現(xiàn),修改cmd文件可以安排程序和數(shù)據(jù)在DSP內(nèi)存資源中的分配和位置;map文件中描述了程序和數(shù)據(jù)所占用的實(shí)際尺寸和地址。

2.C語言編制的程序,在經(jīng)過編譯器編譯后,需要連接若干C標(biāo)準(zhǔn)程序輔助運(yùn)行。以下是 運(yùn)行流程:

(1)程序入口為_c_int00,執(zhí)行標(biāo)準(zhǔn)C庫中的程序,負(fù)責(zé)初始化C環(huán)境、申請堆棧、初始化

有初始值的變量等。

(2)程序最終轉(zhuǎn)到用戶編制的主函數(shù)運(yùn)行。(3)程序在主函數(shù)中的無限循環(huán)中持續(xù)運(yùn)行。

七.心得體會(huì)

這次實(shí)驗(yàn)的準(zhǔn)備工作有兩個(gè),分別是仿真和硬件連接,我們組先選擇了仿真的方案。在仿真過程中,按步驟一切都還順利,觀察窗中觀察到變量x、y被賦值。變化的值被顯示成紅色。改變了內(nèi)存分配,觀察到map的變化。但是當(dāng)我們寫入冒泡程序時(shí),但是編譯后發(fā)現(xiàn)了錯(cuò)誤。

實(shí)驗(yàn)完成的不是很好,但是實(shí)驗(yàn)的過程中熟悉了dsp的調(diào)試過程,編程環(huán)境,以及了解了從編程到燒錄的步驟,還是有所收獲。

第三篇:用c語言編寫一個(gè)成績管理系統(tǒng)

程序說明:有N個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包含學(xué)號(不重復(fù))、姓名、三門課的成績及平均成績,試設(shè)計(jì)一學(xué)生成績管理系統(tǒng),使之能提供以下功能:(1)主菜單 學(xué)生成績管理系統(tǒng)

1、成績錄入

2、成績查詢

3、成績統(tǒng)計(jì)

4、退出(2)各菜單項(xiàng)功能 ① 成績錄入:輸入學(xué)生的學(xué)號、姓名及三門課的成績; ② 成績查詢:(至少一種查詢方式)。v 按學(xué)號查詢學(xué)生記錄。v 查詢不及格學(xué)生的記錄。③成績統(tǒng)計(jì): v 計(jì)算學(xué)生的平均分; v 根據(jù)學(xué)生的平均分高低,對學(xué)生的數(shù)據(jù)進(jìn)行排序后輸出; v 對學(xué)生單科成績排序,輸出學(xué)生姓名與該科成績; ④退出系統(tǒng):退出整個(gè)系統(tǒng)(即主菜單)。(3)結(jié)構(gòu)體數(shù)組: #define N 30 struct student {int num;/* 定義學(xué)號*/

char name[20];/* 定義姓名*/

float score[3];/* 定義存貯三門課成績的數(shù)組*/

float average;/* 定義平均成績*/

};struct student stu[N];/* 定義結(jié)構(gòu)體數(shù)組,存貯多個(gè)學(xué)生的記錄*/

.#include

#include

#include

struct student

{ int num;char name[20];

float score[4];

float average;

}

stu[10000];

long t,max;

bool unpass[1000];

FILE *fstu=fopen(“stud.dat”,“at+”);

int init()

{

int no,i;

float s[4],ave;

char nam[20];

while(!feof(fstu))

{

fscanf(fstu,“%d”,&no);

fscanf(fstu,“%s”,nam);

fscanf(fstu,“%f%f%f%f”,&s[1],&s[2],&s[3],&ave);

if(no>max)

max=no;

stu[no].num=no;

strcpy(stu[no].name,nam);

unpass[no]=false;f

or(i=1;i<=3;i++)

{

stu[no].score[i]=s[i];

if(s[i]<60)

unpass[no]=true;

}

stu[no].average=ave;

}

}

int stuinsert()

{

int no,i;

float s[3],sum;

char nam[20],cha;

loop:printf(“請輸入學(xué)生的學(xué)號、姓名及三門課的成績 n”);

scanf(“%d”,&no);scanf(“%s”,nam);

scanf(“%f%f%f/n”,&s[1],&s[2],&s[3]);

if(no>max)

max=no;

stu[no].num=no;

sum=0.0;

strcpy(stu[no].name,nam);

unpass[no]=false;

for(i=1;i<=3;i++)

{

stu[no].score[i]=s[i];

sum=sum+s[i];

if(s[i]<60)

unpass[no]=true;

}

stu[no].average=sum/3.0;

fprintf(fstu,“n”);

fprintf(fstu,“%d %s %f %f %f %fn”,stu[no].num,stu[no].name,stu[no].score[1],stu[no].score[2],stu[no].score[3],stu[no].average);

}

int find(int x)

{

long i,no;

switch(x)

{

case 1:printf(“請輸入學(xué)號:”);

scanf(“%d”,&no);

printf(“%d %s %f %f %f %fn”,stu[no].num,stu[no].name,stu[no].score[1], stu[no].score[2],stu[no].score[3],stu[no].average);

break;

case 2:for(i=1;i<=max;i++)if(unpass[i])printf(“%d %s %f %f %f %fn”,stu[i].num,stu[i].name,stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].average);

break;

}

}

int sort(int x)

{

extern int headprint(int x);

student so[1000];

int i,j,k,n;

switch(x)

{

case 1:for(i=1;i<=max;i++)if(stu[i].num==i)printf(“%d %s %fn”,i,stu[i].name,stu[i].average);

break;

case 2:n=0;

for(i=1;i<=max;i++)

{

j=1;if(stu[i].num==i)

while((so[j].average>stu[i].average)&&(j<=n))

j++;n++;

for(k=n;k>=j;k--)so[k]=so[k-1];so[j]=stu[i];

}

for(i=1;i<=n;i++)

printf(“%d %s %f %f %f %fn”,so[i].num,so[i].name,so[i].score[1],so[i].score[2],so[i].score[3],so[i].average);break;case 3:headprint(4);

}

}

int othersort(int x)

{

extern int headprint(int x);

student so[1000];

int i,j,k,n,q;q=0;

switch(x)

{

case 1:if(q==0)q=1;

case 2:if(q==0)q=2;

case 3:if(q==0)q=3;

n=0;

for(i=1;i<=max;i++)

{

j=1;

if(stu[i].num==i)

while((so[j].score[q]>stu[i].score[q])&&(j<=n))

j++;

n++;

for(k=n;k>=j;k--)

so[k]=so[k-1];

so[j]=stu[i];

}

for(i=1;i<=n;i++)

printf(“%d %s %fn”,so[i].num,so[i].name,so[i].score[q]);

break;

}

}

int select(int x)

{

extern int headprint(int x);

int p;

switch(x)

{

case 1:scanf(“%d”,&p);

switch(p)

{

case 1:stuinsert();

break;

case 2:headprint(2);

break;

case 3:headprint(3);

break;

case 4:t=0;

break;

}

break;

case 2:scanf(“%d”,&p);

find(p);

break;

case 3:scanf(“%d”,&p);

sort(p);

break;

case 4:scanf(“%d”,&p);

othersort(p);

break;

}

}

int headprint(int x)

{

switch(x)

{ case 1:printf(“學(xué)生成績管理系統(tǒng)n”);

printf(“

1、成績錄入n”);printf(“

2、成績查詢n”);

printf(“

3、成績統(tǒng)計(jì)n”);

printf(“

4、退出n”);

select(x);

break;

case 2:printf(“

1、按學(xué)號查詢學(xué)生記錄n”);

printf(“

2、查詢不及格學(xué)生的記錄n”);

select(x);

break;

case 3:printf(“

1、計(jì)算學(xué)生的平均分n”);

printf(“

2、根據(jù)學(xué)生的平均分高低,對學(xué)生的數(shù)據(jù)進(jìn)行排序后輸出n”);

5printf(“

3、對學(xué)生單科成績排序,輸出學(xué)生姓名與該科成績n”);select(x);

break;

case 4:printf(“

1、第一科n”);printf(“

2、第二科n”);printf(“

3、第三科n”);select(x);break;;

}

}

int main()

{ max=0;t=1;

init();

loop:headprint(1);

if(t!=0)

goto loop;

}

第四篇:如何編寫和語言程序解讀

如何編寫和匯編語言程序

可以用普通文本編輯器編輯匯編語言源程序。常用的有 MS-DOS 下的 EDIT 文本編輯程序,Windows 下的寫字板(WORDPAD.EXE)等。用戶通過屏幕編輯程序鍵入源程序,檢查無誤,可將源程序存到匯編系統(tǒng)盤上,該程序的擴(kuò)展名為· ASM。軟件運(yùn)行基本環(huán)境

運(yùn)行匯編程序必備的軟件環(huán)境: DOS 操作系統(tǒng);匯編系統(tǒng)。匯編系統(tǒng)盤應(yīng)包含如下文件: MASM 宏匯編程序文件 LISK 連接程序文件

CRFF 索引程序文件(也可不用)匯編源程序編寫)源程序的書寫格式

當(dāng) CPU 訪問內(nèi)存時(shí),是把存儲器分成若干個(gè)段,通過 4 個(gè)段寄存器中存放的地址對內(nèi)存儲器訪問,因此在編源程序時(shí)必須按段的結(jié)構(gòu)來編制程序。由于每個(gè)段的物理空間為≤ 64KB,所以程序中各段可以分別為一個(gè)或幾個(gè)。源程序的書寫一般有如下形式:

邏輯堆棧段 堆棧段名 SEGMENT STACK 用變量定義預(yù)置的堆棧空間 · ·

堆棧段名 ENDS 邏輯數(shù)據(jù)段 數(shù)據(jù)段名 SEGMENT 用變量定義預(yù)置的數(shù)據(jù)空間 · ·

數(shù)據(jù)段名 ENDS 邏輯代碼段 代碼段名 SEGMENT ASSUME 定義各段尋址關(guān)系 過程名 PROC … 程序 · ·

過程名 ENDP 代碼段名 ENDS END 過程名或起始標(biāo)號

在源程序中最少要有一個(gè)代碼段,數(shù)據(jù)段根據(jù)需要可有可無,也可以增設(shè)附加段。對于堆棧段也可以根據(jù)需要可有可無,但在連接(LINK)時(shí)計(jì)算機(jī)將顯示警告性的錯(cuò)誤: Warning : N STACK segment There was 1 error detected.在程序中如果沒有用到堆棧時(shí),該錯(cuò)誤提示不影響程序的運(yùn)行,如果程序中用到堆棧時(shí)必須設(shè)置堆棧段。其中: SEGMENT、ASSUME、PROC … ENDP 為偽指令,偽指令是發(fā)給匯編程序 ASM 的,而不和微處理器打交道,在匯編時(shí)不產(chǎn)生目標(biāo)代碼,只是把源程序中各段的設(shè)置情況告訴匯編程序。)段寄存器的段地址的裝入

Assume 偽指令語句只是建立了當(dāng)前段與段寄存器的聯(lián)系,但不能把各段的段地址裝入相應(yīng)的段寄存器中,段寄存器的段地址的裝入是在程序中完成的。(1)DS、ES、SS 的裝入

由于段寄存器不能用立即數(shù)尋址方式直接傳送,所以段地址裝入可通過通用寄存器傳送給段寄存器。MOV AX,邏輯段名 MOV 段寄存器,AX 其中邏輯段名為程序中定義各邏輯段的名字,(不包括代碼段),段寄存器是指與各邏輯段相對應(yīng)的各段寄存器(DS、ES、SS)。(2)CS 的裝入

代碼段寄存器是裝當(dāng)前執(zhí)行目標(biāo)代碼的段地址,IP 是提供下一條要執(zhí)行的目標(biāo)代碼的偏移量,為了保證程序的正確執(zhí)行,CS 和 IP 裝入新值時(shí)是一起完成的。對 CS 和 IP 的裝入有如下幾種情況:

①根據(jù)用戶程序中的偽指令 END 后的標(biāo)號為 CS 和 IP 提供代碼段的段地址和目標(biāo)代碼的偏移地址。

②在程序運(yùn)行過程中,當(dāng)執(zhí)行某些指令和操作時(shí),CPU 自動(dòng)修改 CS 和 IP 的值,使它們指向新的代碼段。)程序中的數(shù)據(jù)與變量

在匯編源程序中的數(shù)據(jù)除了立即數(shù),由指令產(chǎn)生的數(shù)和通過鍵盤輸入的數(shù)以外,還胡大量的數(shù)據(jù)是通過偽指令語句進(jìn)行預(yù)置和分配的,也就是在某邏輯段中(除代碼段),將所需的數(shù)據(jù)以某種形式存放起來,在程序中可任意調(diào)用。在數(shù)據(jù)定義的同時(shí)還可以定義變量,將變量與數(shù)據(jù)結(jié)合在一起。可以為某個(gè)變量分配存儲空間以便在程序執(zhí)行過程中存放中間結(jié)果和最終結(jié)果,使用起來極為方便。

(1)變量與數(shù)據(jù)的定義

變量與數(shù)據(jù)的定義可以通過符號定義偽指令 EQU、=和數(shù)據(jù)定義偽指令 DB 或 DW 或 DD 來實(shí)現(xiàn)。EQU 和=可以出現(xiàn)在程序的邏輯段內(nèi)也可出現(xiàn)在邏輯段外。

(2)匯編程序中數(shù)據(jù)的提供方法 ①用數(shù)據(jù)定義偽指令提供數(shù)據(jù)

如果程序要求原始數(shù)據(jù)為一批數(shù)據(jù)時(shí),用數(shù)據(jù)定義偽指令 DB、DW 和 DD 來提供較為方便。②用立即數(shù)的形式提供數(shù)據(jù)

當(dāng)原始數(shù)據(jù)只有幾個(gè)時(shí),一般用立即數(shù)的方法來提供。當(dāng)然,用立即數(shù)的方法只是將一個(gè)數(shù)據(jù)傳送到通用寄存器中,它只是通過通用寄存器傳送數(shù)據(jù)。③用編程的方法提供數(shù)據(jù)

假如原始數(shù)據(jù)是一組有規(guī)律的數(shù)據(jù)項(xiàng),則用編程序的方法形成這一組數(shù)據(jù),不用專門為這組數(shù)據(jù)分配存儲單元,節(jié)省了存儲空間。④用鍵盤提供數(shù)據(jù)

當(dāng)原始數(shù)據(jù)為任意數(shù)據(jù)時(shí),一般用鍵盤輸入方法,調(diào)用 DOS 21H 中斷。

(3)數(shù)據(jù)的輸出方式 ①在顯示器上顯示一個(gè)字符

調(diào)用 02H 號功能調(diào)用號,發(fā) 21H 號中斷,將要顯示的字符的 ASCII 碼送入 DL,就可在顯示器上顯示該字符。②在打印機(jī)上輸出一個(gè)字符

調(diào)用 05H 號功能調(diào)用號,發(fā) 21H 號中斷,將要打印字符的 ASCII 碼送入 DL,就可在打印機(jī)上打印出 DL 中的字符。

4)返回 DOS 狀態(tài)的方法

當(dāng)執(zhí)行.EXE 文件時(shí),是在 DOS 狀態(tài)下進(jìn)行的,如果希望在執(zhí)行完.EXE 文件后正常返回 DOS 狀態(tài),一般用如下兩種方法:采用 DOS 4CH 功能調(diào)用和采用返回(RET)斷點(diǎn)的方法。

匯編處理 — 執(zhí)行宏匯編程序 MASM.EXE

用匯編語言編寫的源程序必須是一個(gè)完整的源程序。宏匯編程序?qū)R編語言源程序的匯編過程包括語法檢查和數(shù)據(jù)代碼匯編兩部分,生成目標(biāo)程序和輔助信息文件。為了完成匯編任務(wù),匯編程序一般采用兩遍掃描的方法,第一遍掃描源程序產(chǎn)生符號表、處理偽指令等,第二遍掃描產(chǎn)生機(jī)器指令代碼、確定數(shù)據(jù)等。源程序用宏匯編程序翻譯(匯編)后,可以得到三個(gè)文件:一個(gè)是擴(kuò)展名為.OBJ 的目標(biāo)文件,在該文件中,將源程序的操作碼部分變?yōu)闄C(jī)器碼,但地址操作數(shù)是可浮動(dòng)的相對地址,而不是實(shí)際地址,因此需經(jīng) LINK 連接文件進(jìn)行連接才能形成可執(zhí)行文件。第二個(gè)文件是列表文件,擴(kuò)展名為.LST,它把源程序和目標(biāo)程序列表,以供檢查程序用。第三個(gè)文件是交叉索引文件,擴(kuò)展名為.CRF,它是一個(gè)對源程序所用的各種符號進(jìn)行前后對照的文件。其中目標(biāo)文件是必須產(chǎn)生的,而其它兩個(gè)文件在需要時(shí)給予命令就可產(chǎn)生,對連接和執(zhí)行匯編程序無直接的關(guān)系。)匯編操作過程

在 DOS 狀態(tài)下,鍵入 MASM ↓則調(diào)入宏匯編程序,屏幕顯示與操作如下: masm ↓ Microsoft(R)Macro Assemble Version 5.00 Copyright(C)Microsoft Corp 1981-1985,1987,All right reserved.Source filename [.ASM ]: MYFILE ↓ Object filename [MYFILE.OBJ ]: MYFILE ↓ Source listing [NUL.LST ]: MYFILE ↓ Cross-reference [NUL.CRF]: MYFILE ↓ 50678 + 410090 Bytes symbol space free 0 Warning Errors 0 Severe Errors 其中劃線部分為用戶鍵入部分,MYFILE 為源程序名(MYFILE.ASM),方括號中是機(jī)器規(guī)定的默認(rèn)文件名,如果用戶認(rèn)為方括號內(nèi)的文件名就是要鍵入的文件名,則可只在劃線部分鍵入回車符。如果不想要列表文件和交叉索引文件,則可在 [NUL.LST ] 和 [NUL.CRF] 后不鍵入文件名只鍵入回車符。

當(dāng)回答完上述四個(gè)詢問后,匯編程序就對源程序進(jìn)行匯編。在匯編過程中,如果發(fā)現(xiàn)源程序中有語法錯(cuò)誤,則提示出錯(cuò)信息,指出是什么性質(zhì)的錯(cuò)誤,錯(cuò)誤類型,最后列出錯(cuò)誤的總數(shù)。之后可重新進(jìn)入屏幕編輯狀態(tài),調(diào)入源程序(MYFILE.ASM)進(jìn)行修改,修改完畢,再進(jìn)行匯編,直到匯編通過為止。

如果在匯編時(shí)不需要產(chǎn)生列表文件(.LST)和交叉索引文件(.CRF),調(diào)用匯編程序時(shí)可用分號結(jié)束。如果需要產(chǎn)生.OBJ 和.LST 文件,不需要.CRF 文件,則在分號前面加兩個(gè)逗號即可。如果 4 個(gè)文件都需要,用簡便的操作方法是在分號前用了 3 個(gè)逗號。)列表文件(.LST)

列表文件(.LST)是通過匯編程序(MASM)產(chǎn)生的,可以在 DOS 狀態(tài)下用 TYPE 命令顯示或打印該文件,以便分析調(diào)試源程序。如顯示 D 盤上已存在的列表文件 MYFILE.LST 操作方法如下: D> TYPE MYFILE.LST ;↓ 列表程序由三部分組成:(1)源程序和目標(biāo)程序清單

列表程序同時(shí)列出源程序和對應(yīng)的機(jī)器語言清單。列表程序的第一列給出每條指令所在行號;第二列給出從段的首地址開始的每條指令存放的偏移地址;接著是數(shù)字列,給出對應(yīng)每條語句的機(jī)器碼和對應(yīng)于存放在棧段和數(shù)據(jù)段的值,在機(jī)器碼加上“ R ”的指令表示:這條指令在連接時(shí)可能產(chǎn)生與列出來的偏移地址不同的地址,因?yàn)檫@些偏移地址可能與其它模塊有關(guān);最右邊就是用匯編語言編寫的源程序。(2)段信息匯總表

在段信息匯總表中列出該程序用了哪幾個(gè)段,如:代碼段 CODE、數(shù)據(jù)段 DATA 和堆棧段 STACK ;每個(gè)段所占存儲空間的長度(字節(jié)數(shù));每個(gè)段的定位類型,包括 PAGE(頁)、PARA(節(jié))、WORD(字)和 BYTE(字節(jié)),它們表示此段的起始邊界要求,即起始邊界地址應(yīng)分別可以被 256、16、2 和 1 除盡。該列表清單 中是以 PARA 為 CODE 段、DATA 段和 STACK 段的起始邊界地址。最后一列為段的組合類型;段的組合類型是告訴連接程序,本段與其它段的關(guān)系,組合類型有 NONE、PUBLIC、COMMOM、AT 表達(dá)式、STACK 和 MEMORY。NONE :表示本段與其它段不發(fā)生邏輯關(guān)系,即每段都有自己的基本地址。是隱含組合類型。

STACK :表明連接程序首先要把本段與同名同類別的其它段相鄰地連接在一起,然后為所有定義為棧段的連接在一起的段,定義一個(gè)共同的段基地址,即連接成一個(gè)物理段。

在列表程序的源程序中只有一個(gè)棧段,在棧段定義中給出了組合類型為 STACK,因此在段信息匯總表中列出了該項(xiàng),在本程序中它沒有任何意義,因?yàn)闆]有其它棧段與它連接,只是為了說明這個(gè)問題而設(shè)置的。(3)符號匯總表

在列表程序中最后部分列出了符號匯總,是指在源程序中用戶定義的符號名、類型、值和所在段。

如果在源程序中存在某些語法錯(cuò)誤時(shí),列表文件可提示某條語句有哪些錯(cuò)誤,出錯(cuò)提示顯示在出錯(cuò)指令行的下面,因此用戶可借助列表文件很快地找到錯(cuò)誤行,以便調(diào)試。另外由于列表文件給出了各條指令的偏移地址,對和程序時(shí)設(shè)置斷點(diǎn)很方便。)交叉索引文件(.CRF)

匯編后產(chǎn)生的交叉索引文件,擴(kuò)展名為.CRF, 它列出了源程序中定義的符號(包括:標(biāo)號、變量等)和程序中引用這些符號的情況。如果要查看這個(gè)符號表,必須使用 CREF.EXE 的文件,它根據(jù).CRF 文件建立一個(gè)擴(kuò)展名為.REF 的文件,而后再用 DOS 的 TYPE 命令顯示,就可以看到這個(gè)符號使用情況表。具體操作方法如下: D> CREF ↓

cref filename [.CRF] : MYFILE ↓ list filename [MYFILE.REF] : ↓ D> TYPE MYFILE.REF ↓

目標(biāo)代碼鏈接程序----LINK.EXE

用匯編語言編寫的源程序經(jīng)過匯編程序(MASM)匯編后產(chǎn)生了目標(biāo)程序(.OBJ),該文件是將源程序操作碼部分變成了機(jī)器碼,但地址是可浮動(dòng)的相對地址(邏輯地址),因此必須經(jīng)過連接程序 LINK 連接后才能運(yùn)行。連接程序 LINK 是把一個(gè)或多個(gè)獨(dú)立的目標(biāo)程序模塊裝配成一個(gè)可重定位的可執(zhí)行文件,擴(kuò)展名為.EXE 文件。此外還可以產(chǎn)生一個(gè)內(nèi)存映象文件,擴(kuò)展名為.MAP。1)連接程序執(zhí)行過程

在 DOS 狀態(tài)下,鍵入 LINK ↓(或 LINK MYFILE ↓)則系統(tǒng)調(diào)入 LINK 程序,屏幕顯示操作如下: D> LINK ↓

IBM Personal Computer Linker Version 2.00(C)Copyright IBM Corp 1981,1982,1983 Object Modules [.OBJ] : MYFILE ↓ Run File [MYFILE.EXE] : MYFILE ↓ List File [NUL.MAP] : MYFILE ↓ Libraries [.LIB] : ↓

其中劃線部分為用戶鍵入部分,MYFILE 為源程序名,方括號內(nèi)為機(jī)器默認(rèn)文件名,當(dāng)用戶認(rèn)為方括號中的文件名就是要鍵入的文件名時(shí),可在冒號后面只鍵入回車。

其中 MAP 文件是否需要建立,由用戶決定,需要?jiǎng)t鍵入文件名,不需要?jiǎng)t直接送入一個(gè)回車鍵。

最后一個(gè)詢問是問是否在連接時(shí)用到庫文件,對于連接匯編語言源程序的目標(biāo)文件,通常是不需要的,因此直接鍵入回車鍵。

與匯編程序一樣,可以在連接時(shí)用分號結(jié)束后續(xù)詢問。例如:

D> LINK MYFILE ;↓

IBM Personal Computer Linker Version 2.00(C)Copyright IBM Corp 1981,1982,1983 連接后只產(chǎn)生 MYFILE.EXE 文件。如果除 MYFILE.EXE 文件外還要產(chǎn)生 MYFILE.MAP 文件,則在分號前加兩個(gè)逗號。D> LINK MYFILE,;↓ IBM Personal Computer Linker Version 2.00(C)Copyright IBM Corp 1981,1982,1983 2)內(nèi)存映象文件(.MAP)

由連接程序 LINK 產(chǎn)生的擴(kuò)展名為.MAP 文件,它實(shí)際上是連接程序的列表文件,它給出了每個(gè)段的地址分配情況及長度。

在 DOS 狀態(tài)下,用 TYPE 命令顯示打印出來。例如: D> TYPE MYFILE.MAP ↓ Start Stop Length Name Class 00000H 0000FH 0010H DATA 00010H 0004FH 0040H STACK 00050H 0005FH 0010H CODE Origin Group Program entry point at 0005:0000 從中可以看到,源程序 MYFILE 中定義了三個(gè)段:數(shù)據(jù)段(DATA)起始地址為 00000H,終止地址為 0000FH,長度為 0010H 個(gè)字節(jié);堆棧段(STACK)起始地址為 00010H,終止地址為 0004FH,長度為 0040H 個(gè)字節(jié);代碼段(CODE)起始地址為 00050H,終止地址為 0005FH,長度為 0010H 個(gè)字節(jié)。

應(yīng)用程序執(zhí)行

當(dāng)用連接程序 LINK 將目標(biāo)程序(.OBJ)連接定位后,可產(chǎn)生可執(zhí)行的應(yīng)用程序文件(.EXE),可以在 DOS 狀態(tài)下執(zhí)行該程序。執(zhí)行操作如下: D> MYFILE ↓ 或 D> MYFILE.EXE ↓

在源程序 MYFILE 中如果有顯示結(jié)果的指令,則在執(zhí)行程序后可以看到執(zhí)行結(jié)果;如需要?jiǎng)討B(tài)調(diào)試應(yīng)用程序 MYFILE.EXE,則可以借助動(dòng)態(tài)調(diào)試程序 DEBUG.COM 來進(jìn)行調(diào)試、運(yùn)行,DEBUG 是一種支持命令行方式的匯編語言編程調(diào)試工具。

動(dòng)態(tài)調(diào)試程序 DEBUG.COM 在編寫和運(yùn)行匯編程序的過程中,會(huì)遇到一些錯(cuò)誤和問題,需要對程序進(jìn)行分析和調(diào)試,調(diào)試程序 DEBUG 就是專為匯編語言設(shè)計(jì)的一種調(diào)試工具。它在調(diào)試匯編語言程序時(shí)有很強(qiáng)的功能,能使程序設(shè)計(jì)者接觸到機(jī)器內(nèi)部,能觀察和修改寄存器和存儲單元內(nèi)容,并能監(jiān)視目標(biāo)程序的執(zhí)行情況,使用戶真正接觸到 CPU 內(nèi)部,與計(jì)算機(jī)產(chǎn)生最緊密的工作聯(lián)系。

動(dòng)態(tài)和程序 DEBUG 的主要特點(diǎn) DEBUG 的執(zhí)行 DEBUG 命令格式 主要 DEBUG 命令

動(dòng)態(tài)和程序 DEBUG 的主要特點(diǎn))能夠在最小環(huán)境下運(yùn)行匯編程序

在 DOS 狀態(tài)下運(yùn)行匯編程序,必須將程序經(jīng)過 MASM 匯編程序,而后還要經(jīng)過 LINK 連接程序產(chǎn)生可執(zhí)行程序,才能最終運(yùn)行,比較麻煩。在 DEBUG 狀態(tài)下,為用戶提供了調(diào)試、控制測試的環(huán)境,可以在此環(huán)境下進(jìn)行編程、調(diào)試、監(jiān)督、執(zhí)行用戶編寫的匯編程序。因此調(diào)試周期短,為用戶提供了極大的方便。2)提供極簡單的修改手段

DEBUG 提供了修改命令,可以修改內(nèi)存單元內(nèi)容,修改寄存器的內(nèi)容,為調(diào)試程序、修改程序帶來了方便。3)提供用戶與計(jì)算機(jī)內(nèi)部聯(lián)系的窗口

DEBUG 具有顯示命令,它既可以使用戶看到某內(nèi)存單元或某一塊單元內(nèi)容,也可以看到 CPU 內(nèi)部各寄存器的內(nèi)容。用單步執(zhí)行命令實(shí)現(xiàn)跟蹤執(zhí)行,每執(zhí)行一步都使用戶看到各寄存器的內(nèi)容的變化,以便分析和調(diào)整程序。4)可裝入、修改或顯示任何文件

當(dāng)然在 DEBUG 狀態(tài)下運(yùn)行匯編程序也具有一定局限性。在 DEBUG 狀態(tài)下運(yùn)行的程序不能使用宏匯編程序中的宏指令,大部分偽指令也不能使用,因此只能把程序分段調(diào)試。此外,不能調(diào)試太長的程序,只能分塊進(jìn)行中程序設(shè)計(jì)。在 DEBUG 狀態(tài)下調(diào)試好的程序不能形成可執(zhí)行文件(.EXE),因此調(diào)試好的程序只能記下,到編輯環(huán)境下重新鍵入調(diào)試好的程序,通過匯編程序(如 MASM),再通過連接程序(LINK)形成可執(zhí)行文件(.EXE)。

DEBUG 的執(zhí)行

在操作系統(tǒng)(DOS 或 WIndows)命令行方式下,直接調(diào)入 DEBUG 程序,鍵入命令的格式如下: D>DEBUG [d:][Path][filename[.ext]][Parm1][Parm2] 其中 [] 的內(nèi)容為可選項(xiàng),可以有也可以缺省。

[d:] 為驅(qū)動(dòng)器號,指要調(diào)入 DEBUG 狀態(tài)的可執(zhí)行文件在哪個(gè)驅(qū)動(dòng)器中,如 A:、B:、C: 等。[Path] 為路徑,指要調(diào)入 DEBUG 狀態(tài)的可執(zhí)行文件是在哪個(gè)目錄下或子目錄下。

[filename[.ext]],指要調(diào)入 DEBUG 狀態(tài)下的可執(zhí)行文件的文件名,該文件可以是通過編輯、匯編、連接后產(chǎn)生的可執(zhí)行文件,也可以是在 DEBUG 狀態(tài)下匯編的程序 段,通過寫盤命令 W 寫入磁盤的文件。[Parm1][Parm2] 為任選參數(shù),是給定文件的說明參數(shù)。

在啟動(dòng) DEBUG 時(shí),如果輸入 filename(文件名),則 DEBUG 程序把指定文件裝入內(nèi)存,用戶可以通過 DEBUG 的命令對指定文件進(jìn)行修改、顯示或執(zhí)行。如果沒有文件名,則是以當(dāng)前內(nèi)存的內(nèi)容工作,或者用命名命令或裝入命令把需要的文件裝入內(nèi)存,然后再通過 DEBUG 命令進(jìn)行修改、顯示或執(zhí)行。當(dāng)啟動(dòng) DEBUG 程序后,屏幕上出現(xiàn)“—”,說明系統(tǒng)已進(jìn)入 DEBUG 狀態(tài)。DEBUG 命令格式(1)DEBUG 命令都是一個(gè)英文字母,后面跟著一個(gè)或多個(gè)有關(guān)參數(shù)。多個(gè)操作參數(shù)之間用“ , ”或空格隔開。(2)DEBUG 命令必須接著按 ENTER 鍵,命令才有效。

(3)參數(shù)中不論是地址還是數(shù)據(jù),均用十六進(jìn)制數(shù)表示,但十六進(jìn)制數(shù)據(jù)后面不要用“ H ”。(4)可以用 Ctrl 和 Break 鍵來停止一個(gè)命令的執(zhí)行,返回到 DEBUG 的提示符“—”下。(5)用 Ctrl - Num Lock 鍵中止正在上卷的輸出行,再通過按任意鍵繼續(xù)輸出信息。主要 DEBUG 命令

(1)匯編命令 A

格式: a.A [ 段寄存器名 ]:[ 偏移地址 ] b.A [ 段地址 ]:[ 偏移地址 ] c.A [ 偏移地址 ] d.A 功能:用該命令可以將匯編語言程序直接匯編進(jìn)入內(nèi)存。

當(dāng)鍵入 A 命令后,顯示段地址和偏移地址等待用戶鍵入?yún)R編指令,每鍵入一條匯編指令回車后,自動(dòng)顯示下一條指令的段地址和偏移地址,再鍵入下一條匯編指令,直到匯編語言程序全部鍵入,又顯示下一地址時(shí)可直接鍵入回車返回到提示符“-”為止。

其中 a 的段地址在段地址寄存器中,因此在使用該命令時(shí)必須將段地址寄存器送入段地址,c 的地址在 CS 中,d 的段地址在 CS 中,偏移地址為 100H。

(2)顯示內(nèi)存命令 D 格式: a.D [ 地址 ] b.D [ 地址范圍 ] c.D 功能:顯示指定內(nèi)存范圍的內(nèi)容。

顯示的內(nèi)容為兩種形式:一種為十六進(jìn)制內(nèi)容,一種為與十六進(jìn)制相對應(yīng)的 ASCII 碼字符,對不可見字符以“·”代替。

對于 a、c 每次顯示 128 個(gè)字節(jié)內(nèi)容,b 顯示的字節(jié)數(shù)由地址范圍來決定。

若命令中有地址,則顯示的內(nèi)容從指定地址開始,若中中無地址(如 c)則從上一個(gè) D 命令所顯示的最后一個(gè)單元的下一個(gè)單元開始。若以前沒有使用過 D 命令,則以 DEBUG 初始化的段寄存器的內(nèi)容為起始段地址,起始偏移地址為 100H,即 CS:100。

對于 a 中的地址為偏移地址,段地址為 CS 的內(nèi)容,對 b 中的地址范圍,可以指定段地址和起始偏移地址和終止偏移地址。

(3)修改存儲單元內(nèi)容命令 E 格式: a · E [ 地址 ] [ 內(nèi)容表 ] b · E [ 地址 ] 功能: a ·用命令所給定的內(nèi)容表去代替指定地址范圍的內(nèi)存單元內(nèi)容。b ·一個(gè)單元一個(gè)單元地連續(xù)修改單元內(nèi)容。

其中:內(nèi)容表為一個(gè)十六進(jìn)制數(shù),也可以是用單引號括起的一串字符。

(4)填充內(nèi)存命令 F

格式: F [ 范圍 ][ 單元內(nèi)容表 ] 功能:將單元內(nèi)容表中的內(nèi)容重復(fù)裝入內(nèi)存的指定范圍內(nèi)。

(5)內(nèi)存搬家命令 M

格式: M [ 源地址范圍 ][ 目標(biāo)起始地址 ] 其中源地址范圍和目的起始地址為偏移地址,段地址為 DS 的內(nèi)容。功能:把源地址范圍的內(nèi)容搬至以目標(biāo)起始地址開始的存儲單元中。

(6)比較命令 C

格式: C [ 源地址范圍 ],[ 目標(biāo)地址 ] 其中源地址范圍是由起始地址和終止地址指出的一片連續(xù)的存儲單元,目標(biāo)地址為與源地址所指單元對比的目標(biāo)地址起始地址。功能:從源地址范圍是由起始的地址單元開始逐個(gè)與目標(biāo)起始地址往后的單元順序比較每個(gè)單元內(nèi)容,比較到源終止地址為止。比較結(jié)果如果一致則不顯示任何信息,如果不一致,則以 [ 源地址 ][ 源內(nèi)容 ][ 目的內(nèi)容 ][ 目的地址 ] 的形式顯示失敗單元地址及內(nèi)容。

(7)搜索指定內(nèi)容命令 S 格式: S [ 地址范圍 ][ 表 ] 功能:在指定地址范圍內(nèi)搜索表中內(nèi)容,搜索到就顯示表中元素所在地址。

(8)檢查和修改寄存器內(nèi)容命令 R 格式: a · R b · R [ 寄存器名 ] 功能: a ·顯示 CPU 內(nèi)部所有寄存器的內(nèi)容和全部標(biāo)志位的狀態(tài)。b ·顯示和修改一個(gè)指定寄定器的內(nèi)容和標(biāo)志位的狀態(tài)。

其中對狀態(tài)標(biāo)志寄存器 FLAG 以位的形式顯示,顯示時(shí),8 個(gè)狀態(tài)標(biāo)志的顯示次序和符號如表 B - 1 所示。表 B - 1 狀態(tài)標(biāo)志顯示形式

標(biāo) 志 位 溢出標(biāo)志 OF 方向標(biāo)志 DF 中斷標(biāo)志 IF 符號標(biāo)志 SF 零標(biāo)志 ZF 輔助進(jìn)位 AF 奇偶標(biāo)志 PF 進(jìn)位標(biāo)志 CF

(9)跟蹤與顯示命令 T

格式: a · T[ =地址 ] 或 T [ 地址 ] b · T[ =地址 ][ 條數(shù) ] 或 T [ 地址 ][ 條數(shù) ] 功能: a ·執(zhí)行一條指定地址處的指令,停下來,顯示 CPU 所有寄存器內(nèi)容和全部標(biāo)志位的狀態(tài),以及下一條指令的地址和內(nèi)容。

b ·為多條跟蹤命令,從指定地址開始;若命令中用 [ 地址 ] 給定了起始地址,則從起始地址開始,若未給定,則從當(dāng)前地址(CS:IP)開始,執(zhí)行命令中的 [ 條數(shù) ] 決定一共跟蹤幾條指令后返回 DEBUG 狀態(tài)。

(10)反匯編命令 U 格式: a · U [ 地址 ] b · U [ 地址范圍 ] 功能:將指定范圍內(nèi)的代碼以匯編 語言形式顯示,同時(shí)顯示該代碼位于內(nèi)存的地址和機(jī)器。

若在命令中沒有指定地址則以上一個(gè) U 命令的最后一條指令地址的下一個(gè)單元作為起始地址;若沒有輸入過 U 命令,則以 DEBUG 初始化段寄存器的值作為段地址,以 0100H 作為偏移地址。

(11)命名命令 N 格式: N 文件名

功能:在調(diào)用 DEBUG 時(shí),沒有文件名,則需要用 N 命令將要調(diào)用的文件名格式化到 CS:5CH 的文件控制塊中,才能用 L 命令把它調(diào)入內(nèi)存進(jìn)行調(diào)試(其它形式參考 DOS 手冊)。

(12)讀盤命令 L

格式: a · L [ 地址 ][ 驅(qū)動(dòng)器號 ][ 起始扇區(qū)號 ][ 所讀扇區(qū)個(gè)數(shù) ] b · L [ 地址 ] c · L 功能: a ·把指定驅(qū)動(dòng)器和指定扇區(qū)范圍的內(nèi)容讀到內(nèi)存的指定區(qū)域中。其中地址是讀入內(nèi)存的起始地址,當(dāng)輸入時(shí)沒有給定地址,則隱含地址為 CS:100H。起始扇區(qū)號指邏輯扇區(qū)號的起始位置。所讀扇區(qū)個(gè)數(shù)是指從起始扇區(qū)號開始讀到內(nèi)存幾個(gè)扇區(qū)的內(nèi)容。驅(qū)動(dòng)器號為 0 或 1,0 表示 A 盤,1 表示 B 盤。

b ·讀入已在 CS:5CH 中格式化的文件控制塊所指定的文件。在使用該命令前用 N 命令命名即可將要讀入的文件名格式化到 CS:5CH 的文件控制塊中,其中地址為內(nèi)存地址。

狀 態(tài) 有 / 無 增 / 減 開 / 關(guān) 負(fù) / 正 零 / 非 有 / 無 偶 / 奇 有 / 無

顯示形式(置位 / 復(fù)位)

OV/NV DN/UP EI/DI NG/PL ZR/NZ AC/NA PE/PO CY/NC c ·同 b ·地址隱含在 CS : 100H 中。

當(dāng)讀入的文件有擴(kuò)展名.COM 或.EXE,則始終裝入 CS:100H 中,命令中指定了地址也沒用。其中 BX 和 CX 中存放所讀文件的字節(jié)數(shù)。

(13)寫盤命令 W

格式: a · W[ 地址 ][ 驅(qū)動(dòng)器號 ][ 起始扇區(qū)號 ][ 所寫扇區(qū)個(gè)數(shù) ] b · W[ 地址 ] c · W 功能: a · 把在 DEBUGU 狀態(tài)下調(diào)試的程序或數(shù)據(jù)寫入指定的驅(qū)動(dòng)器中 , 起始扇區(qū)號 , 所寫扇區(qū)個(gè)數(shù)為要占盤中幾個(gè)扇區(qū)。

寫盤指定扇區(qū)的操作應(yīng)十分小心,如有差錯(cuò)將會(huì)破壞盤上的原有內(nèi)容。如果在命令行中的地址只包含偏移地址,W 命令認(rèn)為段地址在 CS 中。

b ·當(dāng)鍵入不帶參數(shù)的寫盤命令時(shí),(或只鍵入地址參數(shù)的寫盤命令),寫盤命令把文件寫到軟盤上。該文件在用 W 命令之前用命名命令 N 將文件格式化在 CS:5CH 的文件控制塊中。c ·只有 W 命令以前而沒有任何參數(shù)時(shí),與 N 配合使用進(jìn)行寫盤操作。在用 W 命令以前在 BX 和 CX 中應(yīng)寫入文件的字節(jié)數(shù)。

(15)輸出命令 O

格式: O[ 端口地址 ] [ 字節(jié)值 ] 功能:向指定端口地址輸出一個(gè)字節(jié)。

(16)運(yùn)行命令 G

格式: G [ =地址 ][ 地址 [ 地址… ]] 功能:執(zhí)行用戶正在調(diào)試的程序。

其中地址為執(zhí)行的起始地址,以 CS 中內(nèi)容作為段地址,以等號后面的地址為偏移地址。再后面的地址為斷點(diǎn)地址。在命令行中只有起始地址,沒有斷點(diǎn)地址,則程序在執(zhí)行時(shí)不中斷。DEBUG 規(guī)定最多設(shè)置 10 個(gè)斷點(diǎn)地址。設(shè)置多個(gè)斷點(diǎn)用于調(diào)試較大的程序,即程序中有多個(gè)模塊、多個(gè)通路時(shí)用,比較方便,在執(zhí)行時(shí)不論走哪條通路,程序都可以在斷點(diǎn)處停下來,以便調(diào)整程序。

斷點(diǎn)地址為程序中斷處的偏移地址,段地址在 CS 中。

當(dāng)執(zhí)行在 DEBUG 狀態(tài)下匯編的小段程序時(shí),只用 G 命令即可。

(17)十六進(jìn)制運(yùn)算命令 H 格式: H 數(shù)據(jù) 1 數(shù)據(jù) 2 其中數(shù)據(jù) 1 和數(shù)據(jù) 2 為十六進(jìn)制數(shù)據(jù)。

功能:將兩個(gè)十六進(jìn)制數(shù)進(jìn)行相加、減,結(jié)果顯示在屏幕上。(18)結(jié)束 DEBUG 返回到 DOS 命令 Q 格式: Q 功能:程序調(diào)試完退出 DEBUG 狀態(tài),返回到 DOS 狀態(tài)下。

Q 命令不能把內(nèi)存的文件存盤,要想存盤必須在退出 DEBUG 之前用 W 命令寫盤

讀書的好處

1、行萬里路,讀萬卷書。

2、書山有路勤為徑,學(xué)海無涯苦作舟。

3、讀書破萬卷,下筆如有神。

4、我所學(xué)到的任何有價(jià)值的知識都是由自學(xué)中得來的。——達(dá)爾文

5、少壯不努力,老大徒悲傷。

6、黑發(fā)不知勤學(xué)早,白首方悔讀書遲。——顏真卿

7、寶劍鋒從磨礪出,梅花香自苦寒來。

8、讀書要三到:心到、眼到、口到

9、玉不琢、不成器,人不學(xué)、不知義。

10、一日無書,百事荒廢。——陳壽

11、書是人類進(jìn)步的階梯。

12、一日不讀口生,一日不寫手生。

13、我撲在書上,就像饑餓的人撲在面包上。——高爾基

14、書到用時(shí)方恨少、事非經(jīng)過不知難。——陸游

15、讀一本好書,就如同和一個(gè)高尚的人在交談——歌德

16、讀一切好書,就是和許多高尚的人談話。——笛卡兒

17、學(xué)習(xí)永遠(yuǎn)不晚。——高爾基

18、少而好學(xué),如日出之陽;壯而好學(xué),如日中之光;志而好學(xué),如炳燭之光。——?jiǎng)⑾?/p>

19、學(xué)而不思則惘,思而不學(xué)則殆。——孔子

20、讀書給人以快樂、給人以光彩、給人以才干。——培根

第五篇:C語言編寫俄羅斯方塊論文

俄羅斯方塊

學(xué) 號:

班 級:

姓 名:

指導(dǎo)教師:

完成日期:2012年5月

1.引言..............................................................................................................................................1

1.1開發(fā)工具............................................................................................................................1 1.1.1 C是中級預(yù)言......................................................................................................1

1.1.2 C是結(jié)構(gòu)化語言..................................................................................................1 1.1.3 C語言功能齊全..................................................................................................1 1.1.4 C語言可移植性好..............................................................................................1 游戲設(shè)計(jì)......................................................................................................................................2

2.1游戲設(shè)計(jì)要求....................................................................................................................2

2.1.1.設(shè)計(jì)題目:俄羅斯方塊游戲.............................................................................2

2.1.2.設(shè)計(jì)內(nèi)容:.........................................................................................................2 2.1.3.功能模塊劃分:.................................................................................................2 2.2 游戲設(shè)計(jì)思想...................................................................................................................2

2.2.1游戲界面:............................................................................................................2 2.2.2 設(shè)計(jì)思路.......................................................................................................................2 2.3:游戲功能......................................................................................................................3 2.3.1:開始部分...........................................................................................................3

2.3.2.運(yùn)行部分...............................................................................................................3

3.實(shí)驗(yàn)總結(jié):..................................................................................................................................4

3.1 開發(fā)背景與需求分析.......................................................................................................4 3.2 系統(tǒng)功能介紹...................................................................................................................4 4.核心代碼:................................................................................................................................8 總結(jié)................................................................................................................................................21 參考文獻(xiàn):....................................................................................................................................22

基于C語言的俄羅斯方塊游戲

[摘要]:俄羅斯方塊是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲。俄羅斯方塊的基本規(guī)則是移動(dòng)、旋轉(zhuǎn)和擺放游戲自動(dòng)輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。由于上手簡單、老少皆宜,從而家喻戶曉,風(fēng)靡世界。[關(guān)鍵詞]:C語言;心得體會(huì);影響

1.引言 隨著社會(huì)的發(fā)展,人們生活的步調(diào)日益加快,越來越多的人加入了全球化的世界.人們不在拘泥于一小塊天地.加班,出差成了現(xiàn)代人不可避免的公務(wù).而此時(shí)一款可以隨時(shí)隨地娛樂的游戲成了必需品.在手機(jī)和電腦成為人們?nèi)沼闷返纳鐣?huì),一款能在其上能便捷運(yùn)行的游戲成為買家的參考點(diǎn).現(xiàn)在我們所要設(shè)計(jì)的這一款基于C語言的游戲——貪吃蛇,就是滿足以上要求而設(shè)計(jì)出來的,希望能給玩家?guī)韸蕵?貪吃蛇這一游戲簡單易行,操作方便,娛樂性較強(qiáng),吸引了不少人.這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻起樂無窮,在人們不斷追求更多的欲望下,該游戲給人們帶來了追逐的快感,以及成功后的滿足感,對于一直處于高壓下的現(xiàn)代人是很好的放松工具.1.1開發(fā)工具

《C/C++程序設(shè)計(jì)學(xué)習(xí)與試驗(yàn)系統(tǒng)》

該系統(tǒng)繼承了Turbo C2.0/C++3.0、GCC、Visua C++6.0這四種常見的編譯器,可以很好滿足目前主流的C語言教材的實(shí)驗(yàn)需求。

C語言具有下列特點(diǎn):

1.1.1 C是中級預(yù)言

它把高級語言的基本結(jié)構(gòu)和語句與低級語言的實(shí)用性結(jié)合起來,C語言可以像匯編語言一樣對位、字節(jié)和地址進(jìn)行操作,通常還是稱C為高級語言。

1.1.2 C是結(jié)構(gòu)化語言

結(jié)構(gòu)化語言的特點(diǎn)是程序的各個(gè)部分除了必要地?cái)?shù)據(jù)交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦阌谑褂茫S護(hù)及調(diào)試。

1.1.3 C語言功能齊全

C語言具有多種數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高;C語言也具有強(qiáng)大的圖形功能;具有較強(qiáng)的計(jì)算功能、邏輯判斷功能。

1.1.4 C語言可移植性好

與匯編語言相比,C語言程序適用范圍大,可用于各種操作系統(tǒng)和各種型號的計(jì)算機(jī)。游戲設(shè)計(jì)

2.1游戲設(shè)計(jì)要求

2.1.1.設(shè)計(jì)題目:俄羅斯方塊游戲 2.1.2.設(shè)計(jì)內(nèi)容:

一組由4個(gè)小型正方形組成的規(guī)則圖形,中文通稱為方塊共有7種,分別以S、Z、L、J、I、O、T這7個(gè)字母的形狀來命名。通過設(shè)計(jì)者預(yù)先設(shè)置的隨機(jī)發(fā)生器不斷地輸出單個(gè)方塊到場地頂部,以一定的規(guī)則進(jìn)行移動(dòng)、旋轉(zhuǎn)、下落和擺放,鎖定并填充到場地中。每次擺放如果將場地的一行或多行完全填滿,則組成這些行的所有小正方形將被消除,并且以此來換取一定的積分或者其他形式的獎(jiǎng)勵(lì)。而未被消除的方塊會(huì)一直累積,并對后來的方塊擺放造成各種影響。如果未被消除的方塊堆放的高度超過場地所規(guī)定的最大高度則游戲結(jié)束。

2.1.3.功能模塊劃分:

系統(tǒng)功能模塊

2.2 游戲設(shè)計(jì)思想

2.2.1游戲界面:

方塊堆積。遇整則消。

2.2.2 設(shè)計(jì)思路

1、一個(gè)用于擺放小型正方形的平面虛擬場地,其標(biāo)準(zhǔn)大小:行寬為10,列高為20,以每個(gè)小正方形為單位。2.、一組由4個(gè)小型正方形組成的規(guī)則圖形,英文稱為Tetromino,中文通稱為方塊共有7種,分別以S、Z、L、J、I、O、T這7個(gè)字母的形狀來命名。I:一次最多消除四層

J(左右):最多消除三層,或消除二層

L:最多消除三層,或消除二層

O:消除一至二層

S(左右):最多二層,容易造成孔洞

Z(左右):最多二層,容易造成孔洞

T:最多二層

(1)部分游戲有單格方塊,可以穿透固定的方塊到達(dá)最下層空位。其他的改版中出現(xiàn)更多特別的造型。

方塊會(huì)從區(qū)域上方開始緩慢繼續(xù)落下。

(2)玩家可以做的操作有:以90度為單位旋轉(zhuǎn)方塊,以格子為單位左右移動(dòng)方塊,讓方塊加速落下。

(3)方塊移到區(qū)域最下方或是著地到其他方塊上無法移動(dòng)時(shí),就會(huì)固定在該處,而新的方塊出現(xiàn)在區(qū)域上方開始落下。

(4)當(dāng)區(qū)域中某一列橫向格子全部由方塊填滿,則該列會(huì)消失并成為玩家的得分。同時(shí)刪除的列數(shù)越多,得分指數(shù)上升。

(5)當(dāng)固定的方塊堆到區(qū)域最上方而無法消除層數(shù)時(shí),則游戲結(jié)束。

(6)一般來說,游戲還會(huì)提示下一個(gè)要落下的方塊,熟練的玩家會(huì)計(jì)算到下一個(gè)方塊,評估現(xiàn)在要如何進(jìn)行。由于游戲能不斷進(jìn)行下去對商業(yè)用游戲不太理想,所以一般還會(huì)隨著游戲的進(jìn)行而加速提高難度。

3、通過設(shè)計(jì)者預(yù)先設(shè)置的隨機(jī)發(fā)生器不斷地輸出單個(gè)方塊到場地頂部,以一定的規(guī)則進(jìn)行移動(dòng)、旋轉(zhuǎn)、下落和擺放,鎖定并填充到場地中。每次擺放如果將場地的一行或多行完全填滿,則組成這些行的所有小正方形將被消除,并且以此來換取一定的積分或者其他形式的獎(jiǎng)勵(lì)。而未被消除的方塊會(huì)一直累積,并對后來的方塊擺放造成各種影響。

4、如果未被消除的方塊堆放的高度超過場地所規(guī)定的最大高度(并不一定是20或者玩家所能見到的高度),則游戲結(jié)束。

具體到每一款不同的游戲,其中的細(xì)節(jié)規(guī)則都可能有千差萬別,但是以上的基本規(guī)則是相同的。

2.3:游戲功能

2.3.1:開始部分

游戲是運(yùn)行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設(shè)置了一個(gè)游戲的標(biāo)題畫面,除了游戲標(biāo)題畫面我還設(shè)置了一個(gè)歡迎畫面。標(biāo)題畫面以后,還要為游戲的運(yùn)行部分作初始化,包括繪制游戲運(yùn)行時(shí)的背景,對游戲某些重 要變量的初始化。

2.3.2.運(yùn)行部分

俄羅斯方塊的要求為:不同形狀組合的方塊從界面上方落下。通過鍵盤上的四個(gè)光標(biāo)控制方塊下落時(shí)的形狀轉(zhuǎn)換和下落方向。方塊堆積在一起,將區(qū)域占滿時(shí)則會(huì)消除以增加

游戲分?jǐn)?shù)。

整個(gè)游戲過程分為三個(gè)步驟:

1、按游戲界面的“開始”按鈕或者F2鍵來開始游戲,自己使用右邊的窗口,對手使用左邊的窗口

2、鍵盤操作:系統(tǒng)缺省設(shè)置使用右邊的窗口,用光標(biāo)操作,“←”左移一格;“→”右移一格;“↑”旋轉(zhuǎn)方塊;↓ 方塊丟下(方塊下落到底),“End”健可以一格格的下落,用戶還可以自定義習(xí)慣的按鍵來操作游戲。

3、計(jì)分牌顯示的內(nèi)容:“分?jǐn)?shù)”為雙方本局的分?jǐn)?shù),計(jì)分標(biāo)準(zhǔn)為下落一個(gè)塊10分,一次消一行100分、2行200分、3行400分、4行800分。等級”為雙方的游戲設(shè)置等級,當(dāng)分?jǐn)?shù)達(dá)到一定的值,等級就會(huì)提升、速度加快。“行數(shù)”第一行為雙方消的行數(shù),第二行是送給對方的行數(shù)。“比分”為雙方贏的局?jǐn)?shù)。2.3.3:結(jié)束部分:

游戲結(jié)束時(shí),顯示“GAME OVER”

3.實(shí)驗(yàn)總結(jié):

3.1 開發(fā)背景與需求分析

隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,人們的生活越來越離不開網(wǎng)絡(luò),網(wǎng)絡(luò)給人們帶來了各種各樣的信息和更多更新的娛樂。據(jù)統(tǒng)計(jì)。每天上網(wǎng)的人群中75%的人用來豐富自己的生活。其中游戲最為常見和普遍。所以,這次課程設(shè)計(jì)我想實(shí)現(xiàn)一個(gè)小游戲:俄羅斯方塊。需求分析

1)游戲面板(畫布)GameCanvas類,完成游戲顯示; 2)方塊繪畫drawUnit類,方塊下落過程中的各種形態(tài);

3)主界面實(shí)現(xiàn)游戲的開始,退出,暫停,提高級數(shù),降低級數(shù)功能及圖像界面排版;

4)通過鍵盤按鍵實(shí)現(xiàn)游戲,并且可以調(diào)節(jié)游戲速度。

3.2 系統(tǒng)功能介紹

俄羅斯方塊是一個(gè)非常復(fù)雜但比較有趣并且耐玩的游戲,相信很多人對俄羅斯方塊并不陌生,如下圖所示,游戲中共有七種方塊,每種方塊都有四個(gè)方格組成。

這七種方塊可以旋轉(zhuǎn)90度、180度、270度,因此每種方塊有四種狀態(tài),七種方塊總有28種狀態(tài),這28種狀態(tài)的方塊隨機(jī)產(chǎn)生,自由下落,落下時(shí)可由玩家通過鍵盤上的上、下、左、右控制鍵來控制方塊的反轉(zhuǎn)、移動(dòng)和加速下落。如果下落時(shí),方塊填滿某一行則這一行消失,同時(shí)給玩家加分,若由存在空格的方塊填滿整個(gè)窗口,則游戲結(jié)束。

圖1-1 初始狀態(tài)

圖1-2 開始游戲

圖1-3 消除一行

圖1-4 消除兩行

圖1-5 消除四行

圖1-6 游戲結(jié)束

4.核心代碼:

import java.awt.*;import java.awt.event.*;

//俄羅斯方塊類

public class computer extends Frame { public static boolean isPlay = false;public static int level = 1, score = 0;public static TextField scoreField, levelField;

public static MyTimer timer;GameCanvas gameScr;//聲明一個(gè)屬于畫布類得變量 public static void main(String[] argus){ computer ers = new computer(“俄羅斯方塊游戲 V1.0 Author:Vincent”);//運(yùn)用構(gòu)造方法為框架名

WindowListener win_listener = new WinListener();//定義一個(gè)窗口監(jiān)聽事件對象

ers.addWindowListener(win_listener);//為框架添加該監(jiān)聽器 }

computer(String title)// 俄羅斯方塊類的構(gòu)造方法 { super(title);//調(diào)用父類得構(gòu)造方法

setSize(600, 480);//設(shè)置框架的尺寸

setLayout(new GridLayout(1, 2));//設(shè)置框架的布局流

gameScr = new GameCanvas();gameScr.addKeyListener(gameScr);//為該對象注冊鍵盤點(diǎn)擊監(jiān)聽器

timer = new MyTimer(gameScr);timer.setDaemon(true);timer.start();timer.suspend();

add(gameScr);

Panel rightScr = new Panel();rightScr.setLayout(new GridLayout(2, 1, 0, 30));rightScr.setSize(120, 500);add(rightScr);

// 右邊信息窗體的布局

MyPanel infoScr = new MyPanel();infoScr.setLayout(new GridLayout(4, 1, 0, 5));infoScr.setSize(120, 300);rightScr.add(infoScr);

// 定義標(biāo)簽和初始值

Label scorep = new Label(“分?jǐn)?shù):”, Label.LEFT);Label levelp = new Label(“級數(shù):”, Label.LEFT);scoreField = new TextField(8);levelField = new TextField(8);scoreField.setEditable(false);levelField.setEditable(false);infoScr.add(scorep);

infoScr.add(scoreField);infoScr.add(levelp);infoScr.add(levelField);scorep.setSize(new Dimension(20, 60));scoreField.setSize(new Dimension(20, 60));levelp.setSize(new Dimension(20, 60));levelField.setSize(new Dimension(20, 60));scoreField.setText(“0”);levelField.setText(“1”);

// 右邊控制按鈕窗體的布局

MyPanel controlScr = new MyPanel();controlScr.setLayout(new GridLayout(5, 1, 0, 5));rightScr.add(controlScr);

// 定義按鈕play Button play_b = new Button(“開始游戲”);play_b.setSize(new Dimension(50, 200));play_b.addActionListener(new Command(Command.button_play, gameScr));

// 定義按鈕Level UP Button level_up_b = new Button(“提高級數(shù)”);level_up_b.setSize(new Dimension(50, 200));level_up_b.addActionListener(new Command(Command.button_levelup, gameScr));

// 定義按鈕Level Down Button level_down_b = new Button(“降低級數(shù)”);level_down_b.setSize(new Dimension(50, 200));level_down_b.addActionListener(new Command(Command.button_leveldown, gameScr));

// 定義按鈕Level Pause Button pause_b = new Button(“游戲暫停”);pause_b.setSize(new Dimension(50, 200));pause_b.addActionListener(new

Command(Command.button_pause,gameScr));

// 定義按鈕Quit Button quit_b = new Button(“退出游戲”);quit_b.setSize(new Dimension(50, 200));quit_b.addActionListener(new Command(Command.button_quit, gameScr));

controlScr.add(play_b);controlScr.add(level_up_b);controlScr.add(level_down_b);controlScr.add(pause_b);controlScr.add(quit_b);setVisible(true);gameScr.requestFocus();} }

// 重寫MyPanel類,使Panel的四周留空間 class MyPanel extends Panel { public Insets getInsets(){ return new Insets(30, 50, 30, 50);} }

// 游戲畫布類

class GameCanvas extends Canvas implements KeyListener { final int unitSize = 30;// 小方塊邊長 int rowNum;// 正方格的行數(shù) int columnNum;// 正方格的列數(shù)

int maxAllowRowNum;// 允許有多少行未削 int blockInitRow;// 新出現(xiàn)塊的起始行坐標(biāo) int blockInitCol;// 新出現(xiàn)塊的起始列坐標(biāo) int[][] scrArr;// 屏幕數(shù)組 Block b;// 對方快的引用

// 畫布類的構(gòu)造方法 GameCanvas(){ rowNum = 15;columnNum = 10;maxAllowRowNum = rowNum1;blockInitCol = columnNum / 2(row + 1)* unitSize, unitSize, unitSize, true);g.dispose();}

public Block getBlock(){ return b;// 返回block實(shí)例的引用 }

// 返回屏幕數(shù)組中(row,col)位置的屬性值 public int getScrArrXY(int row, int col){ if(row < 0 || row >= rowNum || col < 0 || col >= columnNum)return(-1);else return(scrArr[row][col]);}

// 返回新塊的初始行坐標(biāo)方法 public int getInitRow(){ return(blockInitRow);// 返回新塊的初始行坐標(biāo) }

// 返回新塊的初始列坐標(biāo)方法 public int getInitCol(){ return(blockInitCol);// 返回新塊的初始列坐標(biāo) }

// 滿行刪除方法

void deleteFullLine(){ int full_line_num = 0;int k = 0;

for(int i = 0;i < rowNum;i++){ boolean isfull = true;

L1: for(int j = 0;j < columnNum;j++)if(scrArr[i][j] == 0){ k++;isfull = false;break L1;} if(isfull)full_line_num++;if(k!= 0 && k1, j, 0);else drawUnit(k1][j] = scrArr[i][j];} } for(int i = k1)){

dispBlock(0);col--;dispBlock(1);} }

// 實(shí)現(xiàn)塊的右移

public void rightMove(){ if(assertValid(blockType, turnState, row, col + 1)){ dispBlock(0);col++;dispBlock(1);} }

// 實(shí)現(xiàn)塊落下的操作的方法 public boolean fallDown(){ if(blockState == 2)return(false);if(assertValid(blockType, turnState, rowi, col + j);if(temp < 0 || temp == 2)return false;} k = k >> 1;} } return true;}

// 同步顯示的方法

public synchronized void dispBlock(int s){ int k = 0x8000;for(int i = 0;i < 4;i++){ for(int j = 0;j < 4;j++){ if(((int)pattern[blockType][turnState] & k)!= 0){ scr.drawUnit(rowcomputer.level + 1)* 100);} catch(InterruptedException e){ } if(!scr.getBlock().fallDown()){ scr.deleteFullLine();if(scr.isGameEnd()){ computer.isPlay = false;suspend();} else scr.getBlock().reset();} } } }

class WinListener extends WindowAdapter { public void windowClosing(WindowEvent l){ System.exit(0);} } 總結(jié)

1感悟:當(dāng)今計(jì)算機(jī)應(yīng)用在生活中可以說得是無處不在。因此作為二十一世紀(jì)的大學(xué)來說掌握程序開發(fā)技術(shù)是十分重要的,而C語言又是最常見,功能最強(qiáng)大的一種高級語言,因此做好C語言課程設(shè)計(jì)是十分必要的。回顧起此次課程設(shè)計(jì),至今我們?nèi)愿锌H多,的確,自從拿到題目到完成整個(gè)編程,從理論到實(shí)踐,在這么長的時(shí)間里,可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。通過這次課程設(shè)計(jì)使我們懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會(huì)遇到過各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對一些前面學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,比如說結(jié)構(gòu)體,指針,鏈表……通過這次課程設(shè)計(jì)之后,我們把前面所學(xué)過的知識又重新溫故了一遍。

我做的是做俄羅斯方塊游戲。簡單的一個(gè),但對我來說卻是一個(gè)很大的困難。更加是第一次做基于C語言的課程設(shè)計(jì),所以連續(xù)幾天翻閱書籍或是參考網(wǎng)上內(nèi)容卻絲毫沒有進(jìn)展,最主要是不知從何開始,這個(gè)時(shí)候才知道上課老師們不厭其煩的教導(dǎo)是多么的寶貴,這個(gè)時(shí)候才后悔上課的時(shí)候

沒有認(rèn)真的聽講。可是現(xiàn)在一切都晚了,還好時(shí)間還算是充裕,只好拿出書本重新復(fù)習(xí)一下。不過經(jīng)過幾天的努力,大體上把課本上的知識點(diǎn)看了一遍,知識點(diǎn)也都基本是撐握了,所以一下一步就是開始正式的編程序了。不過畢竟水平有限,還是不知如何下手,于是就在網(wǎng)上下了一篇類似的程序,經(jīng)過仔細(xì)的研究,終于讀懂了C語言編程的基本過程和方法。經(jīng)過一波三折,終于開始正式編程。

而且編程是一件高精度、模范化的事情,稍有疏乎都會(huì)影響全局,也可能因?yàn)槟骋惶幍男〉腻e(cuò)誤而導(dǎo)致整個(gè)程序的無法運(yùn)行。所以認(rèn)真仔細(xì)就是非常重要的了。開始的時(shí)候真的感覺編程是一件很無聊的事情,所以就在網(wǎng)上下載的程序的基礎(chǔ)上開始行動(dòng)了,不過當(dāng)一個(gè)程序運(yùn)行成功的時(shí)候那種喜悅是無法言語的,那種成就感是無法比擬的。又經(jīng)過幾天的努力,終于把程序完成了,盡管程序還是有很多錯(cuò)誤和漏洞,不過還是很高興的。無論如何是自己的勞動(dòng)成果,是自己經(jīng)過努力得到的成績,同時(shí)也是學(xué)習(xí)C語言的一次實(shí)踐作業(yè),自己進(jìn)步的證明。

通過這次課程設(shè)計(jì),使我對C語言有了更進(jìn)一步的認(rèn)識和了解,要想學(xué)好它要重在實(shí)踐,要通過不斷的上機(jī)操作才能更好地學(xué)習(xí)它,我也發(fā)現(xiàn)我的好多不足之處,首先是自己在指法上還不行,經(jīng)常按錯(cuò)字母,通過學(xué)習(xí)也有所改進(jìn);再有對C語言的一些標(biāo)準(zhǔn)庫函數(shù)不太了解,還有對函數(shù)調(diào)用的正確使用不夠熟悉,還有對C語言中經(jīng)常出現(xiàn)的錯(cuò)誤也不了解,通過實(shí)踐的學(xué)習(xí),我認(rèn)識到學(xué)好計(jì)算機(jī)要重視實(shí)踐操作,不僅僅是學(xué)習(xí)C語言,還是其它的語言,以及其它的計(jì)算機(jī)方面的知識都要重在實(shí)踐,所以后在學(xué)習(xí)過程中,我會(huì)更加注視實(shí)踐操作,使自己便好地學(xué)好計(jì)算機(jī)。

在該游戲設(shè)計(jì)過程中,收獲知識,提高能力的同時(shí),我也學(xué)到了很多人生的哲理,懂得怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。

2感謝:經(jīng)過兩個(gè)星期的苦心鉆研,系統(tǒng)終于制作完畢。在本次課程設(shè)計(jì)中困難遇到不少,也讓我學(xué)到了很多。在這次系統(tǒng)開發(fā)的過程中,我深深地體會(huì)到了做一個(gè)系統(tǒng),首先進(jìn)行需求分析的重要性。了解了一個(gè)系統(tǒng)的制作,從功能分析到功能模塊分析,與其他系統(tǒng)的關(guān)系,這些都有待以后進(jìn)一步的改進(jìn)。通過實(shí)踐對我以后的學(xué)習(xí)是一筆不小的財(cái)富!

在此,感謝班上同學(xué)對我的幫助和指點(diǎn),沒有他們所提供的資料,僅憑我個(gè)人力量,在短短的兩周時(shí)間里是很難完成這個(gè)設(shè)計(jì)的。更要感謝的是我的老師,感謝老師孜孜不倦的教誨,一絲不茍的精神和一視同仁的教學(xué)風(fēng)格。我會(huì)僅記老師的教誨,一步一個(gè)腳印的完成自己的學(xué)業(yè)!

參考文獻(xiàn):

[1].裘宗燕 著,從問題到程序科學(xué)出版社,北京大學(xué)出版社,1999年4月。[2].《C程序設(shè)計(jì)(第二版)》,譚浩強(qiáng)編,清華大學(xué)出版社,1999年12月。[3].《C語言編程常見問題解答》,[美]Paul S.R.Chishohm等著,張芳妮 呂波譯,清華大學(xué)出版社,11996年12月。[4].《The C Programming Language》,by Brian W.Kernighan and Dennis M.Ritchie.,Pubilished by Prentice-Hall in 1988。

[5].朱若愚.數(shù)據(jù)結(jié)構(gòu)[M].北京: 電子工業(yè)出版社, 2006.1

[6].傅清祥,王曉東.數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)[M].北京: 電子工業(yè)出版社, 2006.3 [7].李春葆.數(shù)據(jù)結(jié)構(gòu)(C語言版)習(xí)題與解析[M].北京:清華大學(xué)出版社, 2006.1 [8].劉大有.數(shù)據(jù)結(jié)構(gòu)[M].北京: 高等教育出版社, 2006.3 [9].王敬華,陳靜.C語言程序設(shè)計(jì)[M].北京: 清華大學(xué)出版社, 2007.10 [10].徐孝凱.數(shù)據(jù)結(jié)構(gòu)簡明教程.[M].北京: 清華大學(xué)出版社, 2006.04

課程設(shè)計(jì)俄羅斯方塊游戲源代碼

本程序共三個(gè)類,建一個(gè)包 square。把三個(gè)類都封裝到一個(gè)包里面,三個(gè)類分別是

Controller,Main,Square

package square;import javax.swing.JPanel;import java.awt.Color;

// 事倒入java程序所需要的類庫文件。如果不倒入相應(yīng)的文件。java程序是會(huì)報(bào)錯(cuò)的。import javax.swing.JLabel;public class Controller extends Thread //Controller類從定義從父類繼承來來的某些成員變量和成員方法,游戲控制線程

private int x;

//方塊左上角的坐標(biāo)

private int y;

private Square sq;

//方塊對象的引用當(dāng)前

private Square next;

//下一個(gè)方塊的引用

private JPanel[][] sc;

//顯示

private boolean[][] state;

//填充狀態(tài)

private int sorce;

//分值

private int speed;

//下落速度

private JLabel jl1;

//分?jǐn)?shù)速度提示

private JLabel jl2;

private JPanel jp;

//下一個(gè)方塊提示

private JPanel[][] sc2;

private int sleepTime;

//等待時(shí)間

public Controller(int x, int y, JPanel[][] sc, boolean[][] state,//構(gòu)造器

傳遞引用

int sorce, int speed, JLabel jl1, JLabel jl2,JPanel jp, JPanel[][] sc2){

this.x = x;

this.y = y;

this.sc = sc;

this.state = state;

this.sorce = sorce;

this.speed = speed;

this.jl1 = jl1;

this.jl2 = jl2;

this.jp = jp;

this.sc2 = sc2;

this.sleepTime = 200;

sq = new Square((int)(Math.random()* 4)+ 1);

next = new Square((int)(Math.random()* 4)+ 1);

}

public void init(){

for(int i = 0;i < state.length;i++){

for(int j = 0;j < state[i].length;j++){

state[i][j] = false;

}

}

update();

}

@Override

public void run()

//重設(shè)run()方法

{

while(true){

try {

if(!isGameOver()){

if(isHit()){

set();

} else {

fall();

}

check();

update();

Thread.sleep(sleepTime);

} else {

break;

}

} catch(InterruptedException e){

e.printStackTrace();

}

}

}

private void set()

//碼放方塊

{

for(int i = 0;i < 4;i++){

for(int j = 0;j < 4;j++){

if(sq.getState(i, j)== true){

state[i + x][y + j] = true;

}

}

}

x = 0;

y = 0;

sq = next;

next = new Square((int)(Math.random()* 4)+ 1);

sleepTime = 1000 /(speed + 2);

}

private void update()

//更新數(shù)據(jù)

{

for(int i = 0;i < sc.length;i++){

for(int j = 0;j < sc[i].length;j++){

if(state[i][j] == true){

sc[i][j].setBackground(Color.BLUE);

} else {

sc[i][j].setBackground(Color.WHITE);}

}

for(int i = 0;i < 4;i++){

for(int j = 0;j < 4;j++){

if(sq.getState(i, j)){

sc[i + x][j + y].setBackground(Color.BLUE);

}

}

}

for(int i = 0;i < sc2.length;i++){

for(int j = 0;j < sc2[i].length;j++){

if(next.getState(i, j)){

sc2[i][j].setBackground(Color.BLUE);

} else {

sc2[i][j].setBackground(Color.WHITE);

}

}

}

}

private boolean isHit()

//下落碰撞判斷

{

for(int i = 0;i < 4;i++){

for(int j = 0;j < 4;j++){

if(sq.getState(i, j)&&(x + i == 19 || state[i + x + 1][j + y])){

return true;

}

}

}

return false;

}

private void fall()

//下落

{

x++;

}

private boolean isLeftHit()

//左移碰撞判斷

{

if(y == 0){

return true;

}

for(int i = 0;i < 3;i++){

for(int j = 0;j < 3;j++){

if(sq.getState(i, j)&& state[x + i][y + j1][j];

}

}

sorce += 10;

speed = sorce / 100;

jl1.setText(String.valueOf(sorce));

jl2.setText(String.valueOf(speed));

sleepTime = 1000 /(speed + 2);

} catch(InterruptedException e){

e.printStackTrace();

}

}

}

}

public void moveLeft()

//向左

{

if(!isLeftHit()){

state[x][y] = false;

y--;

}

}

private boolean isRightHit()

//右移碰撞判斷

{

for(int i = 0;i < 3;i++){

for(int j = 0;j < 3;j++){

if(sq.getState(i, j)&&(y + j >= 9 || state[x + i][y + j + 1])){

return true;

}

}

}

return false;

}

public void moveRight()//向右

{

if(!isRightHit()){

state[x][y] = false;

y++;

}

}

public void rot()

//旋轉(zhuǎn)

{

sq.rot();

}

public void down()

//加速向下

{

sleepTime = 20;}

}

package square;import javax.swing.*;import java.awt.*;public class Main extends javax.swing.JFrame { private static final long serialVersionUID = 1L;private JPanel sc[][];

private JPanel sc2[][];

private boolean state[][];

Controller t;

/** Creates new form Square */

public Main()

{

initComponents();

sc = new JPanel[20][10];

sc2 = new JPanel[4][4];

state = new boolean[25][15];

jPanel1.setLayout(new GridLayout(20, 10, 2, 2));

jPanel3.setLayout(new GridLayout(4, 4, 2, 2));

jPanel3.setSize(150, 150);

for(int i = 0;i < sc.length;i++){

for(int j = 0;j < sc[i].length;j++){

sc[i][j] = new JPanel();

// sc[i][j].setSize(20, 20);

sc[i][j].setBackground(Color.WHITE);

jPanel1.add(sc[i][j]);

}

}

for(int i = 0;i < sc2.length;i++){

for(int j = 0;j < sc2[i].length;j++){

sc2[i][j] = new JPanel();

// sc2[i][j].setSize(20, 20);

sc2[i][j].setBackground(Color.WHITE);

jPanel3.add(sc2[i][j]);

}

}

jLabel3.setText(“0”);

jLabel4.setText(“0”);

this.setSize(460, 650);

}

/** This method is called from within the constructor to

* initialize the form.* WARNING: Do NOT modify this code.The content of this method is

* always regenerated by the Form Editor.*/

private void initComponents(){

jPanel2 = new javax.swing.JPanel();

jLabel1 = new javax.swing.JLabel();

jLabel2 = new javax.swing.JLabel();

jLabel3 = new javax.swing.JLabel();

jLabel4 = new javax.swing.JLabel();

jButton1 = new javax.swing.JButton();

jPanel1 = new javax.swing.JPanel();

jButton2 = new javax.swing.JButton();

jButton3 = new javax.swing.JButton();

jMenuBar1 = new javax.swing.JMenuBar();

jMenu1 = new javax.swing.JMenu();

jMenuItem1 = new javax.swing.JMenuItem();

jMenu2 = new javax.swing.JMenu();

jMenuBar2 = new javax.swing.JMenuBar();

jMenu3 = new javax.swing.JMenu();

jMenuItem2 = new javax.swing.JMenuItem();

jMenu4 = new javax.swing.JMenu();

jPanel3 = new javax.swing.JPanel();

jButton4 = new javax.swing.JButton();

jMenuBar3 = new javax.swing.JMenuBar();

jMenu5 = new javax.swing.JMenu();

jMenuItem3 = new javax.swing.JMenuItem();

jMenu6 = new javax.swing.JMenu();

jButton5 = new javax.swing.JButton();

jMenuBar4 = new javax.swing.JMenuBar();

jMenu7 = new javax.swing.JMenu();

jMenuItem4 = new javax.swing.JMenuItem();

jMenu8 = new javax.swing.JMenu();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setMinimumSize(new java.awt.Dimension(400, 550));

jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());

jLabel1.setText(“Score”);

jLabel2.setText(“Speed”);

jLabel3.setText(“jLabel3”);

jLabel4.setText(“jLabel4”);

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);

jPanel2.setLayout(jPanel2Layout);

jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addComponent(jLabel1)

.addGap(18, 18, 18)

.addComponent(jLabel3))

.addGroup(jPanel2Layout.createSequentialGroup()

.addComponent(jLabel2)

.addGap(18, 18, 18)

.addComponent(jLabel4)))

.addContainerGap(35, Short.MAX_VALUE)));

jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel1)

.addComponent(jLabel3))

.addGap(18, 18, 18)

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel2)

.addComponent(jLabel4))

.addContainerGap(84, Short.MAX_VALUE)));

jButton1.setText(“Start”);

jButton1.addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(java.awt.event.ActionEvent evt){

jButton1ActionPerformed(evt);

}

});

jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

jPanel1.setMinimumSize(new java.awt.Dimension(300, 500));

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 291, Short.MAX_VALUE));

jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 504, Short.MAX_VALUE));

jButton2.setText(“L”);

jButton2.addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(java.awt.event.ActionEvent evt){

jButton2ActionPerformed(evt);

}

});

jButton3.setText(“R”);

jButton3.addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(java.awt.event.ActionEvent evt){

jButton3ActionPerformed(evt);

}

});

jMenu1.setText(“File”);

jMenuItem1.setText(“Start”);

jMenu1.add(jMenuItem1);

jMenuBar1.add(jMenu1);

jMenu2.setText(“Edit”);

jMenuBar1.add(jMenu2);

jMenu3.setText(“File”);

jMenuItem2.setText(“Start”);

jMenu3.add(jMenuItem2);

jMenuBar2.add(jMenu3);

jMenu4.setText(“Edit”);

jMenuBar2.add(jMenu4);

jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());

jPanel3.setMinimumSize(new java.awt.Dimension(120, 120));

jPanel3.setPreferredSize(new java.awt.Dimension(120, 120));

javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);

jPanel3.setLayout(jPanel3Layout);

jPanel3Layout.setHorizontalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 135, Short.MAX_VALUE));

jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 116, Short.MAX_VALUE));

jButton4.setText(“Rot”);

jButton4.addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(java.awt.event.ActionEvent evt){

jButton4ActionPerformed(evt);

}

});

jMenu5.setText(“File”);

jMenuItem3.setText(“Start”);

jMenu5.add(jMenuItem3);

jMenuBar3.add(jMenu5);

jMenu6.setText(“Edit”);

jMenuBar3.add(jMenu6);

jButton5.setText(“D”);

jButton5.addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(java.awt.event.ActionEvent evt){

jButton5ActionPerformed(evt);

}

});

jMenu7.setText(“File”);

jMenu7.addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(java.awt.event.ActionEvent evt){

jMenu7ActionPerformed(evt);

}

});

jMenuItem4.setText(“Start”);

jMenu7.add(jMenuItem4);

jMenuBar4.add(jMenu7);

jMenu8.setText(“Edit”);

jMenuBar4.add(jMenu8);

setJMenuBar(jMenuBar4);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(jPanel1,javax.swing.GroupLayout.PREFERRED_SIZE,295, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel2,javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jPanel3, Short.MAX_VALUE)

.addComponent(jButton4,javax.swing.GroupLayout.DEFAULT_SIZE, 139,javax.swing.GroupLayout.PREFERRED_SIZE, 132, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)

.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()

.addComponent(jButton2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton5)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton3)))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, Short.MAX_VALUE)))

.addContainerGap()));

layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jPanel2,javax.swing.GroupLayout.PREFERRED_SIZE,10,javax.swing.GroupLayout.Alignment.LEADING,javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jPanel3,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(44, 44, 44)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

javax.swing.GroupLayout.PREFERRED_SIZE,33,.addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(63, Short.MAX_VALUE))

.addComponent(jPanel1,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE,38, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));

pack();

}

//

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){

// TODO add your handling code here:

t = new Controller(0, 0, sc, state, 0, 0, jLabel3, jLabel4, jPanel3, sc2);

t.init();

t.start();}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt){

// TODO add your handling code here:

t.moveLeft();}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt){

// TODO add your handling code here:

t.moveRight();}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt){

// TODO add your handling code here:

t.rot();}

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt){

// TODO add your handling code here:

t.down();

}

private void jMenu7ActionPerformed(java.awt.event.ActionEvent evt){

// TODO add your handling code here:

t.init();}

/**

* @param args the command line arguments

*/

public static void main(String args[]){

java.awt.EventQueue.invokeLater(new Runnable(){

public void run(){

new Main().setVisible(true);

}

});

}

// Variables declaration-do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton3;

private javax.swing.JButton jButton4;

private javax.swing.JButton jButton5;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2;

private javax.swing.JLabel jLabel3;

private javax.swing.JLabel jLabel4;

private javax.swing.JMenu jMenu1;

private javax.swing.JMenu jMenu2;

private javax.swing.JMenu jMenu3;

private javax.swing.JMenu jMenu4;

private javax.swing.JMenu jMenu5;

private javax.swing.JMenu jMenu6;

private javax.swing.JMenu jMenu7;

private javax.swing.JMenu jMenu8;

private javax.swing.JMenuBar jMenuBar1;

private javax.swing.JMenuBar jMenuBar2;

private javax.swing.JMenuBar jMenuBar3;

private javax.swing.JMenuBar jMenuBar4;

private javax.swing.JMenuItem jMenuItem1;

private javax.swing.JMenuItem jMenuItem2;

private javax.swing.JMenuItem jMenuItem3;

private javax.swing.JMenuItem jMenuItem4;

private javax.swing.JPanel jPanel1;

private javax.swing.JPanel jPanel2;

private javax.swing.JPanel jPanel3;

// End of variables declaration

}

package square;public class Square {

boolean[][][] state;

int condition;

//定義多種情況

public Square(int kind)

//

定義多種類型

{

state = new boolean[4][4][4];

condition = 0;

switch(kind){

case 1:

//方形

每個(gè)case之后應(yīng)該有個(gè)break;否則在滿足條件之后會(huì)繼續(xù)向后進(jìn)行會(huì)跳出

state[0][0][0] = true;

state[0][0][1] = true;

state[0][1][0] = true;

state[0][1][1] = true;

state[1][0][0] = true;

state[1][0][1] = true;

state[1][1][0] = true;

state[1][1][1] = true;

state[2][0][0] = true;

state[2][0][1] = true;

state[2][1][0] = true;

state[2][1][1] = true;

state[3][0][0] = true;

state[3][0][1] = true;

state[3][1][0] = true;

state[3][1][1] = true;

break;

case 2:

//I型

state[0][0][0] = true;

state[0][1][0] = true;

state[0][2][0] = true;

state[0][3][0] = true;

state[1][0][0] = true;

state[1][0][1] = true;

state[1][0][2] = true;

state[1][0][3] = true;

state[2][0][0] = true;

state[2][1][0] = true;

state[2][2][0] = true;

state[2][3][0] = true;

state[3][0][0] = true;

state[3][0][1] = true;

state[3][0][2] = true;

state[3][0][3] = true;

break;

case 3:

//L型

state[0][0][0] = true;

state[0][1][0] = true;

state[0][2][0] = true;

state[0][2][1] = true;

state[1][0][2] = true;

state[1][1][0] = true;

state[1][1][1] = true;

state[1][1][2] = true;

state[2][0][0] = true;

state[2][0][1] = true;

state[2][1][1] = true;

state[2][2][1] = true;

state[3][0][0] = true;

state[3][0][1] = true;

state[3][0][2] = true;

state[3][1][0] = true;

break;

case 4:

//T型

state[0][0][0] = true;

state[0][0][1] = true;

state[0][0][2] = true;

state[0][1][1] = true;

state[1][0][1] = true;

state[1][1][0] = true;

state[1][1][1] = true;

state[1][2][1] = true;

state[2][0][1] = true;

state[2][1][0] = true;

state[2][1][1] = true;

state[2][1][2] = true;

state[3][0][0] = true;

state[3][1][0] = true;

state[3][1][1] = true;

state[3][2][0] = true;

break;

}

}

public boolean getState(int i, int j)//獲得是否為聲明的i,j變量的值

{

return state[condition][i][j];

}

public void rot(){

condition =(condition + 1)% 4;

} }

下載5編寫一個(gè)C語言程序(五篇范文)word格式文檔
下載5編寫一個(gè)C語言程序(五篇范文).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點(diǎn)此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

相關(guān)范文推薦

    C語言 程序代碼編寫規(guī)范

    C語言 程序代碼編寫規(guī)范(初級程序員 討論版)前言 一個(gè)好的程序編寫規(guī)范是編寫高質(zhì)量程序的保證。清晰、規(guī)范的源程序不僅僅是方便閱讀,更重要的是能夠便于檢查錯(cuò)誤,提高調(diào)試效......

    c語言編寫單片機(jī)感想

    用C語言對單片機(jī)編程感想 起先接觸單片機(jī),單片機(jī)的程序是用匯編語言編寫的。匯編語言是面向機(jī)器的低級語言,保持了機(jī)器語言的優(yōu)點(diǎn),具有直接和簡捷的特點(diǎn),目標(biāo)代碼簡短,占用內(nèi)存少......

    紅綠燈C語言程序

    業(yè)余黨校筆記(全部整理) 2009年4月16日 第一講《中國共產(chǎn)黨的性質(zhì)和指導(dǎo)思想》 黨的性質(zhì),是指一個(gè)政黨所具有的質(zhì)的規(guī)定性,即它代表哪個(gè)階級利益,具有哪個(gè)階級的特性。中國共產(chǎn)......

    十大C語言經(jīng)典程序

    計(jì)算機(jī)二級C語言程序必背 1、/*輸出9*9口訣。共9行9列,i控制行,j控制列。*/ #include main() {int i,j,result; for (i=1;i......

    C語言程序穩(wěn)定性

    提高C語言程序運(yùn)行穩(wěn)定性的方法 一、前言 由于C語言的靈活性,用C語言開發(fā)出來的程序容易造成內(nèi)存泄漏、運(yùn)行異常、運(yùn)行結(jié)果不可預(yù)期等程序質(zhì)量問題,在用C語言開發(fā)程序的過程......

    c語言實(shí)習(xí)程序

    #include course_name(int i)/*把科目變成數(shù)字函數(shù)*/ { switch(i) { case 1:printf("英語 "); break; case 2:printf("數(shù)學(xué)"); break; case 3:printf("C語言"); break; c......

    C語言課程設(shè)計(jì)程序

    #include #include #include struct student { int num; char name[15]; //定義學(xué)生結(jié)構(gòu)體,st數(shù)組。int score[5]; float jqave; int rank; }st[27]; struct kecheng......

    C語言課程設(shè)計(jì)數(shù)字鐘程序

    C語言數(shù)字鐘程序 #include"stdio.h" void clock(int t); void main() { int t,i,j,n; for(t=0;t......

主站蜘蛛池模板: 久久18禁高潮出水呻吟娇喘| 精品人伦一区二区三电影| 亚洲乱码日产精品bd在线观看| 日本大片在线看黄a∨免费| 亚洲日本在线在线看片4k超清| 加勒比人妻av无码不卡| 亚洲中文字幕无码爆乳av| 8av国产精品爽爽ⅴa在线观看| 激情图片激情小说| 国产精品无码免费视频二三区| 免费a级毛片18禁网站免费| 久久97久久97精品免视看秋霞| 欧美亚洲国产第一精品久久| 99久久精品精品6精品精品| 亚洲精品一区二区三区福利| 亚洲成aⅴ人片久青草影院按摩| 青青青国产精品一区二区| 揉捏奶头高潮呻吟视频| 777天堂麻豆爱综合视频| 无尽动漫性视频╳╳╳3d| 内射爽无广熟女亚洲| 国产成人精品视觉盛宴| 波多野结衣初尝黑人| 本道久久综合无码中文字幕| 国产又爽又猛又粗的视频a片| 国产超碰人人做人人爽av动图| 俄罗斯美女真人性做爰| 无码骚夜夜精品| 精品av中文字幕在线毛片| 美女把尿囗扒开让男人添| 日韩人妻中文无码一区二区| 中文字幕无码人妻aaa片| 超碰97久久国产精品牛牛| 用舌头去添高潮无码av在线观看| 精品国产污污免费网站入口| 国产麻豆成人精品av| 天堂无码人妻精品av一区| 亚洲人ⅴsaⅴ国产精品| 国产精品久久久久久婷婷| 久爱无码免费视频在线| 国产成人亚洲影院在线播放|