C語言小遊戲程式碼分享——黑白棋。喜歡的朋友點贊關注並轉發!
阿新 • • 發佈:2018-12-08
C/C++企業實戰級課程資源(素材+原始碼+視訊)、編譯大禮包免費分享,需要的加學習群892643663。
#include "graphics.h" /*圖形系統標頭檔案*/ #define LEFT 0x4b00 /*游標左鍵值*/ #define RIGHT 0x4d00 /*游標右鍵值*/ #define DOWN 0x5000 /*游標下鍵值*/ #define UP 0x4800 /*游標上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分數以及按鍵與存放棋子的變數*/ char playone[3],playtwo[3];/*兩個人的得分轉換成字串輸出*/ void playtoplay(void);/*人人對戰函式*/ void DrawQp(void);/*畫棋盤函式*/ void SetPlayColor(int x);/*設定棋子第一次的顏色*/ void MoveColor(int x,int y);/*恢復原來棋盤狀態*/ int QpChange(int x,int y,int z);/*判斷棋盤的變化*/ void DoScore(void);/*處理分數*/ void PrintScore(int n);/*輸出成績*/ void playWin(void);/*輸出勝利者資訊*/ /******主函式*********/ void main(void) { int gd=DETECT,gr; initgraph(&gd,&gr,"c:\\tc"); /*初始化圖形系統*/ DrawQp();/*畫棋盤*/ playtoplay();/*人人對戰*/ getch(); closegraph();/*關閉圖形系統*/ } void DrawQp()/*畫棋盤*/ { int i,j; score1=score2=0;/*棋手一開始得分都為0*/ setbkcolor(BLUE); for(i=100;i<=420;i+=40) { line(100,i,420,i);/*畫水平線*/ line(i,100,i,420); /*畫垂直線*/ } setcolor(0);/*取消圓周圍的一圈東西*/ setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/ fillellipse(500,200,15,15); /*在顯示得分的位置畫棋*/ setfillstyle(SOLID_FILL,8); /*黑色實體填充模式*/ fillellipse(500,300,15,15); a[3][3]=a[4][4]=1;/*初始兩個黑棋*/ a[3][4]=a[4][3]=2;/*初始兩個白棋*/ setfillstyle(SOLID_FILL,WHITE); fillellipse(120+3*40,120+3*40,15,15); fillellipse(120+4*40,120+4*40,15,15); setfillstyle(SOLID_FILL,8); fillellipse(120+3*40,120+4*40,15,15); fillellipse(120+4*40,120+3*40,15,15); score1=score2=2; /*有棋後改變分數*/ DoScore();/*輸出開始分數*/ } void playtoplay()/*人人對戰*/ { int x,y,t=1,i,j,cc=0; while(1)/*換棋手走棋*/ { x=120,y=80;/*每次棋子一開始出來的座標,x為行座標,y為列座標*/ while(1) /*具體一個棋手走棋的過程*/ { PrintScore(1);/*輸出棋手1的成績*/ PrintScore(2);/*輸出棋手2的成績*/ SetPlayColor(t);/*t變數是用來判斷棋手所執棋子的顏色*/ fillellipse(x,y,15,15); key=bioskey(0);/*接收按鍵*/ if(key==ESC)/*跳出遊戲*/ break; else if(key==ENTER)/*如果按鍵確定就可以跳出迴圈*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒有棋子*/ { if(t%2==1)/*如果是棋手1移動*/ a[(x-120)/40][(y-120)/40]=1; else/*否則棋手2移動*/ a[(x-120)/40][(y-120)/40]=2; if(!QpChange(x,y,t))/*落子後判斷棋盤的變化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢復空格狀態*/ cc++;/*開始統計嘗試次數*/ if(cc>=64-score1-score2) /*如果嘗試超過空格數則停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break; } else continue;/*如果按鍵無效*/ } DoScore();/*分數的改變*/ break;/*棋盤變化了,則輪對方走棋*/ } else/*已經有棋子就繼續按鍵*/ continue; } else /*四個方向按鍵的判斷*/ if(key==LEFT&&x>120)/*左方向鍵*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x-=40; fillellipse(x,y,15,15); } else if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x+=40; fillellipse(x,y,15,15); } else if(key==UP&&y>120)/*上方向鍵*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y-=40; fillellipse(x,y,15,15); } else if(key==DOWN&&y<400)/*下方向鍵*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y+=40; fillellipse(x,y,15,15); } } if(key==ESC)/*結束遊戲*/ break; if((score1+score2)==64||score1==0||score2==0)/*格子已經佔滿或一方棋子為0判斷勝負*/ { playWin();/*輸出最後結果*/ break; } t=t%2+1; /*一方走後,改變棋子顏色即輪對方走*/ cc=0; /*計數值恢復為0*/ } /*endwhile*/ } void SetPlayColor(int t)/*設定棋子顏色*/ { if(t%2==1) setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步後恢復原來格子的狀態*/ { if(y<100)/*如果是從起點出發就恢復藍色*/ setfillstyle(SOLID_FILL,BLUE); else/*其他情況如果是1就恢復白色棋子,2恢復黑色棋子,或恢復藍色棋盤*/ switch(a[(x-120)/40][(y-120)/40]) { case 1: setfillstyle(SOLID_FILL,15);break; /*白色*/ case 2: setfillstyle(SOLID_FILL,8);break; /*黑色*/ default: setfillstyle(SOLID_FILL,BLUE); /*藍色*/ } } int QpChange(int x,int y,int t)/*判斷棋盤的變化*/ { int i,j,k,kk,ii,jj,yes; yes=0; i=(x-120)/40; /*計算陣列元素的行下標*/ j=(y-120)/40; /*計算陣列元素的列下標*/ SetPlayColor(t);/*設定棋子變化的顏色*/ /*開始往8個方向判斷變化*/ if(j<6)/*往右邊*/ { for(k=j+1;k<8;k++) if(a[k]==a[j]||a[k]==0)/*遇到自己的棋子或空格結束*/ break; if(a[k]!=0&&k<8) { for(kk=j+1;kk<k&&k<8;kk++)/*判斷右邊*/ { a[kk]=a[j]; /*改變棋子顏色*/ fillellipse(120+i*40,120+kk*40,15,15); } if(kk!=j+1) /*條件成立則有棋子改變過顏色*/ yes=1; } } if(j>1)/*判斷左邊*/ { for(k=j-1;k>=0;k--) if(a[k]==a[j]||!a[k]) break; if(a[k]!=0&&k>=0) { for(kk=j-1;kk>k&&k>=0;kk--) { a[kk]=a[j]; fillellipse(120+i*40,120+kk*40,15,15); } if(kk!=j-1) yes=1; } } if(i<6)/*判斷下邊*/ { for(k=i+1;k<8;k++) if(a[k][j]==a[j]||!a[k][j]) break; if(a[k][j]!=0&&k<8) { for(kk=i+1;kk<k&&k<8;kk++) { a[kk][j]=a[j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk!=i+1) yes=1; } } if(i>1)/*判斷上邊*/ { for(k=i-1;k>=0;k--) if(a[k][j]==a[j]||!a[k][j]) break; if(a[k][j]!=0&&k>=0) { for(kk=i-1;kk>k&&k>=0;kk--) { a[kk][j]=a[j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk!=i-1) yes=1; } } if(i>1&&j<6)/*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++) if(a[k][kk]==a[j]||!a[k][kk]) break; if(a[k][kk]&&k>=0&&kk<8) { for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++) { a[ii][jj]=a[j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i-1) yes=1; } } if(i<6&&j>1)/*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--) if(a[k][kk]==a[j]||!a[k][kk]) break; if(a[k][kk]!=0&&k<8&&kk>=0) { for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--) { a[ii][jj]=a[j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i+1) yes=1; } } if(i>1&&j>1)/*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--) if(a[k][kk]==a[j]||!a[k][kk]) break; if(a[k][kk]!=0&&k>=0&&kk>=0) { for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--) { a[ii][jj]=a[j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i-1) yes=1; } } if(i<6&&j<6)/* 右下*/ { for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++) if(a[k][kk]==a[j]||!a[k][kk]) break; if(a[k][kk]!=0&&kk<8&&k<8) { for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++) { a[ii][jj]=a[j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i+1) yes=1; } } return yes;/*返回是否改變過棋子顏色的標記*/ } void DoScore()/*處理分數*/ { int i,j; score1=score2=0;/*重新開始計分數*/ for(i=0;i<8;i++) for(j=0;j<8;j++) if(a[j]==1)/*分別統計兩個人的分數*/ score1++; else if(a[j]==2) score2++; } void PrintScore(int playnum)/*輸出成績*/ { if(playnum==1)/*清除以前的成績*/ { setfillstyle(SOLID_FILL,BLUE); bar(550,100,640,400); } setcolor(RED); settextstyle(0,0,4);/*設定文字輸出樣式*/ if(playnum==1)/*判斷輸出哪個棋手的分,在不同的位置輸出*/ { sprintf(playone,"%d",score1); outtextxy(550,200,playone); } else { sprintf(playtwo,"%d",score2); outtextxy(550,300,playtwo); } setcolor(0); } void playWin()/*輸出最後的勝利者結果*/ { settextstyle(0,0,4); setcolor(12); if(score2>score1)/*開始判斷最後的結果*/ outtextxy(100,50,"black win!"); else if(score2<score1) outtextxy(100,50,"white win!"); else outtextxy(60,50,"you all win!"); }
C/C++企業實戰級課程資源(素材+原始碼+視訊)、編譯大禮包免費分享,需要的加學習群892643663。