这个五子棋程序没有用到最大值最小中的剪枝算法,只是简单的实现了电脑能根据当前棋盘找到最有利的一个位置 然后在此位置下子。 现在算是实现人工智能的一个小的开始吧。关于下棋规则并没有按标准的五子棋规则而是只要在任意一个方向有五颗棋子就算赢。简单的说就是没有禁手规则。写这个程序确实也锻炼了自己不少,就是说写一个什么程序或者工程我觉得不是拿到就开始写代码了。而是先把整体框架先想好 再去写代码我发现这样子做反而更高效,如果一开始就写代码你会发现写到中途写不下去了,这个没有想好,那个功能欠佳。。。等等一系列的问题
这个五子棋可以当做一个初始模板,因为许许多多的功能可以往里面添加 比如:记忆功能,选择不同的算法难度,悔棋。。。等等其他待加入的功能。
打了半天的字了,手软了 下面贴上我的代码。
源代码:
#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("\n\n\n\n\n");
printf(" ********************* 【五子棋】 *******************\n\n\n");
printf(" *********************【游戏说明】 ******************\n");
printf(" \n");
printf(" 【1】: 黑子由机器使用 \n");
printf(" -------------------------------------------------\n");
printf(" 【2】: 白子由人使用 \n");
printf(" \n");
printf(" ****************************************************\n");
printf("\n\n 【人机博弈按: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("\n");
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("\n");
}
}
void print(int x)
{
if (x == 1)
printf("\n\n 【五子棋--人机博弈】\n\n\n");
else printf("\n\n 【五子棋--双人博弈】\n\n\n");
}
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.