用C语言写五子棋游戏代码

分模块实现程序

设置棋盘,下棋过程,判断输赢

其中难点问题:棋盘的画法,下棋过程中的落子问题,五子连珠的判断问题,游戏情景的营造问题,其中落子问题是最困难的,需要寻找鼠标点击在屏幕上的坐标消息

#include<stdio.h>
#include<windows.h>
#include<easyx.h> 
//#include<graphics.h>
#include<MMSystem.h>
#pragma comment(lib,"winmm.lib")
#include<math.h>
#include<iostream>
using namespace std;

#define  WIDE 30//每条线条间隔
#define  SPACE (3*WIDE)
# define ROW 15
# define COL 15



void BeforeGame();
void playChess();
//void mousePressMsg(ExMessage m );
int judge(int a,int b);

int flag=0;
int board[15][15]={0};
int x=0,y=0;
int a=0,b=0;
void BeforeGame()
{
    initgraph(600, 800);
 cleardevice();
 settextcolor(GREEN);                 //设置文字颜色
 setbkmode(TRANSPARENT);                //设置窗口透明
 settextstyle(128, 0, "宋体");              //设置字体大小、宽度、字体
 outtextxy(100, 100, "五子棋");
 setlinecolor(GREEN);
 rectangle(150, 300, 450, 650);
 rectangle(160, 310, 440, 640);
 line(160, 420, 440, 420);
 line(160, 530, 440, 530);
 settextstyle(65, 0, "华文琥珀");
 outtextxy(170, 340, "人机大战");
 outtextxy(170, 450, "双人对战");
 outtextxy(170, 560, "联系作者");
 setlinecolor(WHITE);
 settextcolor(WHITE);
 settextstyle(23, 0, "华文琥珀");
 outtextxy(527, 37, "音乐");
 circle(550, 50, 25);
 
 Sleep(800);
}
void initGame()
{
    initgraph(650,650);//创建窗口
    /*setbkcolor(LIGHTCYAN);
    cleardevice();*/
    loadimage(NULL,"bk.jpg");//加载图片
    mciSendString("open 前奏.mp3 ",0,0,0);
    mciSendString("play 前奏.mp3",0,0,0);

    setlinecolor(BLACK);
    for(int i=0;i<15;i++)
    {line(SPACE,i*WIDE+SPACE,14*WIDE+SPACE,i*WIDE+SPACE);//画横线
     line(i*WIDE+SPACE,SPACE,i*WIDE+SPACE,14*WIDE+SPACE);//画竖线
    }

    //外边框(增粗)
       setlinestyle(PS_SOLID,2);
       rectangle(SPACE,SPACE,14*WIDE+SPACE,14*WIDE+SPACE);
       //画点
       setfillcolor(BLACK);
       solidcircle(SPACE+7*WIDE,SPACE+7*WIDE,7);//正中间
       solidcircle(SPACE+(7-4)*WIDE,SPACE+(7-4)*WIDE,7);//左上
       solidcircle(SPACE+(7-4)*WIDE,SPACE+(7+4)*WIDE,7);//左下
       solidcircle(SPACE+(7+4)*WIDE,SPACE+(7-4)*WIDE,7);//右上
       solidcircle(SPACE+(7+4)*WIDE,SPACE+(7+4)*WIDE,7);//右下

       outtextxy(540,250,"玩家1:黑棋");
       outtextxy(540,400,"玩家2:白棋");


}    


//下棋
void playChess()
{
  ExMessage m;//ExMessage这个结构体用于保存消息,定义一个变量m,   m.x,m.y鼠标当前坐标,m.message m的消息



  while(1)
    {
        m=getmessage(EM_MOUSE);
         if(m.message==WM_LBUTTONDOWN)
          {
                     for(int i=0;i<15;i++)
                       {
                         for(int j=0;j<15;j++)
                           {
                              if(abs(m.x-(i*WIDE+SPACE))<15&&abs(m.y-(j*WIDE+SPACE))<15)
                                {
                                   x=i*WIDE+SPACE;
                                   y=j*WIDE+SPACE;
                                   a=i;
                                   b=j;
                        
                                }
                              }
                        }

        //重叠
    if(board[a][b]!=0)
      {
        MessageBox(NULL,"这里已有棋子 请重新选择","提示",MB_OK);//MessageBox (句柄, 显示内容,标题,MB_OK) 界面显示函数
            continue;//退出循环重新进入
        
        }
    if(flag%2==0)
    {
        setfillcolor(BLACK);
        solidcircle(x,y,12);
        board[a][b]=1;
        flag++;
     }
    else
    {
        setfillcolor(WHITE);
        solidcircle(x,y,12);
         board[a][b]=2;
         flag++;
     }

          
    if(judge(a,b))
        {
            if(flag%2==0)
                {    
                    mciSendString("open 结束1.mp3 ",0,0,0)    ;
                    mciSendString("play 结束1.mp3",0,0,0);
                    MessageBox(NULL,"玩家2胜利","游戏结束",MB_OK);
                    exit(0);
                }
    if(flag==224)
        {
                        MessageBox(NULL,"平局","游戏结束",MB_OK);
        }
    else
    {
        mciSendString("open 结束2.mp3 ",0,0,0);
        mciSendString("play 结束2.mp3",0,0,0);
        MessageBox(NULL,"玩家1胜利","游戏结束",MB_OK);
        exit(0);
     }
     }
         
}
               
        
 }
        
            
  }    
    
   

//判断输赢
int judge(int a,int b)
{
    int i,j;
    int t=2-flag%2;
    for(i=a-4,j=b;i<=a;i++)//横向五子连珠
    {
        if(i>=0&&i<11&&t==board[i][j]&&t==board[i+1][j]&&t==board[i+2][j]&&t==board[i+3][j]&&t==board[i+4][j])
           return 1;
    }
    for(i=a,j=b-4;j<=b;j++)//纵向五子连珠
    {
        if(j>=0&&j<11&&t==board[i][j]&&t==board[i][j+1]&&t==board[i][j+2]&&t==board[i][j+3]&&t==board[i][j+4])
           return 1;
    }
    for(i=a-4,j=b-4;i<=a,j<=b;i++,j++)//左上到右下五子连珠
    {
        if(i>=0&&i<11&&j>=0&&j<11&&t==board[i][j]&&t==board[i+1][j+1]&&t==board[i+2][j+2]&&t==board[i+3][j+3]&&t==board[i+4][j+4])
           return 1;
    }
    for(i=a-4,j=b+4;i<=a,j>=b;i++,j--)//左下到右上五子连珠
    {
        if(i>=0&&i<11&&j>=0&&j<11&&t==board[i][j]&&t==board[i+1][j-1]&&t==board[i+2][j-2]&&t==board[i+3][j-3]&&t==board[i+4][j-4])
           return 1;
    }
    return 0;

}


int main()
{
    BeforeGame();
    initGame(); 
    playChess();
              
 system("pause");
 return 0;

}

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值