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;打破;

}

}