【项目】<1> c语言实现五子棋

本文介绍了一位作者为大作业设计的人机对战五子棋游戏。程序中,电脑会判断是否阻挡玩家或尝试连成线,若无法做到,则随机落子。然而,由于棋盘判断方式有限,电脑的智能程度还有待提高,作者计划在未来优化算法,全面考虑棋盘状态以提升电脑的下棋策略。
摘要由CSDN通过智能技术生成

最近要完成大作业,我设计了一个人机对战模式的五子棋游戏,其实五子棋除了人机对战模式其他的模式都很简单,只有人机对战模式最难。自己实现的这个程序电脑会判断是不是需要阻挡玩家,如果不需要电脑就会按照它自己的思路连成线,如果前两者都不可以,拿就用随机数函数在玩家最后一个棋子周围随机生成一个坐标。
不过自己写的这个程序,电脑还是不够智能,原因在于电脑决策前对于棋盘的遍历检查和判断的方式不够好,对于这个程序还是要进行优化,如果进行优化,就是对电脑下棋方式进行优化,在玩家落子之后进行怎么样的一个判断会更好。应该是把棋盘全部遍历一遍不仅仅关注玩家是否要赢,还要根据规则对整个棋盘进行一个完整的判断(在自己的算法能力提高以后再优化吧!)

//-----------------------五子棋游戏------------------------
//
//   实现一个五子棋的单机游戏,仅仅实现人机对战,人人对战十
//   分简单,没有实质性意义,在字符数字混合输入时,一定注意回车符
//
//   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(
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个很好的五子棋c语言源程序代码,最重要的是能运行正确!!! #include #include #include #include #include #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #define CROSSRD 0xd9 /*右下角点*/ #define CROSSL 0xc3 /*左边*/ #define CROSSR 0xb4 /*右边*/ #define CROSSU 0xc2 /*上边*/ #define CROSSD 0xc1 /*下边*/ #define CROSS 0xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义1号玩家的操作键键码*/ #define PLAY1UP 0x1157/*上移--'W'*/ #define PLAY1DOWN 0x1f53/*下移--'S'*/ #define PLAY1LEFT 0x1e41/*左移--'A'*/ #define PLAY1RIGHT 0x2044/*右移--'D'*/ #define PLAY1DO 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #define PLAY2UP 0x4800/*上移--方向键up*/ #define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/ #define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL 0 /*没有棋子*/ #define CHESS1 'O'/*一号玩家的棋子*/ #define CHESS2 'X'/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ 下载可看到完整的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值