本程序特點:
1、計算不用到棧,
2、有界面處理,
1,開始界面: 2,點擊《重新發牌》按鈕: 3,點擊《輸入答案》按鈕: (1)通過情況: (2)輸入式子中數字用錯情況: (3)輸入式子中符號用錯情況: (4)輸入式子計算錯誤情況: 4,點擊《查看游戲規則》按鈕: 5,點擊《結束游戲》按鈕: 
c語言源程序如下:
- /*使用說明:
- @請使用(.cpp)文件打開程序。
- @用戶用鼠標點擊《重新發牌》按鈕,電腦將重新發四張牌。
- @用戶用鼠標點擊《輸入答案》按鈕,電腦將彈出一個窗口,用戶輸入認為正確的
- 式子,但只有二次輸入答案的機會,機會用完如果想繼續游戲可以用戶用鼠標點
- 擊《重新發牌》按鈕。
- @用戶用鼠標點擊《查看游戲規則》按鈕,可以查看規則。
- @用戶用鼠標點擊《結束游戲》按鈕,將結束游戲。
- */
- #include<stdio.h> //輸入/輸出庫。
- #include<stdlib.h> //標準工具庫函數庫。
- #include<string.h> //字符函數庫。
- #include<ctype.h> //字符函數庫。
- #include<time.h> //時間函數庫。
- #include<dos.h> //系統接口函數庫。
- #include<easyx.h> //繪圖函數庫。
- #include<conio.h> //控制臺輸入/輸出函數庫。
- /**@@@@@@@@@@@@@@@@@@@@@預處理@@@@@@@@@@@@@@@@@@@@@@@@@@@**/
- #define BeiJingColor1 RGB(225,225,120) //定義背景色
- #define BeiJingColor2 RGB(250,250,250) //定義背景色
- MOUSEMSG Mouse; //定義鼠標信息變量Mouse
-
- /**@@@@@@@@@@@@@@@@@@聲明自定義函數程序塊@@@@@@@@@@@@@@@@@@@@**/
- void WindowsInit(); //窗口初始化函數。
- void DrawPoker(int x,int y,int Length,int Wideth,int Distance); //繪制撲克牌。
- void DrawButton(int x,int y,int Length,int Wideth,char* String); //繪制按鈕。
- void ClearMessage1(); //清空消息區。
- void ClearMessage2(int x,int y,int Length,int Wideth,int Distance); //清空撲克牌。
- float jskhsz(); //去除括號并算括號內的式子,并分離十進制字符和加減乘除等字符,并把十進制字符轉為浮點型的函數。
- float jsccsz(); //計算式子中的乘除的函數。
- float jsjjsz(); //計算式子中的加減函數。
- int fjxt(int K,int L,int i); //判定系統是否出兩張牌并防止出兩張相同的牌的函數。
- void chupai(); //出牌函數。
- int yzmysz(); //檢驗用戶輸入式子是否滿足使用所給的牌值和應用規定的符號的函數。
- int NUM(const void *a,const void *b); //自定義比較函數
- int khpd(int z,int f,int kh1[],int kh2[]); //判斷括號是否符合規定函數,符合就返回1,不符合就返回0。
- void PD24d(float UE); //檢驗用戶輸入式子是否等于24點的函數。
- void gueize(); //輸出規則函數。
- /***@@@@@@@@@@@@@@@@@@@@主函數@@@@@@@@@@@@@@@@@@***/
- /**********************************************************************************************
- @功能: 主函數。
- @形參: 無。
- @返回值:無。
- **********************************************************************************************/
- int main()
- {
- int c,i=1;
- initgraph(840, 700);
- WindowsInit(); //創建窗口。
- chupai(); //開始出牌。
- gueize(); //說明規則。
- c=1;
- do
- {
- FlushMouseMsgBuffer(); //清除鼠標信息。
- Mouse=GetMouseMsg(); //獲取鼠標信息。
- if(Mouse.x>700&&Mouse.x<820&&Mouse.mkLButton) //bool mkLButton;(鼠標左鍵是否按下)
- {
- if(Mouse.y>140&&Mouse.y<180) //《重新出牌》按鈕坐標。
- {
- chupai();
- c=1;
- }
- if(Mouse.y>200&&Mouse.y<240&&c==1) //《輸入答案》按鈕坐標,其中c控制輸入答案次數。
- {
- yzmysz();
- c=0;
- }
- }
- if(Mouse.y>300&&Mouse.y<340&&Mouse.mkLButton) //bool mkLButton;(鼠標左鍵是否按下)
- {
- if(Mouse.x>490&&Mouse.x<650) //《查看游戲規則》按鈕坐標。
- {
- gueize();
- }
- if(Mouse.x>660&&Mouse.x<780) //《結束游戲》按鈕坐標。
- {
- closegraph(); //關閉界面。
- }
- }
-
- }while(i);
-
- return 0;
- }
- /**@@@@@@@@@@@@@@@@@@@@@@@界面程序塊@@@@@@@@@@@@@@@@@@@@@@@@@@***/
- /**********************************************************************************************
- @功能: 窗口初始化函數。
- @形參: 無。
- @返回值:無
- **********************************************************************************************/
- void WindowsInit()
- {
- setbkcolor(BeiJingColor1); //更換背景色
- cleardevice(); //清除圖形屏幕
- settextstyle(40, 15, _T("微軟雅黑")); //繪制標題
- settextcolor(BLACK);
- outtextxy(50,30,"歡迎來到24點游戲!");
- setlinecolor(BLACK);
- DrawButton(700,140,120,40,"重新發牌"); //繪制按鈕
- DrawButton(700,200,120,40,"輸入答案");
- DrawButton(490,300,160,40,"查看游戲規則");
- DrawButton(660,300,120,40,"結束游戲");
- DrawButton(20,300,150,40,"信息提示區");
- rectangle(20,350,780,680);
- ClearMessage1();
- DrawPoker(20,140,120,140,150); //繪制撲克牌
- }
- /**********************************************************************************************
- @功能: 用于清除信息顯示區的內容。
- @形參: 無。
- @返回值:無。
- **********************************************************************************************/
- void ClearMessage1()
- {
- setfillcolor(BeiJingColor2);
- solidrectangle(21,351,779,679);
- }
- /**********************************************************************************************
- @功能: 用于清除撲克牌的內容。
- @形參: 四張撲克牌的左上角位置x,y,長度Length,寬度Wideth,間距Distance。
- @返回值: 無。
- **********************************************************************************************/
- void ClearMessage2(int x,int y,int Length,int Wideth,int Distance)
- {
- int i;
- setfillcolor(BeiJingColor1);
- for(i=0;i<4;i++)
- {
- solidrectangle(x+Distance*i+1,y+1,x+Wideth+Distance*i-1,y+Length-1);
- }
- }
- /**********************************************************************************************
- @功能: 繪制撲克牌圖像。
- @形參: 四張撲克牌的左上角位置x,y,長度Length,寬度Wideth,間距Distance。
- @返回值:四個矩形方框(撲克牌外形)。
- **********************************************************************************************/
- void DrawPoker(int x,int y,int Length,int Wideth,int Distance)
- {
- int i;
- for(i=0;i<4;i++)
- {
- rectangle(x+Distance*i,y,x+Wideth+Distance*i,y+Length);
- }
- }
- /**********************************************************************************************
- @功能: 繪制一個按鈕
- @形參: 按鈕左上角坐標x,y,按鈕長度Length,寬度Wideth,按鈕中內容String
- @返回值:一個按鈕和其內容。
- **********************************************************************************************/
- void DrawButton(int x,int y,int Length,int Wideth,char* String)
- {
- rectangle(x,y,x+Length,y+Wideth);
- settextstyle(24, 0, _T("宋體"));
- outtextxy(x+10,y+10,String);
- }
- /**@@@@@@@@@@@@@@@@計算式子程序塊@@@@@@@@@@@@@@@@@@@@**/
- int n;
- char mysz[20]; //定義一數組存放用用戶輸入的式子。
- /**********************************************************************************************
- @功能: 去除括號并算括號內的式子,并分離十進制字符和加減乘除等字符,并把十進制字符轉為浮點型。
- @形參: 無。
- @返回值:式子中的數或括號內的結果。
- **********************************************************************************************/
- float jskhsz()
- {
- char sz[20];
- float sumf;
- int i;
- if(mysz[n]=='(') //計算括號內的式子。
- {
- n++;
- sumf=jsjjsz();
- }
- if(mysz[n]==')')
- n++;
- for(i=0;isdigit(mysz[n])!=0;n++) //判斷用戶輸入式子是否有十進制字符,有則執行。(P53.isdigit()函數:判斷字符是否是十進制字符,是則返回非0,否返回0。)
- {
- sz[i]=mysz[n];
- i++;
- sz[i]='\0';
- sumf=(float)atoi(sz); //(float)強制轉浮點型,(P320.atoi()函數:將字符串轉整型。)
- }
- return(sumf);
- }
- /**********************************************************************************************
- @功能: 計算式子中的乘除。
- @形參: 無。
- @返回值:乘除所得的值。
- **********************************************************************************************/
- float jsccsz()
- {
- float sumc;
- sumc=jskhsz(); //括號內式子優先級高,所以先運行flsf()函數。
- while(mysz[n]=='*'||mysz[n]=='/')
- {
- if(mysz[n]=='*')
- {
- n++;
- sumc=sumc*jskhsz(); //遇到乘號先調用flsf()函數檢驗下面式子是否有括號。
- }
- if(mysz[n]=='/')
- {
- n++;
- sumc=sumc/jskhsz();
- }
- }
- return(sumc);
- }
- /**********************************************************************************************
- @功能: 計算式子中的加減。
- @形參: 無。
- @返回值:式子總值。
- **********************************************************************************************/
- float jsjjsz()
- {
- float sumj;
- sumj=jsccsz(); //乘除的優先級更高,所以先運行chengchu()函數。
- while(mysz[n]=='-'||mysz[n]=='+')
- {
- if(mysz[n]=='+')
- {
- n++;
- sumj=sumj+jsjjsz(); //遇到加號先調用chenchu()函數檢驗下面式子是否有乘號。
- }
- if(mysz[n]=='-')
- {
- n++;
- sumj=sumj-jsjjsz();
- }
-
- }
- return(sumj);
- }
- /***********************發牌與處理牌程序塊************************/
- int cpz[4],CP1[5],CP2[5]; //定義數組cpz[4]存放四張牌對應的值。
- /**********************************************************************************************
- @功能: 判定系統是否出兩張相同的牌并防止出兩張相同的牌。
- @形參: 確定牌第一字母的變量K,確定牌第二字母的變量J,確定發到第幾張牌的變量i。
- @返回值:1(當前牌與前面牌有相同),0(當前牌與前面牌不相同)
- **********************************************************************************************/
- int fjxt(int K,int L,int i)
- {
- int p=0,j,t;
- if(i==0)
- {
- p=1;
- }
- else
- {
- for(j=0;j<i;j++) //防止出兩張相同的牌。
- {
- if(K==CP1[j]) //先判定是否與第一個字符相同。
- {
- for(t=0;t<i;t++) //在判定是否與第二個字符相同。
- {
- if(L==CP2[t])
- {
- goto kl;
- }
- }
- }
- }
- kl:if(j==i) //若能運行完上面程序段,就可以輸出。
- {
- p=1;
- }
- }
- return(p);
- }
- /**********************************************************************************************
- @功能: 出牌函數。
- @形參: 無。
- @返回值:無。
- **********************************************************************************************/
- void chupai()
- {
-
- time_t t;
- int X,Y,K,L,i,p;
- char pai1[5]={'S','H','D','C','Q'};
- char pai2[14][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
- char pai3[5]={'1','2'};
- char cpai[1];
- X=0;Y=0; //變量賦初值。
- srand((unsigned)time(&t)); //初始化隨機數發生器。(P343.srand():初始化隨機數發生器函數。)
- ClearMessage2(20,140,120,140,150);
- for(i=0;i<4;i++)
- {
-
- K=rand()%5; //隨機出一個0 ~ 4范圍內的數,對應pai1數組中對應牌的第一字符。(P339.rand():隨機數發生器函數。)
- CP1[i]=K;
- if(K!=4)
- {
- L=rand()%13; //隨機出一個0 ~ 12范圍內的數,對應pai2數組中對應牌的第二字符。
- CP2[i]=L;
- p=fjxt(K,L,i);
- if(p==1)
- {
- cpz[i]=L+1; //L+1為每張牌相應的值。
- setbkcolor(BeiJingColor1);
- _stprintf(cpai, _T("%c%s"),pai1[K],pai2[L]);
- settextstyle(80, 0, _T("微軟雅黑"));
- outtextxy(40+i*145,150,cpai);
- }
- else
- i--;
- }
- else //大鬼Q1和小鬼Q2兩張牌處理和輸出。
- {
- Y++;
- if(Y==1) //大鬼Q1和小鬼Q2就兩張牌,第一次無條件輸出。
- {
- L=rand()%2; //隨機出一個0 ~ 1范圍內的數,對應pai3數組中對應大鬼Q1和小鬼Q2的第二字符。
- X=L; //變量X存放第一次隨機輸出的值。
- cpz[i]=1;
- setbkcolor(BeiJingColor1);
- _stprintf(cpai, _T("%c%c"),pai1[K],pai3[L]);
- settextstyle(80, 0, _T("微軟雅黑"));
- outtextxy(40+i*145,150,cpai);
- }
- else
- if(Y==2)
- {
- L=rand()%2;
- if(X!=L) //與第一次隨機輸出的值對比,若不相同則可以輸出。
- {
- cpz[i]=1;
- setbkcolor(BeiJingColor1);
- _stprintf(cpai, _T("%c%c"),pai1[K],pai3[L]);
- settextstyle(80, 0, _T("微軟雅黑"));
- outtextxy(40+i*145,150,cpai);
- }
- else
- i--;
- }
- else
- i--;
- }
- }
- ClearMessage1();
- }
-
- /**@@@@@@@@@@@輸入式子與檢驗用戶輸入式子是否正確程序塊@@@@@@@@*/
- int s1=0;
- /**********************************************************************************************
- @功能: 輸入式子與檢驗用戶輸入式子是否滿足使用所給的牌值和應用規定的符號。
- @形參: 無。
- @返回值:無。
- **********************************************************************************************/
- int yzmysz()
- {
- char sz[5],szz[10];
- int p,q,Q,M,MN,i,x,sc,KJ,z,f,zf,h1,h2,kh1[5],kh2[5];
- int m,mypz[4];
- float A;
-
- loop:InputBox(mysz,20,"請輸入您以為正確的式子","輸入","",0,0,true );
- settextstyle(30, 0, _T("微軟雅黑"));
- outtextxy(30,360,"正在檢驗您的式子。。。。");
- p=0;q=0;Q=0;M=0;MN=0;sc=1;KJ=0;z=0;f=0;h1=0;h2=0; //變量賦初值。
- for(x=0,i=4;mysz[x]!='\0';) //檢驗用戶輸入牌值與電腦給出的牌值是否相等。
- {
- if(isdigit(mysz[x])==0)
- x++;
- if(isdigit(mysz[x])!=0)
- i--;
- for(m=0;isdigit(mysz[x])!=0;x++) //(isdigit()函數:判斷字符是否是十進制數,是則執行函數,否則跳出。)
- {
- sz[m]=mysz[x];
- m++;
- sz[m]='\0';
- mypz[i]=atoi(sz); //(atoi()函數:字符串轉整型值。)
- }
- }
- qsort(cpz,4,sizeof(cpz[0]),NUM); //快速排序。(P338.qsort()函數:快速排序函數。)
- qsort(mypz,4,sizeof(mypz[0]),NUM);
- for(i=0;i<4;i++) //用戶輸入的牌值和電腦出的牌值對比。
- {
- if(i>=4)
- {
- p=1;
- }
- else
- if(cpz[i]!=mypz[i])
- {
- p=1; //出現不相等p等于1。
- }
- }
- for(x=0;mysz[x]!='\0';x++) //檢驗用戶輸入式子的數字是否超過四個,超過為錯。
- {
- if(isdigit(mysz[x])==0)//(isdigit()函數:判斷字符是否是十進制數,是則執行函數,否則跳出。)
- {
- sc++;
- }
- if(sc>4)
- {
- p=1;
- }
- }
- if(p==1) //p=1用戶使用數不對。
- {
- setbkcolor(BeiJingColor2);
- s1++;
- ClearMessage1();
- outtextxy(30,360,"您使用數不對哦。!");
- outtextxy(30,400,"您還有一次重新輸入的機會!!");
- outtextxy(30,440,"您所輸入式子為:");
- outtextxy(30,480,mysz);
- if(s1<=1) //判斷輸入次數是否超過設定的兩次。
- goto loop;
- else
- {
- setbkcolor(BeiJingColor2);
- ClearMessage1();
- outtextxy(30,360,"您使用數不對并且次數用完!");
- outtextxy(30,400,"本次游戲結束。");
- outtextxy(30,440,"您所輸入式子為:");
- outtextxy(30,480,mysz);
- outtextxy(30,520,"如果想繼續游戲請按《重新發牌》。");
- s1=0;
- goto ex;
- }
- }
- else
- if(p==0) //p=0用戶使用數正確,判斷用戶使用符號是否有錯誤。
- {
- for(x=0;mysz[x]!='\0';x++)
- {
- if(isdigit(mysz[x])==0)
- {
- if(mysz[x]<40||mysz[x]>47||mysz[x]==44||mysz[x]==46) //檢驗用戶輸入加減乘除等符號與規定的符號是否相等(用ASCII檢驗)
- {
- KJ=1;
- goto sood;
- }
- else
- if(mysz[x]==42||mysz[x]==43||mysz[x]==45||mysz[x]==47) //'+''-''*''/'
- {
- if(isdigit(mysz[x-1])==0&&mysz[x-1]!=41) //'+''-''*''/'前只能為十進制字符和')'
- {
- KJ=1;
- goto sood;
- }
- if(isdigit(mysz[x+1])==0&&mysz[x+1]!=40) //'+''-''*''/'后只能為十進制字符和'('
- {
- KJ=1;
- goto sood;
- }
- }
- else
- {
- if(mysz[x]==40)
- {
- if(mysz[x+1]==41) //出現'()'為錯。
- {
- KJ=1;
- goto sood;
- }
- z++; //記錄'('的個數。
- kh1[h1]=x; //記錄'('的位置。
- h1++;
- }
- if(mysz[x]==41)
- {
- f++; //記錄')'的個數。
- kh2[h2]=x; //記錄')'的位置。
- h2++;
- }
- }
- }
- }
- zf=khpd(z,f,kh1,kh2);
- sood:if(KJ==1||zf==0)
- {
- setbkcolor(BeiJingColor2);
- s1++;
- ClearMessage1();
- outtextxy(30,360,"您的符號使用號有錯誤哦。!");
- outtextxy(30,400,"您還有一次重新輸入的機會。");
- outtextxy(30,440,"您所輸入式子為:");
- outtextxy(30,480,mysz);
- if(s1<=1) //判斷輸入次數是否超過設定的兩次。
- goto loop;
- else
- {
- setbkcolor(BeiJingColor2);
- ClearMessage1();
- outtextxy(30,360,"您的符號使用有錯誤并且次數用完!");
- outtextxy(30,400,"本次游戲結束。");
- outtextxy(30,440,"您所輸入式子為:");
- outtextxy(30,480,mysz);
- outtextxy(30,520,"如果想繼續游戲請按《重新發牌》。");
- s1=0;
- goto ex;
- }
- }
- }
- setbkcolor(BeiJingColor2);
- ClearMessage1();
- outtextxy(30,360,"正在檢驗您輸入的式子是否等于24。。。");
- outtextxy(30,400,"您所輸入式子為:");
- outtextxy(30,440,mysz);
- n=0; //每次運行jiajian()函數都把n重新賦0值。
- sprintf(szz,"%f",jsjjsz()); //把式子結果存于szz數組。
- outtextxy(30,480,"計算結果為:\n");
- outtextxy(30,520,szz);
- n=0;
- A=jsjjsz(); //計算用戶輸入式子。
- PD24d(A); //調用PD24d()函數判斷用戶輸入式子是否等于24點。
- ex:return 0;
- }
- /**********************************************************************************************
- @功能: 自定義比較函數。
- @形參: 數a,數b。
- @返回值:數a與數b的差值。
- **********************************************************************************************/
- int NUM(const void *a,const void *b)
- {
- return *(int *)a-*(int *)b;
- }
- /**********************************************************************************************
- @功能: 判斷括號是否符合規定。
- @形參: "("的個數z,")"的個數f,存放'('位置的數組kh1[],存放')'位置的數組kh2[]。
- @返回值:1(括號使用正確),0(括號使用錯誤)
- **********************************************************************************************/
- int khpd(int z,int f,int kh1[],int kh2[])
- {
- int i,zf=1;
- if(z!=f) //'('和')'個數比較。
- {
- zf=0;
- }
- else
- {
- for(i=0;i<z;i++)
- {
- if(kh1[i]>kh2[i]) //'('和')'位置比較。
- {
- zf=0;
- }
- }
- }
- return(zf);
- }
- /**********************************************************************************************
- @功能: 檢驗用戶輸入式子結果是否等于24點。
- @形參: 式子總值UE。
- @返回值:無。
- **********************************************************************************************/
- void PD24d(float UE)
- {
- if(UE==24.000000)
- {
- outtextxy(30,560,"恭喜您通過。!");
- }
- else
- {
- outtextxy(30,560,"您的計算有誤。!");
- outtextxy(30,600,"本次游戲結束。");
- }
- }
- /***@@@@@@@@@@@@@@@@@@@@@輸出規則的程序塊@@@@@@@@@@@@@@@@@@@@@@@@***/
- /**********************************************************************************************
- @功能: 將規則輸出到信息提示區。
- @形參: 無。
- @返回值:無。
- **********************************************************************************************/
- void gueize()
- {
- ClearMessage1();
- setbkcolor(BeiJingColor2);
- settextstyle(20, 0, _T("微軟雅黑"));
- outtextxy(30,360,"請仔細閱讀規則:");
- outtextxy(30,380,"一副牌54張牌,黑桃(SA,SK,SQ,SJ,S10,……,S2),");
- outtextxy(30,400," 紅桃(HA,HK,HQ,HJ,H10,……,H2),");
- outtextxy(30,420," 方塊(DA,DK,DQ,DJ,D10,……,D2),");
- outtextxy(30,440," 草花(CA,CK,CQ,CJ,C10,……,C2),");
- outtextxy(30,460," 以及大鬼Q1和小鬼Q2。");
- outtextxy(30,480,"其中,A,K,Q,J及Q1,Q2的點值分別為:1,13,12,11,1,1。其余點值就是牌值。");
- }
復制代碼
所有資料51hei提供下載:
程序.zip
(676.75 KB, 下載次數: 13)
2018-9-25 21:06 上傳
點擊文件名下載附件
|