c语言五子棋小游戏
# 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;打破;
}
}