本文目錄一覽:
- 1、求一份C語言課程設計報告要求包括:系統需求分析,總體設計,詳細設計,程序調試分析。
- 2、C語言課程設計,貪吃蛇應該怎麼做?
- 3、C語言程序設計基礎概念
- 4、什麼是C語言程序設計?
- 5、C語言課程設計
- 6、如何用c語言設計界面?
求一份C語言課程設計報告要求包括:系統需求分析,總體設計,詳細設計,程序調試分析。
C語言課程設計任務書
一、題目: 學生成績管理
二、目的與要求
1. 目的:
(1)基本掌握面向過程程序設計的基本思路和方法;
(2)達到熟練掌握C語言的基本知識和技能;
(3)能夠利用所學的基本知識和技能,解決簡單的程序設計問題
2. 要求
基本要求:
1. 要求利用C語言面向過程的編程思想來完成系統的設計;
2. 突出C語言的函數特徵,以多個函數實現每一個子功能;
3. 畫出功能模塊圖;
4. 進行簡單界面設計,能夠實現友好的交互;
5. 具有清晰的程序流程圖和數據結構的詳細定義;
6. 熟練掌握C語言對文件的各種操作。
創新要求:
在基本要求達到後,可進行創新設計,如系統用戶功能控制,對管理員級和一般級別的用戶系統功能操作不同
三、信息描述
輸入一個班10個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)的成績。編程計算出每個學生的總分和平均分,並按學生成績優劣排序,最後列印一張按高分到低分名次排序的成績單。要求:
1)排序用一個函數實現。
2)列印的成績單表項包括:序號,學號、數學、英語、計算機、總分、平均分。
3)按實驗報告電子模板格式填寫實驗內容。
四、功能描述
1. 學生基本信息及成績所選科目成績的錄入。
2. 基本信息的查詢(分系、班級;分科目)與修改。
3. 對每系或每班各科成績進行分析(即求單科平均成績、及格率和優秀率);
4. 對所開課程的成績分析(求其平均成績,最高分和最低分);
5. 對學生考試成績進行排名(單科按系別或班級進行排名,對每一個班級,同一學期學生總體成績進行排名,並顯示各科成績信息)
五、解決方案
1. 分析程序的功能要求,劃分程序功能模塊。
2. 畫出系統流程圖。
3. 代碼的編寫。定義數據結構和各個功能子函數。
4. 程序的功能調試。
5. 完成系統總結報告以及使用說明書
六、進度安排
此次課程設計時間為兩周,分四個階段完成:
1. 分析設計階段。指導教師應積極引導學生自主學習和鑽研問題,明確設計要求,找出實現方法,按照需求分析、總體設計、詳細設計這幾個步驟進行。
2. 編碼調試階段:根據設計分析方案編寫C代碼,然後調試該代碼,實現課題要求的功能。
3. 總結報告階段:總結設計工作,寫出課程設計說明書,要求學生寫出需求分析、總體設計、詳細設計、編碼、測試的步驟和內容。
4. 考核階段。
#include stdio.h
#include stdlib.h
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
};
/*排序用一個函數來實現*/
void SortScore(student *stu,int n)
{
student stud;
for(int i = 0; i n-1; i++)
for(int j = i+1 ; j n; j++)
{
if(stu[i].total stu[j].total)
{
stud = stu[i];
stu[i] = stu[j];
stu[j] = stud;
}
}
}
int main( )
{
student stu[STU_NUM]; /*創建結構體數組中有10個元素,分別用來保存這10個人的相關信息。*/
/*輸入這十個學生的相關信息*/
for(int i = 0; iSTU_NUM; i++)
{
printf(“請輸入第%d個學生的學號:”,i+1);
scanf(“%s”,stu[i].stu_id);
printf(“輸入第%d個學生的數學成績:”,i+1);
scanf(“%f”,stu[i].score[0]);
printf(“輸入第%d個學生的英語成績:”,i+1);
scanf(“%f”,stu[i].score[1]);
printf(“輸入第%d個學生的計算機成績:”,i+1);
scanf(“%f”,stu[i].score[2]);
stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver = stu[i].total/3;
}
printf(“\n”);
SortScore(stu,STU_NUM);/*調用排序函數*/
/*輸出排序後的各學生的成績*/
for(i = 0 ; i STU_NUM; i++)
{
printf(“序號: %d\t”,i);
printf(“學號:%s\t”,stu[i].stu_id);
printf(“數學:%f\t”,stu[i].score[0]);
printf(“英語:%f\t”,stu[i].score[1]);
printf(“計算機:%f\t”,stu[i].score[2]);
printf(“平均成績:%f\t”,stu[i].aver);
printf(“總分:%f\t”,stu[i].total);
printf(“\n\n”);
}
return 0;
}
註:(源程序中主要標識符含義說明)
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
}
實驗結果:
輸入 :(只輸入後面的數字,前面的文字是自己產生的)。
請輸入第1個學生的學號:001
輸入第1個學生的數學成績:1
輸入第1個學生的英語成績:1
輸入第1個學生的計算機成績:1
請輸入第2個學生的學號:002
輸入第2個學生的數學成績:2
輸入第2個學生的英語成績:2
輸入第2個學生的計算機成績:2
請輸入第3個學生的學號:003
輸入第3個學生的數學成績:3
輸入第3個學生的英語成績:3
輸入第3個學生的計算機成績:3
請輸入第4個學生的學號:004
輸入第4個學生的數學成績:4
輸入第4個學生的英語成績:4
輸入第4個學生的計算機成績:4
請輸入第5個學生的學號:005
輸入第5個學生的數學成績:5
輸入第5個學生的英語成績:5
輸入第5個學生的計算機成績:5
請輸入第6個學生的學號:006
輸入第6個學生的數學成績:6
輸入第6個學生的英語成績:6
輸入第6個學生的計算機成績:6
請輸入第7個學生的學號:007
輸入第7個學生的數學成績:7
輸入第7個學生的英語成績:7
輸入第7個學生的計算機成績:7
請輸入第8個學生的學號:008
輸入第8個學生的數學成績:8
輸入第8個學生的英語成績:8
輸入第8個學生的計算機成績:8
請輸入第9個學生的學號:009
輸入第9個學生的數學成績:9
輸入第9個學生的英語成績:9
輸入第9個學生的計算機成績:9
請輸入第10個學生的學號:010
輸入第10個學生的數學成績:10
輸入第10個學生的英語成績:10
輸入第10個學生的計算機成績:10
輸出:
序號: 0 學號:010 數學:10.000000 英語:10.000000 計算機:10.000000
平均成績:10.000000 總分:30.000000
序號: 1 學號:009 數學:9.000000 英語:9.000000 計算機:9.000000
平均成績:9.000000 總分:27.000000
序號: 2 學號:008 數學:8.000000 英語:8.000000 計算機:8.000000
平均成績:8.000000 總分:24.000000
序號: 3 學號:007 數學:7.000000 英語:7.000000 計算機:7.000000
平均成績:7.000000 總分:21.000000
序號: 4 學號:006 數學:6.000000 英語:6.000000 計算機:6.000000
平均成績:6.000000 總分:18.000000
序號: 5 學號:005 數學:5.000000 英語:5.000000 計算機:5.000000
平均成績:5.000000 總分:15.000000
序號: 6 學號:004 數學:4.000000 英語:4.000000 計算機:4.000000
平均成績:4.000000 總分:12.000000
序號: 7 學號:003 數學:3.000000 英語:3.000000 計算機:3.000000
平均成績:3.000000 總分:9.000000
序號: 8 學號:002 數學:2.000000 英語:2.000000 計算機:2.000000
平均成績:2.000000 總分:6.000000
序號: 9 學號:001 數學:1.000000 英語:1.000000 計算機:1.000000
平均成績:1.000000 總分:3.000000
七、撰寫課程設計報告或課程設計總結
課程設計報告要求:
總結報告包括需求分析、總體設計、詳細設計、編碼(詳細寫出編程步驟)、測試的步驟和內容、課程設計總結、參考資料等,不符合以上要求者,則本次設計以不及格記。
C語言常見錯誤
書寫標識符時,忽略了大小寫字母的區別
main()
{
int a=5;
printf(“%d”,A);
}
編譯程序把a和A認為是兩個不同的變數名,而顯示出錯信息。C認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常量名用大寫,變數名用小寫表示,以增加可讀性。
2.忽略了變數的類型,進行了不合法的運算。
main()
{
float a,b;
printf(“%d”,a%b);
}
%是求余運算,得到a/b的整餘數。整型變數a和b可以進行求余運算,而實型變數則不允許進行「求余」運算。
3.將字元常量與字元串常量混淆。
char c;
c=”a”;
在這裡就混淆了字元常量與字元串常量,字元常量是由一對單引號括起來的單個字元,字元串常量是一對雙引號括起來的字元序列。C規定以「\」作字元串結束標誌,它是由系統自動加上的,所以字元串「a」實際上包含兩個字元:『a’和『\’,而把它賦給一個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在許多高級語言中,用「=」符號作為關係運算符「等於」。如在BASIC程序中可以寫
if (a=3) then …
但C語言中,「=」是賦值運算符,「==」是關係運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1
b=2
編譯時,編譯程序在「a=1」後面沒發現分號,就把下一行「b=2」也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf(“%f”,t);
}
對於複合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個複合語句,如:
{ z=x+y;
t=z/100;
printf(“%f”,t);
};
複合語句的花括弧後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I5;I++);
{scanf(“%d”,x);
printf(“%d”,x);}
本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。
7.輸入變數時忘記加地址運算符「」。
int a,b;
scanf(“%d%d”,a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。「a」指a在內存中的地址。
8.輸入數據的方式與要求不符。①scanf(“%d%d”,a,b);
輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
②scanf(“%d,%d”,a,b);
C規定:如果在「格式控制」字元串中除了格式說明以外還有其它字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字元是不對的。
3 4 3:4
又如:
scanf(“a=%d,b=%d”,a,b);
輸入應如以下形式:
a=3,b=4
9.輸入字元的格式與要求不一致。
在用「%c」格式輸入字元時,「空格字元」和「轉義字元」都作為有效字元輸入。
scanf(“%c%c%c”,c1,c2,c3);
如輸入a b c
字元「a」送給c1,字元「 」送給c2,字元「b」送給c3,因為%c只要求讀入一個字元,後面不需要用空格作為兩個字元的間隔。
10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf(“%f%d\n”,a,b);
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。
11.輸入數據時,企圖規定精度。
scanf(“%7.2f”,a);
這樣做是不合法的,輸入數據時不能規定精度。
12.switch語句中漏寫break語句。
例如:根據考試成績的等級列印出百分制數段。
switch(grade)
{ case ‘A’:printf(“85~100\n”);
case ‘B’:printf(“70~84\n”);
case ‘C’:printf(“60~69\n”);
case ‘D’:printf(“60\n”);
default:printf(“error\n”);
由於漏寫了break語句,case只起標號的作用,而不起判斷作用。因此,當grade值為A時,printf函數在執行完第一個語句後接著執行第二、三、四、五個printf函數語句。正確寫法應在每個分支後再加上「break;」。例如
case ‘A’:printf(“85~100\n”);break;
13.忽視了while和do-while語句在細節上的區別。
(1)main()
{int a=0,I;
scanf(“%d”,I);
while(I=10)
{a=a+I;
I++;
}
printf(“%d”,a);
}
(2)main()
{int a=0,I;
scanf(“%d”,I);
do
{a=a+I;
I++;
}while(I=10);
printf(“%d”,a);
}
可以看到,當輸入I的值小於或等於10時,二者得到的結果相同。而當I10時,二者結果就不同了。因為while循環是先判斷後執行,而do-while循環是先執行後判斷。對於大於10的數while循環一次也不執行循環體,而do-while語句則要執行一次循環體。
14.定義數組時誤用變數。
int n;
scanf(“%d”,n);
int a[n];
數組名後用方括弧括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。
15.在定義數組時,將定義的「元素個數」誤認為是可使的最大下標值。
main()
;
printf(“%d”,a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。
16.初始化數組時,未使用靜態存儲。
int a[3]=;
這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:
static int a[3]=;
17.在不應加地址運算符的位置加了地址運算符。
scanf(“%s”,str);
C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字元數組名,不必要再加地址符。應改為:
scanf(“%s”,str);
18.同時定義了形參和函數中的局部變數。
int max(x,y)
int x,y,z;
{z=xy?x:y;
return(z);
}
形參應該在函數體外定義,而局部變數應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{int z;
z=xy?x:y;
return(z);
}
C語言心得體會
通過這次實訓,增加了我學習軟體技術的興趣,雖然還不明確軟體技術包含的具體內容,但從C語言這門課程開始,已發現程序設計的樂趣,在學習C語言的過程中也學到了許多計算機應用基礎知識,對計算機的機體也有了一個大體的了解。
這次實訓是老師給了范常式序,經過自己的改寫,實現要求。先做簡單的輸出,一步步的再做其它圖案,在實際操作過程中犯的一些錯誤還會有意外的收穫,感覺實訓很有意思。在具體操作中對這學期所學的C語言的理論知識得到鞏固,達到實訓的基本目的,也發現自己的不足之出,在以後的上機中應更加註意,同時體會到C語言具有的語句簡潔,使用靈活,執行效率高等特點。發現上機實訓的重要作用,特別是對數組和循環有了深刻的理解。
通過實際操作,學會 C語言程序編程的基本步驟、基本方法,開發了自己的邏輯思維能力,培養了分析問題、解決問題的能力。深刻體會到「沒有做不到的,只有想不到的」,「團結就是力量」,「實踐是檢驗真理的標準」,「不恥下問」……的寓意。
計時在此希望以後應多進行這樣的實訓,加長設間,培養學生獨立思考問題的能力,提高實際操作水平。
八、參考資料 :《C語言程序設計教程》
C語言課程設計,貪吃蛇應該怎麼做?
2.1程序功能介紹
貪吃蛇遊戲是一個經典小遊戲,一條蛇在封閉圍牆裡,圍牆裡隨機出現一個食物,通過按鍵盤四個游標鍵控制蛇向上下左右四個方向移動,蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記10分,接著又出現食物,等待蛇來吃,如果蛇在移動中撞到牆或身體交叉蛇頭撞倒自己身體遊戲結束。
2.2程序整體設計說明
一個遊戲要有開始部分,運行部分,結束部分(實際上開始部分與運行部分是一體的)。
2.2.1設計思路
這個程序的關鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示。移動時必須從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當前方向上前移,當遊戲者按了有效的方向鍵後,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵後,先確定蛇頭的位置,然後蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇,這時由於沒有慶平的原因,原來蛇的位置和新蛇的位置差一個單位,所以看起來社會多一節身體,所以將蛇的最後一節用背景色覆蓋。食物的出現和消失也是畫矩形塊和覆蓋矩形塊
2.2.2數據結構設計及用法說明
開始部分:
遊戲是運行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設置了一個遊戲的標題畫面,除了遊戲標題畫面我還設置了一個歡迎畫面。標題畫面以後,還要為遊戲的運行部分作初始化,包括繪製遊戲運行時的背景,對遊戲某些重 要變數的初始化。
運行部分:
作為遊戲的核心部分,這裡包括的函數比較多,也就是模塊比較多,首先讓我模擬一下貪吃蛇的遊戲模式:某個世界上突然出現一條蛇,它很短,它的運動神經異常,它沒法停止自己的多動症在它的世界裡就只有食物,它很餓,也很貪吃;同樣在不明原因的情況下,食物從天而降,可惜的是沒有落到嘴邊;飢餓的主人公,不管它有沒有毒,也不問食物的來歷,徑直向食物爬去;它吃到食物啦,它超出想像的同化能力讓食物很快的成為自己身體的一部分,它的身子變長啦。當它吃到第一顆食物時,上帝有給它第二顆,於是它吃了第二顆,於是又變長了,於是又有第三顆??它的身子是一直的加長,它不管自己過長身體的麻煩——轉身不便,繼續吃下去,現在它是直接把巴張大,好讓食物有個綠色通道。但是在某天的下午,它咬到了自己,它才想起自己是一條毒蛇,於是暈死過去(不是毒死);又或者它往食物衝鋒的時候,它失去控制,撞到了牆上。
第一輪循環:第一步,出現食物;第二步,蛇不停運動;第三步,檢查蛇是撞到自己或牆壁;由第四步起遊戲有兩條支線(A、B):
A :第四步,蛇沒有碰到自己或牆壁,蛇繼續前進,繪製蛇的動作;第五步,判斷蛇是否吃到食物,如果蛇吃到食物,身子變長,原來的食物消失;第六步,讓玩家輸入控制指令,讓蛇在下一輪循環的第二步改變運動方向;第七步,第二輪循環的第一步,重複第一輪的步驟;
B:第四步,蛇碰到自己或牆壁,終止遊戲。
結束部分:
遊戲結束時,顯示「GAME OVER」,已經是約定俗成的規律了,我的遊戲也不例外。除了遊戲結束畫面外,我還設置了一個遊戲退出畫面,「善始善終」嘛。
有了上述的大致劃分,我把整個程序劃分成(13+2)個模塊(其實就是函數)
2.2.3程序結構(流程圖)
圖2.1流程圖
依據所需要處理的任務要求,規劃輸入數據和輸出結果,決定存放數據的數據結構。
C語言中數據結構集中體現在數據類型上,因此在進行C語言程序設計時,應統籌規劃程序中所使用的變數,數組,指針等,以及它們的類型等。這點是很重要的,如果在此期間選擇不合適的變數或者數組,將來修改就十分困難。
現在分析一下貪吃蛇遊戲中的元素,繼而得出與它們對應的在程序中的描述:
蛇:
基本描述:長度,顏色,位置。
對應數據與數據類型:長度—雖然可以用坐標表示,但是這樣的話,運算量將很大,所以換算成較大的單位—節數,以固定長度的每節描述;坐標–整型;顏色–整型; 位置–X,Y坐標。
增加的描述:蛇運動的方向,蛇的生命。
對應數據與數據類型:這些描述是為了與程序的按鍵的輸入部分與判斷遊戲結束部分相聯繫而設的。方向只有四個方向:上下左右。可以設置與之對應的四個整型數:3、4、2、1。生命就只有兩種情況:死或生,對應0或1。
食物:
基本描述:顏色,位置。
對應數據與數據類型:由於顏色設成固定的,所以不再討論。位置—X、Y坐標。
增加的描述:食物的存在。
對應數據與數據類型:這是為了避免重複出現食物而設置的,與繪製食物的函數有聯繫。只有兩個值:0或1(沒有食物或有食物)
其他的元素:牆,由於它在顯示上是作為背景而存在的,所以並沒有什麼說明實際的牆壁就是四條直線組成的邊框,由坐標描述。
還需要的變數:鍵盤鍵入的鍵值(作為全局變數,整型);經常要使用的循環變數;自定義的填充圖案;說明文字的字元數組;遊戲的記分;遊戲的速度(蛇的速度)。
圖2.2蛇的不停運動的關鍵演算法的流程圖
2.2.4各模塊的功能及程序說明
主要模塊的實現思路和演算法的流程圖說明:
關鍵所在——蛇不停移動的Snakemove():
蛇的不停移動,就是蛇的下一節取代前一節的位置,在計算機中就是蛇下一節的位置坐標變成前一節的位置坐標。在上文中,已定義蛇的位置坐標為數組類型,一組坐標對應一節的位置,假設有i+1節,由0到i節,第i節的坐標取第i-1節的坐標,第i-1節的坐標取第i-2節的坐標??直到第1節取第0節的坐標。而第0節的坐標,即蛇頭的坐標要往某個方向變化,變化量為蛇每節的長度。蛇的這種坐標輪換需要循環語句使其繼續下去。
2.2.5程序結果
運行程序得到如下初始界面圖:
圖2.3程序結果圖
用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示:
圖2.4程序結果圖
蛇沒有碰到自己或牆壁,蛇繼續前進:
圖2.5程序結果圖
遊戲結束時,顯示「GAME OVER」
圖2.6程序結果圖
2.3程序源代碼及注釋
#define N 200
#include graphics.h
#include stdlib.h
#include dos.h
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*遊戲速度自己調整*/
struct Food{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變數*/
}food;/*食物的結構體*/
struct Snake{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束遊戲*/
void GamePlay(void);/*玩遊戲具體過程*/
void PrScore(void);/*輸出成績*/
/*主函數*/
void main(void){
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩遊戲具體過程*/
Close();/*圖形結束*/}
/*圖形驅動*/
void Init(void){
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(gd,gm,”c:\\program files\\winyes\\tc20h\\bgi”);
cleardevice();}
/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍牆*/
void DrawK(void){
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/
for(i=50;i=600;i+=10)/*畫圍牆*/ {
rectangle(i,40,i+10,49); /*上邊*/
rectangle(i,451,i+10,460);/*下邊*/ }
for(i=40;i=450;i+=10) {
rectangle(50,i,59,i+10); /*左邊*/
rectangle(601,i,610,i+10);/*右邊*/ }}
/*玩遊戲具體過程*/
void GamePlay(void){
randomize();/*隨機數發生器*/
food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇頭*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*節數*/
PrScore();/*輸出得分*/
while(1)/*可以重複玩遊戲,壓ESC鍵結束*/ {
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/ {
if(food.yes==1)/*需要出現新食物*/ {
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*畫面上有食物了*/ }
if(food.yes==0)/*畫面上有食物了就要顯示*/ {
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10); }
for(i=snake.node-1;i0;i–)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/ {
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; }
/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
switch(snake.direction) {
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break; }
for(i=3;isnake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/ {
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0]) {
GameOver();/*顯示失敗*/
snake.life=1;
break; } }
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||
snake.y[0]455)/*蛇是否撞到牆壁*/ {
GameOver();/*本次遊戲結束*/
snake.life=1; /*蛇死*/ }
if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/
break;
if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以後*/ {
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes=1;/*畫面上需要出現新的食物*/
score+=10;
PrScore();/*輸出新得分*/ }
setcolor(4);/*畫出蛇*/
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最後一節*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); } /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循環*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UPsnake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else
if(key==LEFTsnake.direction!=1)
snake.direction=2;
else
if(key==DOWNsnake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/}
/*遊戲結束*/
void GameOver(void){
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,”GAME OVER”);
getch();}
/*輸出成績*/
void PrScore(void){
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,”score:%d”,score);
outtextxy(55,20,str);}
/*圖形結束*/
void Close(void){
getch();
closegraph();
}
C語言程序設計基礎概念
1.1 C語言的特點
C語言是近年來非常流行的語言,很多人寧願放棄已經熟悉的其他語言而改用C語言,其原因是C語言有優於其他語言的一系列特點。下面是C語言的主要特點:
(1)語言簡潔、緊湊,並且使用方便、靈活;
(2)運算符豐富;
(3)數據結構豐富;
(4)具有結構化的控制語句;
(5)語法限制不太嚴格,使程序設計比較自由;
(6)C語言允許用戶直接訪問物理地址,能進行位(bit)操作,可以直接對硬體進行操作。
1.2 源程序的書寫規則
C語言的書寫規則。C語言書寫格式自由,一行內可以寫幾個語句,一個語句也可以分寫在多行上。C程序沒有行號,每個語句和數據定義的最後必須有一個分號。C語言中分號是語句中不可少的.,即使是程序中的最後一個語句也應該包含分號。C語言中的注釋可以用〃/*〃用〃*/〃結束,注釋可以在任何允許插入空格符地方插入。C語言中注釋不允許嵌套,注釋可以用西文,也可以用中文。
1.3 C語言的風格
由於C語言對語法限制不太嚴格,為了保證程序的準確性和可讀性,建議在書寫程序採用階梯縮進格式。也就是按如下格式書寫C語言程序:
**********;
*****()
{
**********;
********;
{
******;
……
}
*********;
}
概括起來,C語言程序具有如下的風格:
①C語言程序的函數具體模塊結構風格,使得程序整體結構清晰、層次清楚,為模塊化程序設計提供了強有力的支持。
②C語言的源程序的擴展名都是.C。
③C語言中的注釋格式為:
/*注釋內容*/
/與*之間不允許有空格,注釋部分允許出現在程序中的任何位置。
④C語言中的所有語句都必須以分號「;」結束。
什麼是C語言程序設計?
什麼是C語言?C語言的簡介。
C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有彙編語言的特點。
它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。
因此,它的應用範圍廣泛,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,具體應用比如單片機以及嵌入式系統開發。
語言特點:C是中級語言/C是結構式語言/C語言功能齊全/C語言適用範圍大/簡潔緊湊、靈活方便/運算符豐富/數據類型豐富/C是結構式語言/語法限制不太嚴格,程序設計自由度大/適用範圍大,可移植性好。
C語言課程設計
//我以前的作業
遊戲說明
1.開始遊戲
1)系統隨機產生一位不重複的N位數字。N的大小與等級有關。
初級:N=3 中級:N=4 高級:N=5
2)遊戲者輸入所猜的不重複數字,並按回車提交。提交的數據
數應與N的大小一致,當數據位數大於N時,只取前N位。
3)系統將提交的數與它自動產生的數進行比較,輸出結果「*A*B」形式。其中A代表數字正確相應位置也正確,B代表數字正確但位置不正確。如:1A3B表示遊戲者有1個數字的位置正確且數值也正確,除此以外,遊戲者還猜對了3個數字,但位置不對,即遊戲者已經猜出4位數據,但有3個數據位置不對!
4)遊戲者有限定次數的猜測機會,在規定次數內完成,則遊戲成功,否則,遊戲失敗。其中,猜測次數與等級有關:
初級:10次 中級:9次 高級:8次。
5)按完成遊戲所用的時間和次數計算遊戲者所得分數,遊戲等級越高,猜測所用的次數越少,得分越高!若遊戲者得分比系統已經保存的分數的高,將提示要求輸入遊戲者信息,並且保存在最佳排行之中。
2.等級設置
6)遊戲者可以自行設置遊戲等級:初級,中級和高級。
3.最佳排行
在最佳排行中,遊戲者可以查看當前遊戲的最佳排行。
4.遊戲說明
在遊戲說明中,遊戲者可以查看遊戲規則。
三.總體設計
本課程設計對模塊設計的要求如下:
(1)要求使用多文件方式實現設計;
(2)要求在各個文件內實現結構化設計;
(3)每個模塊作為一個單獨的C文件,每個文件內的函數如表所示,表中給出了各個函數的功能說明。
(4)宏和數據結構等放在頭文件中,並使用條件編譯。
(1)文件及函數組成
源文件 函數名或其他成分 功能
record.h
ASK 宏定義
結構聲明 結構聲明
庫函數及函數原型聲明
game_ control.c Game_rank 設置遊戲等級
Game_explain 輸出遊戲說明
game_ register.c Tiptop_record 記錄最高分
Tiptop_output 輸出最佳排行
game.c Game_main 開始遊戲中心
Build_number 獲取系統隨機數字
Game_in_out 獲取遊戲者數據和輸出結果
Time_command 時間控制
Game_result 遊戲結果處理輸出
record.c main 主函數
Menu_select 選擇菜單
manage_menu 處理菜單
(2)函數設計
1.頭部文件
文件名稱:record.h
功 能:聲明函數原型,包含文件及自定義宏和數據結構。
要 求:報告是否能正常打開文件執行操作。
2. 設置遊戲等級函數
函數原型:void Game_rank(void)
功 能:可由遊戲者自行設置遊戲等級
參 數:void
返 回 值:void
要 求:如果遊戲者沒有進行等級設定,則默認初級進行遊戲。
3. 輸出遊戲說明函數
函數原型:void Game_ explain()
功 能:輸出遊戲規則說明
參 數:void
返 回 值:void
要 求:說明遊戲相應的按鍵,保證遊戲者按照說明。
4. 記錄最高分函數:
函數原型:void Tiptop_register(int)
功 能:把從Get_player函數得到的遊戲者信息和遊戲的積分信息一同保存到指定路徑的Tiptop_register.dat文件中
參 數:int S;S為遊戲積分
返 回 值:void
要 求:要求把Tiptop1.txt(初級最高分) Tiptop2.txt(中級最高分) Tiptop3.txt(高
級最高分)原來有的信息替換為現在的信息,並且只有積分大於原有信息的第
十名,才會被以替換的方式記錄;並且是降序的方式排列的。
5. 輸出最佳排行函數:
函數原型:void Tiptop_out()
功 能:輸出最佳排行信息
參 數:void
返 回 值:void
要 求:沒有信息的時候輸出提示,有信息時按降序排列輸出全部信息。
6. 開始遊戲中心函數
函數原型:void Game_main()
功 能:調用Time_ control 、Build_number等函數,進行遊戲的整體控制
參 數:void
返 回 值:void
要 求:注意函數的完整性,保證遊戲順利進行,注意沒有設置等級時候,默認C=1!
7. 獲取系統隨機數字函數
函數原型:int *Build_number()
功 能:系統調用time.h文件,利用srand((unsigned) time()產生1個N位隨機數字,供遊戲者猜測
參 數:void
返 回 值:int 8=*i:指向產生的隨機數字構成的數組的指針
要 求:產生的數字是隨機的,並且是不重複的,總共產生N(依據遊戲等級而定)位數字,組成數組[初級為3個數字]。
8. 獲取遊戲者遊戲數據和輸出遊戲進程結果函數
函數原型:void Course_in_out()
功 能:把遊戲者猜的數據讀入內存,並且分析得出結果,並輸出結果
參 數:void
返 回 值:void
要 求:用A或B的代碼表示本次的結果,其中A表示數值對位置也對,B表示數值對,但位置錯了!每次得到遊戲者的猜測數據都要分析得出結果並輸出結果,以便遊戲者的下一次猜測。
9. 時間控制函數
函數原型:int Time_ control()
功 能:利用dos.h和time.h文件,得到玩遊戲的總時間,計算遊戲積分。
參 數:void
返 回 值:int Time:遊戲前後的時間差異
要 求:得到的時間是以秒為單位,數據是整型數據。
10. 遊戲結果處理輸出函數
函數原型:void Game_result(int m )
功 能:計算,得出最後遊戲積分
參 數:int m:整個遊戲的時間
返 回 值:void
要 求:按照遊戲等級,設置不同的遊戲積分方式。
11. 主函數:
函數原型:void main()
功 能:調用各個子函數,實現整體程序的運行
參 數:void
返 回 值: void
要 求:控制整個遊戲的順利進行。
12. 選擇菜單函數:
函數原型:void Menu_select()
功 能:得到Handle_menu的返回值,由一個switch語句選擇開始,等級,最佳排行,遊戲說明,結束等菜單操作。
參 數:void
返 回 值:void
要 求:由Handle_menu得到數據可循環得到,直到得到數字5時,選擇退出菜單,方可退出遊戲,否則一直循環程序!
13. 處理菜單函數:
函數原型:int Handle_menu()
功 能:輸出菜單選擇提示,並由cin語句實現遊戲者的輸入,輸入選擇相應菜單對應的菜單序號,並把相應的值傳給Menu_select函數
參 數:void
返 回 值:int n:選擇相應菜單的菜單序號
要 求:輸入的值不是相應的菜單的序號時返回0值,否則返回遊戲者的輸入值,以選擇相應菜單。
四.程序代碼
1. record.h
#include”time.h”
#includedos.h
#includestdio.h
#includestdlib.h
#includestring.h
//結構體
#define MAXSIZE 20
typedef long int ElemType; //定義結構體tiptop,存放遊戲者的最高分等信息
typedef struct tiptop
{
ElemType data;
char name[MAXSIZE];
char grade[MAXSIZE];
int year;
int month;
int day;
char week[MAXSIZE];
int hour;
int minute;
int second;
}tiptop;
//全局變數
int C; //C為等級設置變數
//函數聲明
void Menu_select(); //選擇菜單函數
int manage_menu(); //處理菜單函數
void Tiptop_record(int); //記錄最高分函數
void Tiptop_output(); //輸出最佳排行函數
void Game_rank(); //設置遊戲等級函數
void Game_explain(); //輸出遊戲說明函數
void Game_main(); //開始遊戲中心函數
int *Build_number(); //獲取系統隨機數字函數
void Game_in_out(); //獲取遊戲數據和輸出遊戲進程結果函數
int Time_command(); //時間控制函數
void Game_result(int); //遊戲結果處理輸出函數
2. game_ control.c
#include”record.h”
//**********************
// 設置遊戲等級函數
//**********************
void Game_rank()
{
FILE *fp;
printf(“\t******************************\n”);
printf(“\t************1:初級************\n”);
printf(“\t************2:中級************\n”);
printf(“\t************3:高級************\n”);
printf(“\t******************************\n”);
printf(“\t請選擇遊戲等級:\t”);
loop:
scanf(“%d”,C);
if(C1||C3)
{
printf(“\t輸入有誤!請重新輸入:\t”);
goto loop;
}
if((fp=fopen(“C.txt”,”w”))==NULL)
{
printf(“打開C.txt文件失敗!”);
exit(1);
}
fwrite(C,sizeof(int),1,fp);
fclose(fp);
if(C==1)
printf(“\t等級設置為初級!\n”);
if(C==2)
printf(“\t等級設置為中級!\n”);
if(C==3)
printf(“\t等級設置為高級!\n”);
printf(“\n”);
}
//****************
//輸出遊戲說明函數
//****************
void Game_explain()
{
printf(“遊戲說明:\n”);
printf(“\t**********************************************************\n”);
printf(“\t**********************************************************\n”);
printf(“\t①:遊戲開始,系統隨機產生一位不重複的N位數字。N的大小與等級\n”);
printf(“\t有關:\n”);
printf(“\t初級:N=3\t中級:N=4\t高級:N=5\t\n”);
printf(“\t②:遊戲者輸入所猜的不重複數字,並按回車提交。\n”);
printf(“\t提交的數據位數應與N的大小一致,當數據位數大於N時,只取前N位;\n”);
printf(“\t③:系統將提交的數與它自動產生的數進行比較,輸出結果\n”);
printf(“\t「*A*B」形式。其中A代表數字正確相應位置也正確,B代\n”);
printf(“\t表數字正確但位置不正確。如:1A3B表示遊戲者有1個數字的位置\n”);
printf(“\t正確且數值也正確,除此以外,遊戲者還猜對了3個數字,但位置不\n”);
printf(“\t對,即遊戲者已經猜出4位數據,但有3個數據位置不對!\n”);
printf(“\t④:遊戲者有限定次數的猜測機會,在規定次數內完成,\n”);
printf(“\t則遊戲成功。否則,遊戲失敗。其中,猜測次\n”);
printf(“\t數與等級有關:\n”);
printf(“\t初級:10次\t中級:9次\t高級:8次。\t\n”);
printf(“\t⑤:按完成遊戲所用的時間和次數計算遊戲者所得分數,\n”);
printf(“\t遊戲等級越高,猜測所用的次數越少,得分越高!\n”);
printf(“\t若遊戲者得分比系統已經保存的分數的高,將提示要求\n”);
printf(“\t輸入遊戲者信息,並且保存在最佳排行之中。\n”);
printf(“\t⑥:遊戲者可以自行設置等級!\n”);
printf(“\t**********************************************************\n”);
printf(“\t**********************************************************\n”);
printf(“\n”);
}
3. game_ register.c
#include”record.h”
//**************
//記錄最高分函數
//**************
void Tiptop_record(int S)
{
FILE *fp;
tiptop n;
char *week[]={“星期天”,”星期一”,”星期二”,”星期三”,”星期四”,”星期五”,
“星期六”};
time_t timep;
struct tm *t;
printf(“\t恭喜您!\n”);
printf(“\t您獲得本遊戲的最高分!\n”);
//獲取名字
printf(“\t請輸入您的姓名:”);
printf(“\t”);
scanf(“%s”,n.name);
//獲取時間
time(timep);
t=gmtime(timep);
t-tm_year=1900+t-tm_year;
t-tm_mon=1+t-tm_mon;
t-tm_hour=8+t-tm_hour;
n.year=t-tm_year;
n.month=t-tm_mon;
n.day=t-tm_mday;
strcpy(n.week,week[t-tm_wday]);
n.hour=t-tm_hour;
n.minute=t-tm_min;
n.second=t-tm_sec;
//獲取等級
if(C==1)
strcpy(n.grade,”初級”);
if(C==2)
strcpy(n.grade,”中級”);
if(C==3)
strcpy(n.grade,”高級”);
//獲取分數
n.data=S;
if(C==1)
{
if((fp=fopen(“tiptop1.txt”,”w”))==NULL)
{
printf(“\t打開tiptop1.txt文件失敗!”);
exit(1);
}
fwrite(n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==2)
{
if((fp=fopen(“tiptop2.txt”,”w”))==NULL)
{
printf(“\t打開tiptop2.txt文件失敗!”);
exit(1);
}
fwrite(n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==3)
{
if((fp=fopen(“tiptop3.txt”,”w”))==NULL)
{
printf(“\t打開tiptop3.txt文件失敗!”);
exit(1);
}
fwrite(n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
}
//****************
//輸出最佳排行函數
//****************
void Tiptop_output()
{
int i;
FILE *fp;
tiptop p,q,r;
if((fp=fopen(“tiptop1.txt”,”r”))==NULL)
{
printf(“還沒有最佳排行!”);
exit(1);
}
fread(p,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(“tiptop2.txt”,”r”))==NULL)
{
printf(“還沒有最佳排行!”);
exit(1);
}
fread(q,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(“tiptop3.txt”,”r”))==NULL)
{
printf(“還沒有最佳排行!”);
exit(1);
}
fread(r,sizeof(struct tiptop),1,fp);
fclose(fp);
if(p.data==0q.data==0r.data==0)
{
printf(“\t暫無最高分信息!”);
printf(“\n”);
printf(“\t是否直接進入遊戲?刷新最佳排行信息?\n”);
printf(“\t1:是\t2:否\n”);
printf(“\t”);
i=0;
scanf(“%d”,i);
if(i==1)
{
printf(“\t請設置遊戲等級: \n”);
Game_rank();
Game_main();
}
else
Menu_select();
}
else
{
printf(“\t最佳排行:\n”);
printf(“\t等級\t姓名\t分數\t遊戲時間\n”);
if(p.data!=0)
{
printf(“\t%s\t%s\t%d\t”,p.grade,p.name,p.data);
printf(“%d—%d—%d\t”,p.year,p.month,p.day);
printf(“%s\t%d:%d:%d\n”,p.week,p.hour,p.minute,p.second);
}
if(q.data!=0)
{
printf(“\t%s\t%s\t%d\t”,q.grade,q.name,q.data);
printf(“%d—%d—%d\t”,q.year,q.month,q.day);
printf(“%s\t%d:%d:%d\n”,q.week,q.hour,q.minute,q.second);
}
if(r.data!=0)
{
printf(“\t%s\t%s\t%d\t”,r.grade,r.name,r.data);
printf(“%d—%d—%d\t”,r.year,r.month,r.day);
printf(“%s\t%d:%d:%d\n”,r.week,r.hour,r.minute,r.second);
}
if(p.data==0)
printf(“\t初級暫無最高分信息!\n”);
if(q.data==0)
printf(“\t中級暫無最高分信息!\n”);
if(r.data==0)
printf(“\t高級暫無最高分信息!\n”);
//重置最佳排行榜
if(p.data!=0q.data!=0r.data!=0)
{
printf(“\t是否重置最佳排行?\n”);
printf(“\t1:是\t2:否\t”);
i=0;
scanf(“%d”,i);
if(i==1)
{
p.data=0;
q.data=0;
r.data=0;
if((fp=fopen(“tiptop1.txt”,”w”))==NULL)
{
printf(“打開tiptop1.txt文件失敗!”);
exit(1);
}
fwrite(p,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(“tiptop2.txt”,”w”))==NULL)
{
printf(“打開tiptop2.txt文件失敗!”);
exit(1);
}
fwrite(q,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen(“tiptop3.txt”,”w”))==NULL)
{
printf(“打開tiptop3.txt文件失敗!”);
exit(1);
}
fwrite(r,sizeof(struct tiptop),1,fp);
fclose(fp);
}
}
}
}
4.game.c
#include”record.h”
//全局變數
int *c1; //產生的數保存在指針c中
int A,B; // AB均為遊戲重要參數
int N; //NUM為需要猜測的數據個數
int TIME; //TIME為猜數字共有的次數
long int S; //S為遊戲積分
//****************
//開始遊戲中心函數
//****************
void Game_main()
{
FILE *fp;
int time;
if((fp=fopen(“C.txt”,”r”))==NULL)
{
printf(“打開C.txt文件失敗!”);
printf(“\n”);
exit(1);
}
fread(C,sizeof(int),1,fp);
N=C+2;
TIME=11-C;
if(C==1)
{
printf(“\t遊戲等級為:初級!\n”);
}
if(C==2)
{
printf(“\t遊戲等級為:中級!\n”);
}
if(C==3)
{
printf(“\t遊戲等級為:高級!\n”);
}
printf(“\t需要猜測的數字位數數為:%d,共有%d次猜測機會!”,N,TIME);
printf(“\n”);
time=Time_command();
Game_result(time);
}
//********************
//獲取系統隨機數字函數
//********************
int *Build_number()
{
int i,j,m;
time_t t;
c1=(int *)malloc(N*sizeof(int));
if(c1==NULL)
{
printf(“分配內存錯誤!\n”);
printf(“\n”);
exit(1);
}
srand((unsigned) time(t));
for(i=0;iN;i++)
{
m=rand()%10; //產生一個數字
if(i==0)
*c1=m;
else
{
for(j=0;ji;j++)
{
if(m==*(c1+j)//若原有數據之中已經有了與m相同的數字,則重新產生數字
{
i–;
break;
}
*(c1+i)=m;
}
}
}
printf(“\t系統產生的數據為:”);
for(i=0;iN;i++)
printf(“*”);
printf(“\n”);
printf(“\t您可以開始遊戲! 計時開始…\n”);
printf(“\t不能有重複的數字!\n”);
printf(“\t數字中間用空格隔開\n”);
return c1;
}
//****************************************
//獲取遊戲者遊戲數據和輸出遊戲進程結果函數
//****************************************
void Game_in_out()
{
int i,j,m;
int n; //遊戲者猜測的數字
int a[5]; //遊戲者猜測的數據構成的數組
int c[5];
int *p;
p=Build_number();
for(i=0;iN;i++)
{
c[i]=*(p+i);
}
for(m=0;mTIME;m++)
{
if(m==(TIME-1))
{
printf(“\t**請注意:**\n”);
printf(“\t**僅剩下一次機會了!**\n”);
printf(“\t**努力!加油!**\n”);
}
printf(“\t請輸入第%d次猜測的數字:\t”,m+1);
for(j=0;jN;j++)
{
scanf(“%d”,n);
a[j]=n;
}
A=0;
B=0;
for(i=0;iN;i++)
{
if(a[i]==c[i])
A++;
}
for(i=0;iN;i++)
{
for(j=0;jN;j++)
{
if(a[i]==c[j]i!=j)
B++;
}
}
printf(“\t您本次猜測的結果為:\t”);
printf(“%d A %d B”,A,B);
printf(“\n”);
//遊戲成功控制退出猜測程序
if(A==N)
{
m=TIME;
}
}
//TIME改變,記錄遊戲總次數的數據
TIME=i;
free(c1);
}
//************
//時間控制函數
//************
int Time_command()
{
int a; //遊戲時間
time_t first, second;
first=time(NULL); //獲取系統時間
Game_in_out();
second=time(NULL); //再次獲取系統時間
a=(int)difftime(second,first);
return a;
}
//********************
//遊戲結果處理輸出函數
//********************
void Game_result(int m)
{
FILE *fp;
tiptop p;
time_t t;
int S;
int n;
int i=0;
int minute,second;
if(A!=N)
{
S=0;
printf(“\tGame over!\n”);
printf(“\t您本次遊戲的積分為:\t%d”,S);
printf(“\t繼續努力!\n”);
printf(“\t是否繼續遊戲?\n”);
printf(“\t1:是\t\t\t2:否”);
printf(“\n”);
scanf(“%d”,i);
if(i==1)
Game_main();
else
Menu_select();
}
else
{
printf(“\t恭喜您遊戲成功!”);
printf(“\n”);
minute=m/60;
second=m%60;
printf(“\t您本次遊戲所用時間為:”);
printf(“%d分鐘%d秒\n”,minute,second);
printf(“\n”);
//積分
if(C==1)
{
n=11-TIME;
S=n*n*n*10-m;
}
if(C==2)
{
n=10-TIME;
S=n*n*n*n*10-m;
}
if(C==3)
{
n=9-TIME;
S=n*n*n*n*n*10-m;
}
if(S10)
{
srand((unsigned) time(t));
S=rand()%100;
}
printf(“\t您本次遊戲的積分為:\t%d”,S);
printf(“\n”);
}
//判斷是否符合最高分條件
if(C==1)
{
if((fp=fopen(“tiptop1.txt”,”r”))==NULL)
{
printf(“打開tiptop1.txt文件失敗!”);
printf(“\n”);
exit(1);
}
fread(p,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==2)
{
if((fp=fopen(“tiptop2.txt”,”r”))==NULL)
{
printf(“打開tiptop2.txt文件失敗!”);
printf(“\n”);
exit(1);
}
fread(p,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==3)
{
if((fp=fopen(“tiptop3.txt”,”r”))==NULL)
{
printf(“打開tiptop3.txt文件失敗!”);
printf(“\n”);
exit(1);
}
fread(p,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(S=(p.data))
Tiptop_record(S);
//提示跳轉
if(C==1)
{
printf(“\t您本次遊戲等級是初級,是否要進入中級?\n”);
printf(“\t1:是\t\t\t2:否”);
printf(“\n\t”);
i=0;
scanf(“%d”,i);
if(i==1)
{
C=2;
if((fp=fopen(“C.txt”,”w”))==NULL)
{
printf(“打開C.txt文件失敗!”);
exit(1);
}
fwrite(C,sizeof(int),1,fp);
fclose(fp);
Game_main();
}
else
Menu_select();
}
if(C==2)
{
printf(“\t您本次是中級遊戲,是否要進入高級遊戲呢?\n”);
printf(“\t1:是\t\t\t2:否”);
printf(“\n\t”);
i=0;
scanf(“%d”,i);
if(i==1)
{
C=3;
if((fp=fopen(“C.txt”,”w”))==NULL)
{
printf(“打開C.txt文件失敗!”);
exit(1);
}
fwrite(C,sizeof(int),1,fp);
fclose(fp);
Game_main();
}
else
Menu_select();
}
}
5.record.c
#include”record.h”
//******
//主函數
//******
void main()
{
printf(“\n”);
printf(“********************************************\n”);
printf(“********************************************\n”);
printf(” 歡迎進入猜數字遊戲 \n”);
printf(“\n”);
printf(“\t設計者: \n”);
printf(“********************************************\n”);
printf(“********************************************\n”);
printf(“\n”);
Menu_select();
}
//************
//選擇菜單函數
//************
void Menu_select()
{
while(1)
{
switch(manage_menu())
{
case 0:
printf(“輸入有誤,請重新輸入!\n”);
break;
case 1:
Game_main();
break;
case 2:
Game_rank();
break;
case 3:
Tiptop_output();
break;
case 4:
Game_explain();
break;
case 5:
printf(“\n”);
printf(“\n”);
printf(“*************** ** ** **** ** ** ** ** *** \n”);
printf(“*************** ** ** ** ** **** ** ** ** ***** \n”);
printf(” ** ** ** ** ** ** ** ** ** ** ******* \n”);
printf(” ** ** ** ** ** ** ** ** ** ** ******* \n”);
printf(” ** *********** ************* ** ** ** **** ***** \n”);
printf(” ** *********** ************* ** ** ** **** ***** \n”);
printf(” ** ** ** ** ** ** ** ** ** ** ***** \n”);
printf(” ** ** ** ** ** ** ** ** ** ** *** \n”);
printf(” ** ** ** ** ** ** **** ** ** *** \n”);
printf(” ** ** ** ** ** ** ** ** ** *** \n”);
printf(“\n”);
printf(“Goodbye!\n”);
exit(1);
}
}
}
//************
//處理菜單函數
//************
int manage_menu()
{
int n;
printf(“\t**************************\n”);
printf(“\t**\t1:開始遊戲\t**\n”);
printf(“\t**\t2:等級設置\t**\n”);
printf(“\t**\t3:最佳排行\t**\n”);
printf(“\t**\t4:遊戲說明\t**\n”);
printf(“\t**\t5:退出遊戲\t**\n”);
printf(“\t**************************\n”);
printf(“\t請輸入相應序號選擇相應菜單:”);
printf(“\t”);
scanf(“%d”,n);
printf(“\n”);
if(n1||n5)
n=0;
return n;
}
如何用c語言設計界面?
整體來講, 用C語言實現圖形化需要API函數, 在windows.h中聲明.
但是它和C語言控制台下編程的區別可以說除了語法一樣, 什麼東西都不剩下. C庫函數能實現的, API函數也全部都能實現, 而且功能更強大. 因此需要記憶的東西也就更多了, 但是絕對不可能把所有的API函數的用法全部知道, 只是知道大概, 一部分. 剩下不清楚, 或完全不懂的可以直接上MSDN, 百度百科或其他網站上去查詢. 但是如果其他網站與MSDN說明有出入, 一定要以MSDN的為準.
所以”怎麼用C實現圖形化界面”在這裡是不可能能說清的.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/233822.html