欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言五子棋

程序员文章站 2022-04-07 15:48:48
...

先看一下效果

C语言五子棋

思路:

①函数封装绘制游戏界面

void InitGame()
{
 initgraph(600, 500);
 loadimage(NULL, "背景.jpg");
 mciSendString("open 琵琶语.mp3", 0, 0, 0);
 mciSendString("play 琵琶语.mp3", 0, 0, 0);//添加音乐
 setlinecolor(BLACK);
 for (int i = 25; i <= 500; i += 25)  //绘制棋盘线条
 {
  line(i, 0, i, 500);
  line(0,i,500,i);
 }
 line(501,0,501,500);
 outtextxy(510,100,"玩家1:黑");
 outtextxy(510,120,"玩家2:紫");
}

②绘制棋子

void PlayChess()
{
 MOUSEMSG m;
 int x, y, a=0, b=0;
 while (1)
 {
  m = GetMouseMsg();   //获取一个鼠标消息
  for(int i=1;i<=20;i++)
   for (int j = 1; j <= 20; j++)
   {
    if (abs(m.x - i * 25) < 12 && abs(m.y - j * 25) < 12)
    {
     x = i * 25;
     y = j * 25;
     a = i;
     b = j;
    }
   }
  if (m.uMsg == WM_LBUTTONDOWN)
  {
   if (board[a][b] != 0)
   {
    MessageBox(NULL,"已有棋子!","提示",MB_OK);
    continue;
   }
   if (flag % 2 == 0)
   {
    setfillcolor(BLACK);
    solidcircle(x,y,10);
    board[a][b] = 1;              //黑子置数组元素为1
   }
   else
   {
    setfillcolor(RGB(220,150,250));
    solidcircle(x, y, 10);
    board[a][b] = 2;              //紫色置数组元素为2
   }
   flag++;                 //控制不同颜色棋子的输出
  }
  if (judge(a, b))     //判断是否分出胜负的函数
  {
   if (flag % 2 == 1)
   {
    MessageBox(NULL, "黑棋获胜", "GAMEOVER!", MB_OK);
    exit(0);
   }
   else
   {
    MessageBox(NULL, "紫棋获胜", "GAMEOVER!", 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 <= 16 && 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 <= 16 && 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; j++,i++)
 {
  if (i>=0&&i<=16&&j >= 0 && j <= 16 && 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; j >=0,i<=a; j--,i++)
 {
  if (i>=0&&i<=16&&j >= 0 && j <= 16 && 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;
}

注:

判断时,分为四个方向,横,竖,左斜,右斜。

完整代码:

#include<graphics.h>
#include<mmsystem.h>
#include<math.h>
#pragma comment(lib,"winmm.lib")
int judge(int a, int b);
int flag = 0;
int board[20][20] = {0};
void InitGame()
{
 initgraph(600, 500);
 loadimage(NULL, "背景.jpg");
 mciSendString("open 琵琶语.mp3", 0, 0, 0);
 mciSendString("play 琵琶语.mp3", 0, 0, 0);
 setlinecolor(BLACK);
 for (int i = 25; i <= 500; i += 25)  //绘制棋盘线条
 {
  line(i, 0, i, 500);
  line(0,i,500,i);
 }
 line(501,0,501,500);
 outtextxy(510,100,"玩家1:黑");
 outtextxy(510,120,"玩家2:紫");
}
void PlayChess()
{
 MOUSEMSG m;
 int x, y, a=0, b=0;
 while (1)
 {
  m = GetMouseMsg();   //获取一个鼠标消息
  for(int i=1;i<=20;i++)
   for (int j = 1; j <= 20; j++)
   {
    if (abs(m.x - i * 25) < 12 && abs(m.y - j * 25) < 12)
    {
     x = i * 25;
     y = j * 25;
     a = i;
     b = j;
    }
   }
  if (m.uMsg == WM_LBUTTONDOWN)
  {
   if (board[a][b] != 0)
   {
    MessageBox(NULL,"已有棋子!","提示",MB_OK);
    continue;
   }
   if (flag % 2 == 0)
   {
    setfillcolor(BLACK);
    solidcircle(x,y,10);
    board[a][b] = 1;              //黑子置数组元素为1
   }
   else
   {
    setfillcolor(RGB(220,150,250));
    solidcircle(x, y, 10);
    board[a][b] = 2;              //紫色置数组元素为2
   }
   flag++;                 //控制不同颜色棋子的输出
  }
  if (judge(a, b))
  {
   if (flag % 2 == 1)
   {
    MessageBox(NULL, "黑棋获胜", "GAMEOVER!", MB_OK);
    exit(0);
   }
   else
   {
    MessageBox(NULL, "紫棋获胜", "GAMEOVER!", 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 <= 16 && 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 <= 16 && 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; j++,i++)
 {
  if (i>=0&&i<=16&&j >= 0 && j <= 16 && 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; j >=0,i<=a; j--,i++)
 {
  if (i>=0&&i<=16&&j >= 0 && j <= 16 && 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()
{
 InitGame();
 PlayChess();
 while (1);
 return 0;
}
相关标签: 小游戏