c语言黑白棋ai游戏源码

简介: c语言黑白棋ai游戏源码
#include <graphics.h> // EasyX_2011惊蛰版
#include <strstream>
#include <ctime>
#pragma comment(lib, "Winmm.lib")
#define T(c) ((c == 'B') ? 'W' : 'B')
using namespace std;
// 来自公众号:c语言与cpp编程
/*******************************定义全局变量*****************************/
const int difficult = 6;  // 难度
const int move[8][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1},
            {-1, -1}, {1, -1}, {1, 1}, {-1, 1}};
              // 八个方向扩展
char map[8][8];       // 棋盘
IMAGE img[5];       // 保存图片
int black, white;     // 双方的棋子数
int X, Y;         // 白棋的下子点
/**********************************函数声明*****************************/
void load(void);        // 加载素材
void print(void);       // 画棋盘
void draw(int, int, char);    // 下当前子
int judge(int, int, char);    // 判断当前是否可以落下
bool baidu(char);       // 判断是否有棋可吃
bool quit(char);        // 判断是否有棋存活
bool ask(void);         // 弹出对话框
int D(char, int);       // 动态规划
void play(void);        // 游戏过程
/**********************************定义函数*****************************/
void load(void)   // 加载素材
{
  // 加载图片
  loadimage(&img[0], "图片\\空位.bmp");
  loadimage(&img[1], "图片\\黑子.bmp");
  loadimage(&img[2], "图片\\白子.bmp");
  loadimage(&img[3], "图片\\黑子1.bmp");
  loadimage(&img[4], "图片\\白子1.bmp");
  // 加载音乐
  mciSendString("open 音乐\\背景音乐.wma", NULL, 0, NULL);
  mciSendString("open 音乐\\和局.wma", NULL, 0, NULL);
  mciSendString("open 音乐\\胜利.wma", NULL, 0, NULL);
  mciSendString("open 音乐\\失败.wma", NULL, 0, NULL);
  mciSendString("open 音乐\\下子.wma", NULL, 0, NULL);
  // 初始化棋盘
  initgraph(340, 340);
  IMAGE qipan;
  loadimage(&qipan, "图片\\棋盘.bmp");
  putimage(0, 0, &qipan);
  setorigin(26, 26);
  SetWindowText(GetHWnd(), "黑白棋AI版");
}
void print(void)  // 画棋盘
{
  int x, y;
  black = white = 0;
  for(x = 0; x < 8; x++)
    for(y = 0; y < 8; y++)
      switch(map[x][y])
      {
        case 0:
            putimage(37 * y, 37 * x, &img[0]);
          break;
        case 'B':
            putimage(37 * y, 37 * x, &img[1]);
          black++;
          break;
        case 'W':
            putimage(37 * y, 37 * x, &img[2]);
          white++;
          break;
      }
}
void draw(int x, int y, char a) // 下当前子
{
  char b = T(a);                  // 敌方子
  int i, x1, y1, x2, y2;
  bool sign;      
  for (i = 0; i < 8; i++)
  {
    sign = false;
    x1 = x + move[i][0];
    y1 = y + move[i][1];
    while (0 <= x1 && x1 < 8 && 0 <= y1 && y1 < 8 && map[x1][y1])
    {
      if(map[x1][y1] == b)
        sign = true;
      else
      {
        if(sign)
        {
          x1 -= move[i][0];
          y1 -= move[i][1];
          x2 = x + move[i][0];
          y2 = y + move[i][1];
          while (((x <= x2 && x2 <= x1) || (x1 <= x2 && x2 <= x)) && ((y <= y2 && y2 <= y1) || (y1 <= y2 && y2 <= y)))
          {
            map[x2][y2] = a;
            x2 += move[i][0];
            y2 += move[i][1];
          }
        }
        break;
      }
      x1 += move[i][0];
      y1 += move[i][1];
    }
  }
  map[x][y] = a;
}
int judge(int x, int y, char a) // 判断当前是否可以落下,同draw函数
{
  if(map[x][y])           // 如果当前不是空的返回0值
    return 0;
  char b = T(a);
  int i, x1, y1;
  int n = 0, sign;
  for (i = 0; i < 8; i++)
  {
    sign = 0;
    x1 = x + move[i][0];
    y1 = y + move[i][1];
    while (0 <= x1 && x1 < 8 && 0 <= y1 && y1 < 8 && map[x1][y1])
    {
      if(map[x1][y1] == b)
        sign++;
      else
      {
        n += sign;
        break;
      }
      x1 += move[i][0];
      y1 += move[i][1];
    }
  }
  return n;   // 返回可吃棋数
}
bool baidu(char c)  // 判断是否有棋可吃
{
  int x, y;
  for(x = 0; x < 8; x++)
    for(y = 0; y < 8; y++)
      if(judge(x, y, c))
        return true;
  return false;
}
bool quit(char c) // 判断是否有棋存活
{
  int x, y;
  bool b = false, w = false;
  for(x = 0; x < 8; x++)
    for(y = 0; y < 8; y++)
    {
      if(map[x][y] == c)
        return false;
    }
  return true;
}
bool ask(void)  // 弹出对话框
{
  HWND wnd = GetHWnd();
  int key;
  char str[50];
  ostrstream strout(str, 50);
  strout <<"黑:" <<black <<"  白:" <<white <<endl;
  if (black == white)
    strout <<"世界和平";
  else if(black > white)
    strout <<"恭喜你赢了!";
  else
    strout <<"小样,还想赢我。";
  strout <<"\n再来一局吗?" <<ends;
  if(black == white)
    key = MessageBox(wnd, str, "和局", MB_YESNO | MB_ICONQUESTION);
  else if(black > white)
    key = MessageBox(wnd, str, "黑胜", MB_YESNO | MB_ICONQUESTION);
  else
    key = MessageBox(wnd, str, "白胜", MB_YESNO | MB_ICONQUESTION);
  if(key == IDYES)
    return true;
  else
    return false;
}
int D(char c, int step)
{
  // 判断是否结束递归
  if (step > difficult) // 约束步数之内
    return 0;
  if (!baidu(c))
  {
    if (baidu(T(c)))
      return -D(T(c), step);
    else
      return 0;
  }
  int i, j, max = 0, temp, x, y;
  bool ans = false;
  // 建立临时数组
  char **t = new char *[8];
  for (i = 0; i < 8; i++)
    t[i] = new char [8];
  for (i = 0; i < 8; i++)
    for (j = 0; j < 8; j++)
      t[i][j] = map[i][j];
  // 搜索解法
  for (i = 0; i < 8; i++)
    for (j = 0; j < 8; j++)
      if (temp = judge(i, j, c))
      {
        draw(i, j, c);
        temp -= D(T(c), step + 1);
        if (temp > max || !ans)
        {
          max = temp;
          x = i;
          y = j;
          ans = true;
        }
        for (int k = 0; k < 8; k++)
          for (int l = 0; l < 8; l++)
            map[k][l] = t[k][l];
      }
  // 撤销空间
  for (i = 0; i < 8; i++)
    delete [] t[i];
  delete [] t;
  // 如果是第一步则标识白棋下子点
  if (step == 1)
  {
    X = x;
    Y = y;
  }
  return max; // 返会最优解
}
void play(void)     // 游戏过程
{
  MOUSEMSG m;
  int x, y;
  // 初始化棋子
  for(x = 0; x < 8; x++)
    for(y = 0; y < 8; y++)
      map[x][y] = 0;
  map[3][4] = map[4][3] = 'B';
  map[3][3] = map[4][4] = 'W';
  // 开始游戏
  print();
  mciSendString("play 音乐\\背景音乐.wma from 0 repeat", NULL, 0, NULL);
  do
  {
    if (baidu('B'))                   // 如果玩家有下子位置              
    {
      A:
      while(true)
      {
        m = GetMouseMsg();              // 获取鼠标消息
        if(m.uMsg == WM_LBUTTONDOWN && m.x - 26 < 37 * 8 && m.y - 26 < 37 * 8)
                              // 如果左键点击
          break;
      }
      x = (m.y - 26) / 37;
      y = (m.x - 26) / 37;
      if(judge(x, y, 'B'))              // 如果当前位置有效
      {
        draw(x, y, 'B');              // 下子
        mciSendString("play 音乐\\下子.wma from 0", NULL, 0, NULL);
        print();
        putimage(37 * y, 37 * x, &img[3]);      // 标识下子点
      }
      else
        goto A;
      if (quit('W'))                  // 计算机是否失败
        break;
    }
    if (baidu('W'))                   // 如果计算机有下子位置
    {
      clock_t start;
      start = clock();
      D('W', 1);                    // 搜索解法
      while (clock() - start < CLOCKS_PER_SEC);
      draw(X, Y, 'W');
      print();
      mciSendString("play 音乐\\下子.wma from 0", NULL, 0, NULL);
      putimage(37 * Y, 37 * X, &img[4]);  // 标识下子点
      if (quit('B'))                  // 玩家是否失败
        break;
    }
  }while (baidu('B') || baidu ('W'));
  // 播放庆祝音乐
  mciSendString("stop 音乐\\背景音乐.wma", NULL, 0, NULL);
  if (black > white)
    mciSendString("play 音乐\\胜利.wma from 0", NULL, 0, NULL);
  else if (black < white)
    mciSendString("play 音乐\\失败.wma from 0", NULL, 0, NULL);
  else
    mciSendString("play 音乐\\和局.wma from 0", NULL, 0, NULL);
}
// 主函数
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  load();
  do
  {
    play();
  } while(ask());
  // 关闭音乐
  mciSendString("close 音乐\\背景音乐.wma", NULL, 0, NULL);
  mciSendString("close 音乐\\和局.wma", NULL, 0, NULL);
  mciSendString("close 音乐\\胜利.wma", NULL, 0, NULL);
  mciSendString("close 音乐\\失败.wma", NULL, 0, NULL);
  mciSendString("close 音乐\\下子.wma", NULL, 0, NULL);
  closegraph();
  return 0;
}
/***********************************THE END************************************/
相关文章
|
5月前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
372 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
2月前
|
人工智能 自然语言处理 前端开发
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
DeepSite是基于DeepSeek-V3模型的在线开发工具,无需配置环境即可通过自然语言描述快速生成游戏、网页和应用代码,并支持实时预览效果,显著降低开发门槛。
552 93
DeepSite:基于DeepSeek的开源AI前端开发神器,一键生成游戏/网页代码
|
3月前
|
人工智能 开发工具 C++
利用通义灵码AI在VS Code中快速开发扫雷游戏:Qwen2.5-Max模型的应用实例
本文介绍了如何利用阿里云通义灵码AI程序员的Qwen2.5-Max模型,在VS Code中一键生成扫雷小游戏。通过安装通义灵码插件并配置模型,输入指令即可自动生成包含游戏逻辑与UI设计的Python代码。生成的游戏支持难度选择,运行稳定无Bug。实践表明,AI工具显著提升开发效率,但人机协作仍是未来趋势。建议开发者积极拥抱新技术,同时不断提升自身技能以适应行业发展需求。
22271 18
利用通义灵码AI在VS Code中快速开发扫雷游戏:Qwen2.5-Max模型的应用实例
|
7月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
233 8
|
4月前
|
人工智能
AI对话网站一键生成系统源码
可以添加进自己的工具箱,也可以嵌入自己博客的页面中,引流效果杠杠的,新拟态设计风格,有能力的大佬可以进行二开,仅提供学习,用户可输入网站名称、AI默认的开场白、AI头像昵称、AI网站中引流的你的网站等等内容,所有生成的网页全部保存到你的服务器上
100 27
AI对话网站一键生成系统源码
|
4月前
|
人工智能 算法 搜索推荐
AI大模型发展对语音直播交友系统源码开发搭建的影响
近年来,AI大模型技术的迅猛发展深刻影响了语音直播交友系统的开发与应用。本文探讨了AI大模型如何提升语音交互的自然流畅性、内容审核的精准度、个性化推荐的智能性以及虚拟主播的表现力,并分析其对开发流程和用户体验的变革。同时,展望了多模态交互、情感陪伴及元宇宙社交等未来发展方向,指出在把握机遇的同时需应对数据安全、算法偏见等挑战,以实现更智能、安全、有趣的语音直播交友平台。
|
4月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
386 0
|
7月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
236 2
|
7月前
|
人工智能 知识图谱
轻松搭建AI版“谁是卧底”游戏,muAgent框架让知识图谱秒变编排引擎,支持复杂推理+在线协同
蚂蚁集团推出muAgent,兼容现有市面各类Agent框架,同时可实现复杂推理、在线协同、人工交互、知识即用四大核心差异技术功能。
166 2
|
7月前
|
存储 人工智能 关系型数据库
拥抱Data+AI|玩家去哪儿了?解码Data+AI如何助力游戏日志智能分析
本文为阿里云瑶池数据库「拥抱Data+AI」系列连载第2篇,基于真实客户案例和最佳实践,探讨如何利用阿里云Data+AI解决方案应对游戏行业挑战,通过AI为游戏行业注入新的活力。文章详细介绍了日志数据的实时接入、高效查询、开源开放及AI场景落地,展示了完整的Data+AI解决方案及其实际应用效果。