C语言 五子棋2

#include<windows.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<time.h>
#define len 15


int chessmessage[len][len];
int worb = 2;
int count = 0;
int m;


void star_print();  //打印游戏开始函数
void movegb(char key); //光标的移动
void renjiboyi();   //人机博弈
void shuangrenboyi(); //双人博弈
void initial();    //初始化棋盘数据
void borad_print();  //打印棋盘数据
int chessjudge(int x, int y); //判断能否下子
int chessjudgewin(int x, int y, int worb);  //判断输赢
int chesscomputer(); //电脑下棋
int chessscore(int x, int y, int worb); //棋盘权值函数
void print(int m);


struct zuobiao
{
int x;
int y;
}weizhi = { 7, 9 };


void gotoxy(int x, int y) //建立坐标函数
{
COORD c;
c.X = x;
c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}










void star_print()
{
printf("




");
printf("             ********************* 【五子棋】 *******************


");
printf("             *********************【游戏说明】 ******************
");
printf("                                                               
");
printf("                   【1】: 黑子由机器使用                       
");
printf("                -------------------------------------------------
");
printf("                   【2】: 白子由人使用                         
");
printf("                                                               
");
printf("             ****************************************************
");
printf("

     【人机博弈按:1】 【双人博弈按:2】 【退出按:Esc】");
}


void borad_print()
{


int i, j, k;


print(m);


for (j = 0; j<len; j++)
{
for (i = 0; i<len; i++)
{


if (chessmessage[j][i] == 1)
printf("");
else if (chessmessage[j][i] == 2)
printf("");
else if (j == 0 && i == 0)
printf("");
else if (j == 0 && i == len - 1)
printf("");
else if (j == len - 1 && i == 0)
printf("");
else if (j == len - 1 && i == len - 1)
printf("");
else if (j == 0 && i != 0 && i != len - 1)
printf("");
else if (j != 0 && j != len - 1 && i == 0)
printf("");
else if (j != 0 && j != len - 1 && i == len - 1)
printf("");
else if (j == len - 1 && i != 0 && i != len - 1)
printf("");
else if (j != 0 && j != len - 1 && i != 0 && i != len - 1)
printf("");


if (j>0 && j<len - 1 && i<len - 1)
printf("");




if (j == 0 && i != len - 1)
printf("");
else if (j == len - 1 && i != len - 1)
printf("");








}


printf("
");


if (j >= 0 && j<len - 1)
{
for (k = 0; k<len; k++)
{
if (k == 0 || k == len - 1)
printf("");
else printf("");
}


if (j == 2)
printf(" 【 操作 - PS 】");
if (j == 4)
printf(" 【 从玩按:n 】");
if (j == 5)
printf(" 【返回按:Backspace】");
if (j == 6)
printf(" 【退出按:Esc】");
if(j == 7)
printf(" 【 空格下子  】");
if(j == 8)
printf(" 【上,下,左,右】");
if(j == 9)
printf(" 【  移动光标 】");


}
printf("
");


}
}


void print(int x)
{
if (x == 1)
printf("

                  【五子棋--人机博弈】


");
else printf("

                  【五子棋--双人博弈】


");
}


void movegb(char key)/*光标的移动*/
{
switch (key)
{


case 0x48:if (weizhi.y>1)weizhi.y--; if (weizhi.y<2)weizhi.y = len + 1; break;
/*光标向上移动*/


case 0x50:if (weizhi.y<len + 2)weizhi.y++; if (weizhi.y>len + 1)weizhi.y = 2; break;
/*光标向下移动*/


case 0x4B:if (weizhi.x>-1)weizhi.x--; if (weizhi.x<0)weizhi.x = len - 1; break;
/*光标向左移动*/


case 0x4D:if (weizhi.x<len)weizhi.x++; if (weizhi.x>len - 1)weizhi.x = 0; break;
/*光标向右移动*/
}
gotoxy(4 * weizhi.x, 2 * weizhi.y);
}




void initial()
{
int i, j;


for (j = 0; j<len; j++)    //重置对局数据
{
for (i = 0; i<len; i++)
{
chessmessage[i][j] = 0;
}
}


worb = 2;


count = 0;


system("cls");






borad_print();


weizhi.x = 50;
weizhi.y = 50;


gotoxy(weizhi.x, weizhi.y);


}


int chessjudge(int x, int y)
{
if (chessmessage[x][y] != 0)
return 1;


return 0;
}




int chessjudgewin(int x, int y, int worb)
{
int row, col, count;


row = x, col = y; count = 0;
while (chessmessage[row][col] == worb && col < len)
{
count++;
col++;
}
col = y - 1;
while (chessmessage[row][col] == worb && col >= 0)
{
count++;
col--;
}
if (count >= 5)
return 1;


row = x, col = y; count = 0;
while (chessmessage[row][col] == worb && row < len)
{
count++;
row++;
}
row = x - 1;
while (chessmessage[row][col] == worb && row >= 0)
{
count++;
row--;
}
if (count >= 5)
return 1;


row = x, col = y; count = 0;
while (chessmessage[row][col] == worb && col < len && row < len)
{
count++;
col++;
row++;
}
col = y - 1, row = x - 1;
while (chessmessage[row][col] == worb && col >= 0 && row >= 0)
{
count++;
col--;
row--;
}
if (count >= 5)
return 1;


row = x, col = y; count = 0;
while (chessmessage[row][col] == worb && col < len && row >= 0)
{
count++;
col++;
row--;
}
col = y - 1, row = x + 1;
while (chessmessage[row][col] == worb && col >= 0 && row < len)
{
count++;
col--;
row++;
}
if (count >= 5)
return 1;


return 0;


}


int chesscomputer()
{
int i, j, cscore, cscorel, pscore, pscorel, row1, col1, row2, col2, x, y;


cscore = pscore = 0; row1 = row2 = col1 = col2 = 0;
if (count == 1)
{
srand((unsigned)time(NULL));
row1 = rand() % 15;
col1 = rand() % 15;
count++;


while (chessjudge(row1, col1))
{
row1 = rand() % 15;
col1 = rand() % 15;
}


chessmessage[row1][col1] = 1;
worb = 3 - worb;


x = abs(weizhi.x - col1);
y = abs(weizhi.y - 2 - row1);


if (weizhi.x - col1>0)
for (i = 0; i < x; i++)
movegb(0x4B);
else for (i = 0; i < x; i++)
movegb(0x4D);


if (weizhi.y - 2 - row1>0)
for (i = 0; i < y; i++)
movegb(0x48);
else for (i = 0; i < y; i++)
movegb(0x50);


printf("");


}


else


{
for (i = 0; i < len; i++)
{
for (j = 0; j < len; j++)
{
if (!chessjudge(i, j))
{
cscorel = chessscore(i, j, 1);


if (cscorel > cscore)
{
cscore = cscorel;
row1 = i;
col1 = j;
}


pscorel = chessscore(i, j, 2);


if (pscorel > pscore)
{
pscore = pscorel;
row2 = i;
col2 = j;
}
}
}
}


if (count == 3)
{
chessmessage[row1][col1] = 1;
worb = 3 - worb;
count++;
x = abs(weizhi.x - col1);
y = abs(weizhi.y - 2 - row1);


if (weizhi.x - col1>0)
for (i = 0; i < x; i++)
movegb(0x4B);
else for (i = 0; i < x; i++)
movegb(0x4D);


if (weizhi.y - 2 - row1>0)
for (i = 0; i < y; i++)
movegb(0x48);
else for (i = 0; i < y; i++)
movegb(0x50);


printf("");




}


else{


if (cscore >= pscore)
{
chessmessage[row1][col1] = 1;
worb = 3 - worb;
count++;
x = abs(weizhi.x - col1);
y = abs(weizhi.y - 2 - row1);


if (weizhi.x - col1>0)
for (i = 0; i < x; i++)
movegb(0x4B);
else for (i = 0; i < x; i++)
movegb(0x4D);


if (weizhi.y - 2 - row1>0)
for (i = 0; i < y; i++)
movegb(0x48);
else for (i = 0; i < y; i++)
movegb(0x50);


printf("");




if (chessjudgewin(row1, col1, 1))
{
gotoxy(22, 17);
printf("【 黑子胜利 】");
return 1;
}
}


else
{
chessmessage[row2][col2] = 1;
worb = 3 - worb;
count++;
x = abs(weizhi.x - col2);
y = abs(weizhi.y - 2 - row2);


if (weizhi.x - col2>0)
for (i = 0; i < x; i++)
movegb(0x4B);
else for (i = 0; i < x; i++)
movegb(0x4D);


if (weizhi.y - 2 - row2>0)
for (i = 0; i < y; i++)
movegb(0x48);
else for (i = 0; i < y; i++)
movegb(0x50);
printf("");






if (chessjudgewin(row2, col2, 1))
{
gotoxy(22, 17);
printf("【 黑子胜利 】");
return 1;
}
}
}
}




return 0;
}




 int chessscore(int x, int y, int worb)   //棋盘权值函数
{
int count3, count4, sumscore = 0;
char u, d, l, r, lu, ld, ru, rd;    //u上 d下 l左 r右 lu左斜上 ld左斜下 ru右斜上 rd右斜下
int row, col, count1, count2;   //1表示横向 2表示竖向 3表示斜上方向 4表示斜下方向


count1 = count2 = count3 = count4 = 1;
l = r = u = d = lu = ld = ru = rd = 0;


chessmessage[x][y] = worb;      //模拟下棋




/*---------------------------------------①判断横向棋子并记录空格子---------------------------*/
row = x, col = y + 1;
while (chessmessage[row][col] == worb && col < len)
{
count1++;
col++;
}
while (col < len && chessmessage[row][col] == 0)
{
r++;
col++;
}
row = x, col = y - 1;
while (chessmessage[row][col] == worb && col >= 0)
{
count1++;
col--;
}
while (col >= 0 && chessmessage[row][col] == 0)
{
l++;
col--;
}
/*------------------------------------------------------------------------------------------*/




/*-------------------------------------②判断竖向棋子并记录空格子---------------------------*/
row = x + 1, col = y;
while (chessmessage[row][col] == worb && row < len)
{
count2++;
row++;
}
while (row < len && chessmessage[row][col] == 0)
{
d++;
row++;
}
row = x - 1, col = y;
while (chessmessage[row][col] == worb && row >= 0)
{
count2++;
row--;
}
while (row >= 0 && chessmessage[row][col] == 0)
{
u++;
row--;
}
/*------------------------------------------------------------------------------------------*/


/*------------------------------------③判断斜上向棋子并记录空格子--------------------------*/
row = x - 1, col = y + 1;
while (chessmessage[row][col] == worb && col < len && row >= 0)
{
count3++;
col++;
row--;
}
while (col < len && row >= 0 && chessmessage[row][col] == 0)
{
ru++;
col++;
row--;
}
row = x + 1, col = y - 1;
while (chessmessage[row][col] == worb && col >= 0 && row < len)
{
count3++;
col--;
row++;
}
while (col >= 0 && row < len && chessmessage[row][col] == 0)
{
ld++;
col--;
row++;
}
/*------------------------------------------------------------------------------------------*/






/*-----------------------------------④判断斜下向棋子并记录空格子---------------------------*/
row = x + 1, col = y + 1;
while (chessmessage[row][col] == worb && col < len && row < len)
{
count4++;
col++;
row++;
}
while (col < len && row < len && chessmessage[row][col] == 0)
{
rd++;
col++;
row++;
}
row = x - 1, col = y - 1;
while (chessmessage[row][col] == worb && col >= 0 && row >= 0)
{
count4++;
col--;
row--;
}
while (col >= 0 && row >= 0 && chessmessage[row][col] == 0)
{
lu++;
col--;
row--;
}
/*------------------------------------------------------------------------------------------*/


chessmessage[x][y] = 0;




if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)    //判断五子
{
return sumscore = 5000000;
}




if ((count1 == 4 && count2 == 4 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 4 && count3 == 4 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 4 && count4 == 4 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 4 && count3 == 4 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 4 && count4 == 4 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 4 && count4 == 4 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))   //判断双活四
{
return sumscore = 4000000;
}






if ((count1 == 4 && l >= 1 && r >= 1) || (count2 == 4 && u >= 1 && d >= 1) ||
(count3 == 4 && ru >= 1 && ld >= 1) || (count4 == 4 && lu >= 1 && rd >= 1))   //判断活四
{
return sumscore = 800000;
}




if ((count1 == 4 && ((l == 0 && r >= 1) || (l >= 1 && r == 0))) || (count2 == 4 && ((u == 0 && d >= 1) || (u >= 1 && d == 0))) ||
(count3 == 4 && ((ld == 0 && ru >= 1) || (ld >= 1 && ru == 0))) || (count4 == 4 && ((lu == 0 && rd >= 1) || (lu >= 1 && rd == 0))))
{
sumscore = sumscore + 35000;  //成四
}


if( ( count1 == 3 && count2 == 3 && l >=1 && r >=1 && u >=1 && d >=1) ||
( count1 == 3 && count3 == 3 && l >=1 && r >=1 && ru >=1 && ld >=1 ) ||
( count1 == 3 && count4 == 3 && l >=1 && r >=1 && rd >=1 && lu >=1 ) ||
( count2 == 3 && count3 == 3 && u >=1 && d >=1 && ru >=1 && ld >=1 ) ||
( count2 == 3 && count4 == 3 && u >=1 && d >=1 && lu >=1 && rd >=1 ) ||
( count3 == 3 && count4 == 3 && ru >=1 && ld >=1 && lu >=1 && rd >=1) )   //判断双活三
{
return sumscore + 400000;
}








if ((count1 == 3 && l >= 1 && r >= 1) || (count2 == 3 && u >= 1 && d >= 1) ||
(count3 == 3 && ru >= 1 && ld >= 1) || (count4 == 3 && lu >= 1 && rd >= 1))
{
sumscore = sumscore + 60000;
return sumscore;
}     //判断活三








if ((count1 == 2 && count2 == 2 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 2 && count3 == 2 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 2 && count4 == 2 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 2 && count3 == 2 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 2 && count4 == 2 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 2 && count4 == 2 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
{
sumscore = sumscore + 20000;   //判断双活二
}




if ((count1 == 2 && l >= 1 && r >= 1) || (count2 == 2 && u >= 1 && d >= 1) ||
(count3 == 2 && ru >= 1 && ld >= 1) || (count4 == 2 && lu >= 1 && rd >= 1))
{
sumscore = sumscore + 10000;     //单活二
}


return sumscore;


}








void renjiboyi()
{
int c = 0,w = 0;
char key;


m = 1;



while (1)
{


initial();
w = 0;






while (1)
{


key = _getch();

if(w == 0)
{
weizhi.x = 7;
weizhi.y = 9;
gotoxy(weizhi.x, weizhi.y);
w++;
}


if (key == 27)   //退出游戏
{
exit(0);
}
else if (key == 8)   //返回主界面
{
break;
}
else if (key == 110)  //重新玩
{
break;
}
else if (key == 32)
{
if (count == len * len)
{
gotoxy(22, 13);
printf("【 平局 】");
count = 0;
break;
}
else if (worb == 2)
{


if (chessjudge(weizhi.y - 2, weizhi.x) == 0)
{
printf("");


chessmessage[weizhi.y - 2][weizhi.x] = worb;


count++;




if (chessjudgewin(weizhi.y - 2, weizhi.x, worb))
{
gotoxy(22, 15);
printf("【 白子胜利 】");

key = _getch();

while(key != 27 && key != 110 && key != 8)
key = _getch();


if(key == 8 || key == 110)
break;
else exit(0);
}


else
{
worb = 3 - worb;

c = chesscomputer();


if(c)
{
key = _getch();

while(key != 27 && key != 110 && key != 8)
{
key = _getch();
}


if(key == 8 || key == 110)
break;
else exit(0);
}
}





}


}


}
else  //光标移动
{
key = _getch();
movegb(key);
}


}




if (key == 8)
break;


}
}




void shuangrenboyi()
{
int w = 0;
char key;
m = 2;


while(1)
{
initial();
w = 0;


while(1)
{
key = _getch();

if(w == 0)
{
weizhi.x = 7;
weizhi.y = 9;
gotoxy(weizhi.x, weizhi.y);
w++;
}



if (key == 27)   //退出游戏
{
exit(0);
}
else if (key == 8)   //返回主界面
{
break;
}
else if (key == 110)  //重新玩
{
break;
}
else if(key == 32)
{
if(worb == 2)
{


if(chessjudge(weizhi.y-2,weizhi.x) == 0)
{
chessmessage[weizhi.y-2][weizhi.x] = 2;
printf("");
count++;
if(chessjudgewin(weizhi.y-2,weizhi.x,worb))
{
gotoxy(22, 15);
printf("【 白子胜利 】");

key = _getch();

while(key != 27 && key != 110 && key != 8)
key = _getch();


if(key == 8 || key == 110)
break;
else exit(0);




}


worb = 3 - worb;
}


}


else
{
if(chessjudge(weizhi.y-2,weizhi.x) == 0)
{
chessmessage[weizhi.y-2][weizhi.x] = 1;
printf("");
count++;
if(chessjudgewin(weizhi.y-2,weizhi.x,worb))
{
gotoxy(22, 15);
printf("【 黑子胜利 】");


key = _getch();

while(key != 27 && key != 110 && key != 8)
key = _getch();


if(key == 8 || key == 110)
break;
else exit(0);
}


worb = 3 - worb;
}
}

}
else
{
key = _getch();

movegb(key);
}


}


if (key == 8)
break;
}


}








int main()
{
int choice = 0;


system("title  【五子棋】   ---   [14003101班-冉云杰] 制作");
system("color f2");
system("mode con cols=83 lines=35");


while (1)
{
star_print();


printf("


             【请输入你的选择】:");


while (1)
{
choice = _getch();


if (choice == 27)
{
exit(0);
}


else if (choice == 49)  //人机博弈
{
renjiboyi();
break;
}
else if (choice == 50)  //双人博弈
{
shuangrenboyi();
break;
}


}


system("cls");


}


return 0;
}
原文地址:https://www.cnblogs.com/wumac/p/7808789.html