自己做的简易象棋框架
自己做的简易象棋框架,使用的都是c语言的基础,比较简单,应该都看得懂。使用控制台,不能显示颜色,每下一步都打印一幅新的棋盘。虽然简陋,但只要把输出界面改一下就可以变成windows应用。麻雀虽小,但我觉得这些是基础,再牛逼的象棋都得有类似的地基。棋子使用结构体,棋盘使用指针指向棋子。打印棋盘用printf();
我发的代码有三个函数,init()//给棋盘棋子赋值,show(qiz* board)//打印棋盘,move(int x)//将board]]处的棋子移动到board]]
可以输入如1 2 3 3的数字移动棋子,注意先行再列。
还有一些函数我会在以后发出来,完整代码已经有AI了,智商有点低,但不会粗心,我都经常被坑;使用《数据结构与算法分析》中的回溯算法,只是输出界面还是一样简陋。
以下是手机c4droid运行效果图:
代码:
#define _CRT_SECURE_NO_WARNINGS//使用visual stdio想要使用scanf()必须定义这句话
#include <stdio.h>
#include <string.h>
int init();//给棋盘棋子赋值,返回值没有意义!
int move(int x);//将board]]处的棋子移动到board]],返回值没有意义!
typedef struct//棋子结构
{
int alive , x //行 ,棋子在棋盘上的坐标
, y //列 ,棋子在棋盘上的坐标
, country ;//红为1,黑为2
char const* sort ;//棋子种类,车马将士象兵炮
}qiz;
int show(qiz* board);//打印棋盘,返回值没有意义!
qiz* board = { 0 };//棋盘,使用指针指向棋子
qiz red, black;//用来存放红、黑棋子,方便管理
int main()
{
int x;
init();//初始化
show(board);
while (1)
{
for(int i=0;i<4;i++)
{
scanf("%d", &x);
}
move(x);
show(board);
}
return 0;
}
int show(qiz* board)//打印棋盘,返回值没有意义!
{
for (int i = 10; i >= 1; i--)
{
for (int j = 1; j <= 9; j++)
{
if (board == 0)printf("");//打印两个空格。
else printf("%s", board->sort);
}
printf("%d\n", i);
}
for (int j = 1; j <= 9; j++)
printf("%d ", j);
printf("\n");
return 0;
}
int init()//给棋盘棋子赋值,返回值没有意义!
{
for (int i = 0; i <= 15; i++)//country
{
red.country = 1;
black.country = 2;
}
for (int i = 1; i <= 9; i++)
{
board = &red;
board = &black;
red.y = i; red.x = 1;
black.y = i; black.x = 10;
}
for (int i = 1, j = 9; i <= 10; j++, i += 2)
{
board = &red;
red.y = i;
red.x = 4;
board = &black;
black.y = i;
black.x = 7;
}
board = &red; board = &red; red.x = 3; red.y = 2; red.x = 3; red.y = 8;
board = &black; board = &black; black.x = 8; black.y = 2; black.x = 8; black.y = 8;
red.sort = "车";
red.sort = "马";
red.sort = "象";
red.sort = "士";
red.sort = "将";
red.sort = "士";
red.sort = "象";
red.sort = "马";
red.sort = "车";
red.sort = "兵";
red.sort = "兵";
red.sort = "兵";
red.sort = "兵";
red.sort = "兵";
red.sort = "炮";
red.sort = "炮";
black.sort = "车";
black.sort = "马";
black.sort = "象";
black.sort = "士";
black.sort = "将";
black.sort = "士";
black.sort = "象";
black.sort = "马";
black.sort = "车";
black.sort = "兵";
black.sort = "兵";
black.sort = "兵";
black.sort = "兵";
black.sort = "兵";
black.sort = "炮";
black.sort = "炮";
return 0;
}
int move(int x)//将board]]处的棋子移动到board]],返回值没有意义!
{
if (x>10|| x< 1|| x>9 || x < 1 || board]] == 0)
{
printf("输入错误\n");
return 0;
}
if (x > 10 || x < 1||x > 9 || x < 1)
{
printf("输入错误\n");
return 0;
}
if (board]] != 0)board]]->alive = 0;
board]] = board]]; board]] = 0;
if (board]] != 0)
{
board]]->x = x; board]]->y = x;
}
return 0;
} int show(qiz* board)//打印棋盘,返回值没有意义!
{
for (int i = 10; i >= 1; i--)
{
for (int j = 1; j <= 9; j++)
{
if (board == 0)printf("");//打印两个空格。
else printf("%s", board->sort);
}
printf("%d\n", i);
}
for (int j = 1; j <= 9; j++)
printf("%d ", j);
printf("\n");
return 0;
}
void show(qiz* board)
{
for (int i = 10; i >= 1; i--)
{
for (int j = 1; j <= 9; j++)
{
if (board == 0)printf("");//打印两个空格。
else printf("%s", board->sort);
}
printf("%d\n", i);
}
for (int j = 1; j <= 9; j++)
printf("%d ", j);
printf("\n");
} 这个AI算法你打算怎么做?我之前也百度过,没有找到满意的结果
人造人 发表于 2020-2-14 08:18
这个AI算法你打算怎么做?我之前也百度过,没有找到满意的结果
类似于列举法,效果不太好,看三步棋要计算一千万次。要不要把代码给你,有一千多行,排版不好,我把头文件塞在一起了。《数据结构与算法分析》里有三连棋的AI例子,是回溯算法,改了一下就行。我发现就是一个格式,好多双人棋都可以,但计算量大,看不深,经常会乱下,我可不会AI深度学习 人造人 发表于 2020-2-14 08:17
我用返回值为了省事,在写函数的时候,我也不知道有没有返回值,就直接写了。反正也不影响。而且很多时候要提前终止函数,直接用return
0 就可以了。 召唤风云 发表于 2020-2-14 10:22
类似于列举法,效果不太好,看三步棋要计算一千万次。要不要把代码给你,有一千多行,排版不好,我把头文 ...
嗯,我研究研究
人造人 发表于 2020-2-14 11:31
嗯,我研究研究
我介绍一些函数,mable()省略了参数,将对应棋子可以移动的地方放在a,按顺序放,没有就放0。commove,cmove,peomove,这些都是电脑下棋的函数,使用递归。电脑下棋使分最大,模拟的人使分最小。还有一些函数判断有没有越界。你看有关电脑下棋的函数就可以了,其他的函数我看了都头晕。判断棋子的种类,用汉字的第2个字节。
页:
[1]