鱼C论坛

 找回密码
 立即注册
查看: 1788|回复: 6

[技术交流] 自己做的简易象棋框架

[复制链接]
发表于 2020-2-14 07:50:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
自己做的简易象棋框架,使用的都是c语言的基础,比较简单,应该都看得懂。使用控制台,不能显示颜色,每下一步都打印一幅新的棋盘。虽然简陋,但只要把输出界面改一下就可以变成windows应用。麻雀虽小,但我觉得这些是基础,再牛逼的象棋都得有类似的地基。
棋子使用结构体,棋盘使用指针指向棋子。打印棋盘用printf();
我发的代码有三个函数,init()//给棋盘棋子赋值,show(qiz* board[11][10])//打印棋盘,move(int x[4])//将board[x[0]][x[1]]处的棋子移动到board[x[2]][x[3]]
可以输入如1 2 3 3的数字移动棋子,注意先行再列。
还有一些函数我会在以后发出来,完整代码已经有AI了,智商有点低,但不会粗心,我都经常被坑;使用《数据结构与算法分析》中的回溯算法,只是输出界面还是一样简陋。
以下是手机c4droid运行效果图:
Screenshot_2020-02-14-07-42-24.png
代码:

  1. #define _CRT_SECURE_NO_WARNINGS//使用visual stdio想要使用scanf()必须定义这句话
  2. #include <stdio.h>
  3. #include <string.h>
  4. int init();//给棋盘棋子赋值,返回值没有意义!
  5. int move(int x[4]);//将board[x[0]][x[1]]处的棋子移动到board[x[2]][x[3]],返回值没有意义!
  6. typedef struct//棋子结构
  7. {
  8.     int alive , x //行 ,棋子在棋盘上的坐标
  9.         , y //列 ,棋子在棋盘上的坐标
  10.         , country ;//红为1,黑为2
  11.     char const* sort ;//棋子种类,车马将士象兵炮
  12. }qiz;
  13. int show(qiz* board[11][10]);//打印棋盘,返回值没有意义!
  14. qiz* board[11][10] = { 0 };//棋盘,使用指针指向棋子
  15. qiz red[16], black[16];//用来存放红、黑棋子,方便管理
  16. int main()
  17. {
  18.     int x[4];
  19.     init();//初始化
  20.     show(board);
  21.     while (1)
  22.     {
  23.         for(int i=0;i<4;i++)
  24.         {
  25.             scanf("%d", &x[i]);
  26.         }
  27.         move(x);
  28.         show(board);
  29.     }
  30.     return 0;
  31. }
  32. int show(qiz* board[11][10])//打印棋盘,返回值没有意义!
  33. {
  34.     for (int i = 10; i >= 1; i--)
  35.     {
  36.         for (int j = 1; j <= 9; j++)
  37.         {
  38.             if (board[i][j] == 0)printf("  ");//打印两个空格。
  39.             else printf("%s", board[i][j]->sort);
  40.         }
  41.         printf("%d\n", i);
  42.     }
  43.     for (int j = 1; j <= 9; j++)
  44.         printf("%d ", j);
  45.     printf("\n");
  46.     return 0;
  47. }
  48. int init()//给棋盘棋子赋值,返回值没有意义!
  49. {
  50.     for (int i = 0; i <= 15; i++)//country
  51.     {
  52.         red[i].country = 1;
  53.         black[i].country = 2;
  54.     }
  55.     for (int i = 1; i <= 9; i++)
  56.     {
  57.         board[1][i] = &red[i - 1];
  58.         board[10][i] = &black[i - 1];
  59.         red[i - 1].y = i; red[i - 1].x = 1;
  60.         black[i - 1].y = i; black[i - 1].x = 10;

  61.     }
  62.     for (int i = 1, j = 9; i <= 10; j++, i += 2)
  63.     {
  64.         board[4][i] = &red[j];
  65.         red[j].y = i;
  66.         red[j].x = 4;
  67.         board[7][i] = &black[j];
  68.         black[j].y = i;
  69.         black[j].x = 7;

  70.     }

  71.     board[3][2] = &red[14]; board[3][8] = &red[15]; red[14].x = 3; red[14].y = 2; red[15].x = 3; red[15].y = 8;
  72.     board[8][2] = &black[14]; board[8][8] = &black[15]; black[14].x = 8; black[14].y = 2; black[15].x = 8; black[15].y = 8;

  73.     red[0].sort = "车";
  74.     red[1].sort = "马";
  75.     red[2].sort = "象";
  76.     red[3].sort = "士";
  77.     red[4].sort = "将";
  78.     red[5].sort = "士";
  79.     red[6].sort = "象";
  80.     red[7].sort = "马";
  81.     red[8].sort = "车";
  82.     red[9].sort = "兵";
  83.     red[10].sort = "兵";
  84.     red[11].sort = "兵";
  85.     red[12].sort = "兵";
  86.     red[13].sort = "兵";
  87.     red[14].sort = "炮";
  88.     red[15].sort = "炮";

  89.     black[0].sort = "车";
  90.     black[1].sort = "马";
  91.     black[2].sort = "象";
  92.     black[3].sort = "士";
  93.     black[4].sort = "将";
  94.     black[5].sort = "士";
  95.     black[6].sort = "象";
  96.     black[7].sort = "马";
  97.     black[8].sort = "车";
  98.     black[9].sort = "兵";
  99.     black[10].sort = "兵";
  100.     black[11].sort = "兵";
  101.     black[12].sort = "兵";
  102.     black[13].sort = "兵";
  103.     black[14].sort = "炮";
  104.     black[15].sort = "炮";


  105.     return 0;

  106. }
  107. int move(int x[4])//将board[x[0]][x[1]]处的棋子移动到board[x[2]][x[3]],返回值没有意义!
  108. {
  109.     if (x[0]>10|| x[0]< 1|| x[1]>9 || x[2] < 1 || board[x[0]][x[1]] == 0)
  110.     {
  111.         printf("输入错误\n");
  112.         return 0;
  113.     }
  114.     if (x[2] > 10 || x[2] < 1||x[3] > 9 || x[3] < 1)
  115.     {
  116.         printf("输入错误\n");
  117.         return 0;
  118.     }
  119.     if (board[x[2]][x[3]] != 0)board[x[2]][x[3]]->alive = 0;
  120.     board[x[2]][x[3]] = board[x[0]][x[1]]; board[x[0]][x[1]] = 0;
  121.     if (board[x[2]][x[3]] != 0)
  122.     {
  123.         board[x[2]][x[3]]->x = x[2]; board[x[2]][x[3]]->y = x[3];
  124.     }

  125.     return 0;
  126. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-14 08:17:00 | 显示全部楼层
  1. int show(qiz* board[11][10])//打印棋盘,返回值没有意义!
  2. {
  3.     for (int i = 10; i >= 1; i--)
  4.     {
  5.         for (int j = 1; j <= 9; j++)
  6.         {
  7.             if (board[i][j] == 0)printf("  ");//打印两个空格。
  8.             else printf("%s", board[i][j]->sort);
  9.         }
  10.         printf("%d\n", i);
  11.     }
  12.     for (int j = 1; j <= 9; j++)
  13.         printf("%d ", j);
  14.     printf("\n");
  15.     return 0;
  16. }
复制代码

  1. void show(qiz* board[11][10])
  2. {
  3.     for (int i = 10; i >= 1; i--)
  4.     {
  5.         for (int j = 1; j <= 9; j++)
  6.         {
  7.             if (board[i][j] == 0)printf("  ");//打印两个空格。
  8.             else printf("%s", board[i][j]->sort);
  9.         }
  10.         printf("%d\n", i);
  11.     }
  12.     for (int j = 1; j <= 9; j++)
  13.         printf("%d ", j);
  14.     printf("\n");
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 08:18:31 | 显示全部楼层
这个AI算法你打算怎么做?我之前也百度过,没有找到满意的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 10:22:30 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-2-14 08:18
这个AI算法你打算怎么做?我之前也百度过,没有找到满意的结果

类似于列举法,效果不太好,看三步棋要计算一千万次。要不要把代码给你,有一千多行,排版不好,我把头文件塞在一起了。《数据结构与算法分析》里有三连棋的AI例子,是回溯算法,改了一下就行。我发现就是一个格式,好多双人棋都可以,但计算量大,看不深,经常会乱下,我可不会AI深度学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 10:25:11 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-2-14 08:17

我用返回值为了省事,在写函数的时候,我也不知道有没有返回值,就直接写了。反正也不影响。而且很多时候要提前终止函数,直接用return
0 就可以了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 11:31:42 | 显示全部楼层
召唤风云 发表于 2020-2-14 10:22
类似于列举法,效果不太好,看三步棋要计算一千万次。要不要把代码给你,有一千多行,排版不好,我把头文 ...

嗯,我研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 12:05:27 | 显示全部楼层

chess.txt (22.21 KB, 下载次数: 4)
我介绍一些函数,mable()省略了参数,将对应棋子可以移动的地方放在a,按顺序放,没有就放0。commove,cmove,peomove,这些都是电脑下棋的函数,使用递归。电脑下棋使分最大,模拟的人使分最小。还有一些函数判断有没有越界。你看有关电脑下棋的函数就可以了,其他的函数我看了都头晕。判断棋子的种类,用汉字的第2个字节。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 12:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表