當前位置:編程學習大全網 - 源碼下載 - c語言五子棋源代碼

c語言五子棋源代碼

# include & ltstdio.h & gt

# include & ltstring.h & gt

# include & ltstdlib.h & gt

#定義SPA 0

#定義MAN 1

# define COM 2 /*空位置設置為0,播放器下位置設置為1,電腦下位置設置為2 */

int潘琪[15][15];/* 15 * 15的棋盤*/

int a,b,c,d,x;/* a b是玩家的副坐標,c d是電腦的副坐標,X是剩下的空位*/

void start();/*程序的主要控制功能*/

void draw();/*畫壹個棋盤*/

int win(int p,int q);/*判斷勝利p q為判斷點坐標*/

void AI(int *p,int * q);/*計算機返回下壹個子q的坐標*/

int value(int p,int q);/*計算空點p q的值*/

int七星(int n,int p,int q);/*返回N方向空點p q的棋型,其中N為1-8方向,從右順時針開始*/

void yiwei(int n,int *i,int * j);/*將坐標i j向N方向移動1-8 */

void main()

{

char k;

做{

x = 225

start();

Printf("妳還想要壹個嗎?輸入y或n:");getchar();scanf("%c ",& ampk);

而(k!= ' y ' & amp& ampk!='n'){

Printf("輸入錯誤,請重新輸入\ n ");scanf("%c ",& ampk);}

系統(“cls”);} while(k = = ' y ');Printf("感謝您的使用!\ n ");

}

無效開始()

