最近要完成大作业,我设计了一个人机对战模式的五子棋游戏,其实五子棋除了人机对战模式其他的模式都很简单,只有人机对战模式最难。自己实现的这个程序电脑会判断是不是需要阻挡玩家,如果不需要电脑就会按照它自己的思路连成线,如果前两者都不可以,拿就用随机数函数在玩家最后一个棋子周围随机生成一个坐标。
不过自己写的这个程序,电脑还是不够智能,原因在于电脑决策前对于棋盘的遍历检查和判断的方式不够好,对于这个程序还是要进行优化,如果进行优化,就是对电脑下棋方式进行优化,在玩家落子之后进行怎么样的一个判断会更好。应该是把棋盘全部遍历一遍不仅仅关注玩家是否要赢,还要根据规则对整个棋盘进行一个完整的判断(在自己的算法能力提高以后再优化吧!)
//-----------------------五子棋游戏------------------------
//
// 实现一个五子棋的单机游戏,仅仅实现人机对战,人人对战十
// 分简单,没有实质性意义,在字符数字混合输入时,一定注意回车符
//
// Y:完成一局之后继续下一局 N:退出游戏
// 游戏中若玩家输入两个0表示玩家想要退出游戏
// 越写发现情况越多,越无法解决这个问题。
//----------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//------------------------【全局变量声明】-------------------
//用了很多全局变量,目的是在各函数之间通信
char chessboard[16][16]; //存储棋盘数据
int side_1=0; //记录棋手走的步数,当一局对战结束时应当置为0
int side_2=0;
char choice;
int row; int col; //记录某一方输入的位置
int flag_1=0; //记录玩家输赢的标志
int flag_2=0; //记录电脑输赢的标志
int sum[5]; //存放玩家或电脑下棋后四个方向的棋子数
int record_row=0,record_col=0; //记录电脑上一次下的地方
//-----------------------------------------------------------
//------------------------【实现函数声明】--------------------
void show_chessboard();
void model_input();
void play_input();
void com_input(); //是这个程序最难的地方
int judge();
int evaluate(int x,int y);
int ready_DSS();
//------------------------------------------------------------
//-------------------------【主程序入口】----------------------
int main()
{
printf("----------------------------五子棋游戏--------------------------\n");
printf(" Y:打完一局之后继续 N:退出游戏\n");
printf(" 玩家输入'0 0'表示玩家想中途退出\n");
printf("----------------------------------------------------------------\n\n\n");
tag_1: memset(chessboard,' ',500);
printf("是否要开始对战?Y or N\n");
model_input();
if(choice=='Y')
{
show_chessboard();
printf("玩家步数:%d 电脑步数:%d\n",side_1,side_2);
while(1)
{
play_input();
show_chessboard();
printf("玩家步数:%d 电脑步数:%d\n",side_1,side_2);
if((flag_1=evaluate(row,col))==1)
break;
com_input();
show_chessboard();
printf("玩家步数:%d 电脑步数:%d\n",side_1,side_2);
if((flag_2=evaluate(row,col))==1)
break;
}
if(flag_1==1)
printf("聪明的玩家你赢啦!\n");
else
printf("不好意思你输了!\n");
printf("继续玩吗? Y or N\n");
model_input();
if(choice=='Y')
goto tag_1;
else
exit(1);
}
return 0;
}
//-------------------------------------------------------------
//-----------------------【打印棋盘的函数】--------------------
void show_chessboard()
{
system("cls"); //先清理之前的,然后输出新的棋盘
printf(" 五子棋游戏,人机对战!\n\n");
//i为列号,j为行号
int i,j,k;
for(i=0;i<=30;i++)
{
if(i==0)
{
for(j=0;j<=15;j++)
{
if(j==0)
printf(" ");
else
{ if(j<10)
printf("%d ",j);
else
printf("%d ",j);
}
}
printf("\n");
}
else
{
if(i%2==1)
{
printf(" |");
for(j=1;j<=15;j++)
{
printf(