{

int i,j,a1,b1,c1,d1,choice/* a 1b 1存儲玩家的起始坐標c 1d 1存儲電腦的起始坐標*/

char ch

printf("\t╔══════════════════════════════╗\n”);printf("\t║║\n”);Printf("\t║歡迎來到五子棋遊戲項目。祝妳遊戲愉快,無限挑戰║\n”);printf("\t║║\n”);printf("\t║。_______________________.║\n”);printf("\t║| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | ║\n”);printf("\t║| I I | ║\n”);Printf("\t║ |我五子棋我| ║\n”);printf("\t║| I I | ║\n”);Printf("\t║ |我由肖誌鵬I | ║\n制作”);printf("\t║ |我_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _我| ║\n”);printf("\t║!_______________________!║\n”);printf("\t║。_[__________]_.║\n”);printf("\t║。___|_______________|___.║\n”);printf("\t║|:::_ _ _ _ | ║\n ");printf("\t║| ~ ~ ~[光盤]| ║\n”);printf("\t║!_____________________!║\n”);printf("\t║║\n”);printf("\t║║\n”);Printf("\t║冷星溪,月疏,二月花折,荷花白。║\n”);Printf("\t║雨月,金星追墨玉,松山,新夜,紅山。║\n”);Printf("\t║星月長峽水流不斷,白蓮掛雲。║\n”);Printf("\t║黑玉銀月倚明月,斜月堪稱朋友。║\n”);Printf("\t║二十六局,先棄兩局,又指向流浪彗星。║\n”);printf("\t║║\n”);printf("\t║║\n”);Printf("\t║ 1。人機大戰2。人人鬥║\n”);printf("\t║║\n”);printf("\t╚═════════════════════════════╝\n”);printf(" \ t \ t \ t請輸入1或2:");

scanf("%d ",& amp選擇);/*選擇模式:人機或人人*/

而(選擇!=1。& amp選擇!=2) {

Printf("輸入錯誤,請重新輸入:");scanf("%d ",& amp選擇);}

If(choice==1){ /*人機模式*/

系統(“cls”);

Printf("歡迎來到五子棋人機對戰!請輸入坐標(如13 6)。請輸入15 1 5。\ n \ n \ n ");

for(j = 0;j & lt15;j++)

for(I = 0;我& lt15;i++)

潘琪;/*空著棋盤*/

draw();

Printf("先按1,再按2:");scanf("%d ",& ampI);

而(我!=1。& amp我!=2) {printf("輸入錯誤,請重新輸入:");scanf("%d ",& ampI);}

If(i==1) {/*如果玩家先玩*/

Printf("請下載:");scanf("%d%d ",& amp壹,& ampb);

而((a & lt0 | | a & gt14)| |(b & lt;0 | | b & gt14)) {

Printf("坐標錯誤!請重新輸入:“);scanf("%d%d ",& amp壹,& ampb);}

a 1 = a;b 1 = b;x-;潘琪[b][a]=人;系統(“cls”);draw();

}

而(x!=0){

if(x==225) {

c = 7;d = 7;潘琪d c = COM;x-;系統(“cls”);draw();}/*計算機將在7 7下載*/

else { AI(& amp;c,& ampd);潘琪d c = COM;x-;系統(“cls”);draw();}/*計算機*/

c 1 = c;d 1 = d;/*在電腦上保存國際象棋圖案*/

If(win(c,d)){ /*計算機wins */

Printf("妳想後悔下棋嗎?請輸入y或n:");getchar();scanf("%c ",& ampch);

而(ch!= ' y ' & amp& ampch!='n') {printf("輸入錯誤,請重新輸入:");

scanf("%c ",& ampch);}

if(ch=='n') {

Printf("電腦正常,請不要灰心!!!\ n ");返回;}

else { x+= 2;潘琪[d][c]= SPA;潘琪[b 1][a 1]= SPA;

系統(“cls”);draw();}/*後悔棋*/

}

Printf("在% d% d中的計算機下\ n請輸入:",c,d);

scanf("%d%d ",& amp壹,& ampb);/*玩家的下壹步*/

if(a = = 15 & amp;& ampb==15) {

x+= 2;潘琪[d][c]= SPA;潘琪[b 1][a 1]= SPA;系統(“cls”);draw();

Printf("請輸入:");scanf("%d%d ",& amp壹,& ampb);}/*後悔棋*/

而((a & lt0 | | a & gt14)| |(b & lt;0 | | b & gt14)| |潘琪[b][a]=SPA) {

Printf("坐標錯誤或者這個位置有子!請重新輸入:“);

scanf("%d%d ",& amp壹,& ampb);}

a 1 = a;b 1 = b;x-;潘琪[b][a]=人;系統(“cls”);draw();

If(win(a,b)){ printf("電腦不過是浮雲!!!\ n ");

返回;}/*玩家獲勝*/

}

printf(" draw \ n ");

}

if(choice==2){

系統(“cls”);

Printf("歡迎來到大家的五子棋!請輸入坐標(如13 6)。請輸入15 15。\ n \ n \ n ");

for(j = 0;j & lt15;j++)

for(I = 0;我& lt15;i++)

潘琪;/*空著棋盤*/

draw();

而(x!=0){

Printf("1P請輸入:");scanf("%d%d ",& amp壹,& ampb);

if(a = = 15 & amp;& ampb==15) {

x+= 2;潘琪[d][c]= SPA;潘琪[b 1][a 1]= SPA;系統(“cls”);

draw();Printf("1P請輸入:");scanf("%d%d ",& amp壹,& ampb);}

而((a & lt0 | | a & gt14)| |(b & lt;0 | | b & gt14)| |潘琪[b][a]=SPA) {

Printf("坐標錯誤或者這個位置有子!請重新輸入:“);

scanf("%d%d ",& amp壹,& ampb);}

a 1 = a;b 1 = b;x-;潘琪[b][a]=人;系統(“cls”);draw();

Printf("在1p下的%d %d處。\n”,a,b);

If(win(a,b)){ printf("妳真棒!!!\ n ");返回;}/*玩家1獲勝*/

Printf("2P請輸入:");scanf("%d%d ",& ampc,& ampd);

if(c = = 15 & amp;& ampd==15) {

x+= 2;潘琪;潘琪[d 1][c 1]= SPA;系統(“cls”);draw();

Printf("2P請輸入:");scanf("%d%d ",& ampc,& ampd);}

while((c & lt;0 | | c >;14)| |(d & lt;0 | | d & gt14)| |潘琪!=SPA) {

Printf("坐標錯誤或者這個位置有子!請重新輸入:“);scanf("%d%d ",& ampc,& ampd);

}

c 1 = c;d 1 = d;x-;潘琪d c = COM;系統(“cls”);draw();

Printf("2P在% d% d下,\n ",c,d);

If(win(c,d)){ printf("妳真棒!!!\ n ");返回;}/*玩家2獲勝*/

}

printf(" draw \ n ");

}

}

Void draw() /*畫壹個棋盤*/

{

int i,j;

char p[15][15][4];

for(j = 0;j & lt15;j++)

for(I = 0;我& lt15;i++){

if(潘琪[j][i]==SPA) strcpy(p[j][i]," \ 0 ");

if(潘琪[j][i]==MAN) strcpy(p[j][i],"●\ 0 ");

if(潘琪[j][i]==COM) strcpy(p[j][i]," ◎\ 0 ");}

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \ n ");

printf(“┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n”);

for(i=0,j = 0;我& lt14;i++,j++){

printf(" % 2d │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% d \ n ",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[I][6]

printf(“├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n”);}

printf(" 14 │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s │% s│0 \ n ",p[14][0],p[14][1],p[14][2]

printf(“└—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n”);

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \ n ");

}

Int win(int p,int q) /*判斷勝利p q作為判斷點的坐標,勝利返回1,否則返回0 */

{

int k,n=1,m,P,Q;/* k存儲判斷點p q的狀態COM或MAN . P Q存儲判斷點的坐標。n是判斷的方向。m是壹個數字。*/

P = pQ = qk =潘琪[q][p];

而(n!=5){

m = 0;

while(k = =潘琪[q][p]){

m++;if(m==5)返回1;

伊薇(n & amp;p & amp;q);如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14)破位;

}

n+= 4;m-= 1;p = Pq = Q/*轉向判斷*/

while(k = =潘琪[q][p]){

m++;

if(m==5)返回1;

伊薇(n & amp;p & amp;q);如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14)破位;

}

n-= 3;p = Pq = Q/*如果不成功,判斷下壹組方向*/

}

返回0;

}

Void AI(int *p,int *q) /* computer *p *q返回下壹個坐標*/

{

int i,J,k,max=0,I,J;/* I J是低點的坐標*/

for(j = 0;j & lt15;j++)

for(I = 0;我& lt15;i++)

If(潘琪[j][i]==SPA){ /*走完棋盤,有空點時計算數值,取最大值點。*/

k =值(I,j);if(k & gt;= max){ I = I;J = jmax = k;}

}

* p = I;* q = J;

}

Int value(int p,int q) /*計算空點p q的值,返回為k */

{

int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp

int a[2][4][4]={40,400,3000,10000,6,10600,10000,20,120,200,0,6,10500,0,30,300,2500,5000,2,8,300,8000/*數組A存儲己方和對手32種棋型的值* * *己方0對手1主動0出拳1閑2閑3子數0-3(0表示1子數,3表示4子數)*/

而(n!=5){

k 1 =七星(n,p,q);n+= 4;/* k1,k2是兩個方向相反的棋號*/

k2 =七星(n,p,q);n-= 3;

if(k 1 & gt;k2){ temp = k 1;k 1 = k2;k2 =溫度;}/*做小號k1,大號k2 */

k 1 = k 1;K2 = k2/* K1 K2存儲K1 K2的數量*/

z 1 = k 1% 10;z2 = k2 % 10;k 1/= 10;k2/= 10;y 1 = k 1% 10;y2 = k2 % 10;k 1/= 10;k2/= 10;

x 1 = k 1% 10;X2 = k2 % 10;/* X Y Z代表我們自己的0和另壹個1活0沖1閑2沖3子號0-3(0代表1子號,3代表4子號)*/

if(K1==-1) {

如果(K2 & lt0){ k+= 0;繼續;} else k+= a[X2][Y2][Z2]+5;繼續;};/*空棋及其他*/

if(k 1 = =-2){ if(K2 & lt;0){ k+= 0;繼續;}

else k+= a[X2][Y2][Z2]/2;繼續;};/*邊界沖孔類型和其他*/

if(k 1 = =-3){ if(K2 & lt;0){ k+= 0;繼續;}

else k+= a[X2][Y2][Z2]/3;繼續;};/*邊界空白棋型和其他*/

if(((k 1 & gt;-1 & amp;& ampk 1 & lt;4)& amp;& amp((K2 & gt-1 & amp;& ampK2 & lt4)| |(K2 & gt;9 & amp& ampK2 & lt14)))| |((k 1 & gt;99 & amp& ampk 1 & lt;104);& amp((K2 & gt99 & amp& ampK2 & lt104)| |(K2 & gt;109。& ampK2 & lt114)))){

/*直播,直播,直播,沖刺,直播,直播,對沖,國際象棋任務*/

if(z 1+Z2 & gt;= 2){ k+= a[X2][Y2][3];繼續;}

else { k+= a[X2][Y2][z 1+Z2+1];繼續;}

}

if(((k 1 & gt;9 & amp& ampk 1 & lt;14)& amp;& amp(K2 & gt9 & amp& ampK2 & lt14))| |((k 1 & gt;109。& ampk 1 & lt;114);& amp(K2 & gt109。& ampK2 & lt114))){

/*自沖和自沖對沖的國際象棋分配*/

if(z 1+Z2 & gt;= 2){ k+= 10000;繼續;}

else { k+= 0;繼續;}

}

if(((k 1 & gt;-1 & amp;& ampk 1 & lt;4)& amp;& amp((K2 & gt99 & amp& ampK2 & lt104)| |(K2 & gt;109。& ampK2 & lt114)))| |((k 1 & gt;9 & amp& ampk 1 & lt;14)& amp;& amp((K2 & gt99 & amp& ampK2 & lt104)| |(K2 & gt;109。& ampK2 & lt114)))){

/*實況套期保值和實況套期保值的棋類分配*/

if(z 1 = = 3 | | Z2 = = 3){ k+= 10000;繼續;}

else { k+= a[X2][Y2][Z2]+a[x 1][y 1][z 1]/4;繼續;}

}

其他

{ k+= a[x 1][y 1][z 1]+a[X2][Y2][Z2];繼續;}/*其他棋類的賦值*/

}

返回k;

}

Int qixing(int n,int p,int q) /*返回n方向有空點p q的棋型個數,n是1-8方向,從右順時針開始*/

{

int k,m = 0;/*棋牌型號註釋:吉火000-003吉沖010-013獨活100-103對沖110-13孔伋020-

伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14)k =-2;/*邊界打孔類型*/

開關(潘琪[q][p]){

案例COM:{

m++;伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+9;返回k;}

while(潘琪[q][p]==COM) {

m++;伊薇(n & amp;p & amp;q);如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+9;返回k;}

}

if(潘琪[q][p]= = SPA)k = m-1;/*自己的活動棋型*/

else k = m+9;/*自己的打孔類型*/

}破;

辦案人:{

m++;伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+109;返回k;}

while(潘琪[q][p]==MAN) {

m++;伊薇(n & amp;p & amp;q);如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+109;返回k;}

}

if(潘琪[q][p]= = SPA)k = m+99;/*對方的可移動棋型*/

else k = m+109;/*對方的出拳類型*/

}破;

案例SPA:{

伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k =-3;返回k;}/*邊界空白棋型*/

開關(潘琪[q][p]){

案例COM:{

m++;伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+29;返回k;}

while(潘琪[q][p]==COM) {

m++;伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+29;返回k;}

}

if(潘琪[q][p]= = SPA)k = m+19;/*自己的空棋型*/

else k = m+29;/*我們自己的空棋型*/

}破;

辦案人:{

m++;伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+129;返回k;}

while(潘琪[q][p]==MAN) {

m++;伊薇(n & amp;p & amp;q);

如果(p & lt0 | | p & gt14 | | q & lt;0 | | q & gt14){ k = m+129;返回k;}

}

if(潘琪[q][p]= = SPA)k = m+119;/*對手的空棋型*/

else k = m+129;/*對方的空拳*/

}破;

案例SPA:k =-1;打破;/*空棋類型*/

}

}破;

}

返回k;

}

Void yiwei(int n,int *i,int *j) /*將坐標i j向n方向移動n = 1-8 */

{

開關(n){

案例1:* I+= 1;打破;

案例二:* I+= 1;* j+= 1;打破;

案例三:* j+= 1;打破;

案例四:* I-= 1;* j+= 1;打破;

案例5:* I-= 1;打破;

案例6:* I-= 1;* j-= 1;打破;

案例7:* j-= 1;打破;

案例8:* I+= 1;* j-= 1;打破;

}

}

  • 上一篇:印尼回國帶燕窩需要註意什麽?
  • 下一篇:藍藻爆發的治理措施有哪些?
  • copyright 2024編程學習大全網