linux下的c语言实现象棋,【C语言小游戏】 中国象棋

人人对战

b0e6fd9e8c2691f8fe5630259a5af4c1.png

chunli@Linux:~$ cat main.c

//  main.c

//  象棋

//  車马相仕帅仕相马車

//  十十十十十十十十十

//  十炮十十十十十炮十

//  兵十兵十兵十兵十兵

//  十十十十十十十十十

//  --楚河-汉界--

//  十十十十十十十十十

//  卒十卒十卒十卒十卒

//  十炮十十十十十炮十

//  十十十十十十十十十

//  車马象士将士象马車

//

#include 

#include 

#include 

#include 

#define R(piece) "\033[31m"#piece"\033[0m"//红色棋子

//#define B(piece) "\033[30m"#piece"\033[0m"//黑色棋子

#define B(piece) "\033[32m"#piece"\033[0m"//黑色棋子

#define CROSS "\033[33m十\033[0m"

//定义外部变量,棋盘坐标

char* array[11][9];

int xi,yi;//要移动的棋子

int xj,yj;//移动的目标位置

bool isStandard = 1;//是否符合规则,初始值1,符合

bool gameOverSign = 1;//游戏是否结束,0结束

bool restart = 0;

//生成棋盘

void chessboardBuilding();

//打印棋盘

void printChessboard();

//判断是红棋还是黑棋,红旗返回1,黑棋返回-1,否则返回0

int redOrBlack(int x,int y);

//红棋移动

void redMove();

//黑棋移动

void blackMove();

//每种棋子的规则

void rulesOfAllKindsOfChessPieces();

//判断游戏结束

void isGameOver();

//**************************主函数******************************

int main()

{

//生成棋盘

chessboardBuilding();

//打印棋盘

printChessboard();

//开始下棋

int turn = -1;

while (gameOverSign) {

isStandard = 1;

turn *= (-1);//双方交替下棋

switch (turn) {

case 1:

redMove();

turn = (restart) ? (turn*-1) : turn;

break;

case -1:

blackMove();

turn = (restart) ? (turn*-1) : turn;

break;

}

isGameOver();

}

printf("游戏结束!\n");

}//主函数结束

//*************************自定义函数*****************************

//生成棋盘

void chessboardBuilding()

{

for (int i = 0; i 

for (int j = 0; j 

array[i][j] = CROSS;

}

printf("\n");

}

array[5][0] = array[5][1] = array[5][4] = array[5][7] = array[5][8] = "-";

array[5][2] = B(楚);

array[5][3] = B(河);

array[5][5] = B(汉);

array[5][6] = B(界);

//布置红棋

array[0][0] = array[0][8] = R(車);

array[0][1] = array[0][7] = R(马);

array[0][2] = array[0][6] = R(相);

array[0][3] = array[0][5] = R(仕);

array[0][4] = R(帅);

array[2][1] = array[2][7] = R(炮);

array[3][0] = array[3][2] = array[3][4] = array[3][6] = array[3][8] = R(兵);

//布置黑棋

array[10][0] = array[10][8] = B(車);

array[10][1] = array[10][7] = B(马);

array[10][2] = array[10][6] = B(相);

array[10][3] = array[10][5] = B(仕);

array[10][4] = B(将);

array[8][1] = array[8][7] = B(炮);

array[7][0] = array[7][2] = array[7][4] = array[7][6] = array[7][8] = B(卒);

}

//打印棋盘

void printChessboard()

{

system("clear");

//显示

printf("  \033[43;30m中国象棋欢迎您\033[0m\n\n");

for (int i = 0; i 

for (int j = 0; j 

printf("%s",array[i][j]);

}

printf("\n");

}

}

//判断是红棋还是黑棋,红旗返回1,黑棋返回-1,否则返回0

int redOrBlack(int x,int y)

{

if (array[x][y] == R(車) || array[x][y] == R(马) || array[x][y] == R(相) || array[x][y] == R(仕) || array[x][y] == R(帅) || array[x][y] == R(炮) || array[x][y] == R(兵))

{

return  1;

}

else if (array[x][y] == B(車) || array[x][y] == B(马) || array[x][y] == B(象) || array[x][y] == B(仕) || array[x][y] == B(将) || array[x][y] == B(炮) || array[x][y] == B(卒))

{

return -1;

}

else

return 0;

}

//红棋移动

void redMove()

{

if (restart) {

printf("违反游戏规则,请重新输入\n");

restart = 0;

}

printf("[红棋]请输入你要移动的棋子:\n");

scanf("%d %d",&xi,&yi);

printf("[红棋]请输入你要放置的位置:\n");

scanf("%d %d",&xj,&yj);

rulesOfAllKindsOfChessPieces();

printChessboard();

}

//黑棋移动

void blackMove()

{

if (restart) {

printf("违反游戏规则,请重新输入\n");

restart = 0;

}

printf("[黑棋]请输入你要移动的棋子:\n");

scanf("%d %d",&xi,&yi);

printf("[黑棋]请输入你要放置的位置:\n");

scanf("%d %d",&xj,&yj);

rulesOfAllKindsOfChessPieces();

printChessboard();

}

//判断游戏结束

void isGameOver()

{

bool sign_r = 0;

bool sign_b = 0;

for (int i = 0; i 

for (int j = 0; j 

if (array[i][j] == R(帅)) {

sign_r = 1;

}

else if (array[i][j] == B(将))

{

sign_b = 1;

}

}

}

if ((sign_r == 0)||(sign_b == 0)) {

gameOverSign = 0;

}

}

//每种棋子的规则

void rulesOfAllKindsOfChessPieces()

{

//R(車)----------------------------------------

if (array[xi][yi] == R(車))

{

if (yi == yj)//列坐标不变,同列移动

{

for (int i = xi+1; i 

{

if (i == 5)

continue;//如果行等于5,跳过

if (array[i][yi] != CROSS)

isStandard = 0;//如果初始位置和目标位置之间有棋子,则不符合规则

}

for (int i = xi-1; i > xj; i --)

{

if (i == 5)

continue;//如果行等于5,跳过

if (array[xi][yi] != CROSS)

isStandard = 0;

}

}

else if (xi == xj)//行坐标不变,同行移动

{

for (int i = yi+1; i 

if (array[xi][i] != CROSS)

isStandard = 0;

for (int i = yi-1; i > yj; i --)

if (array[xi][i] != CROSS)

isStandard = 0;

}

if ((xi == xj || yi == yj)&& isStandard && (redOrBlack(xj, yj) != 1))//如果棋子直行、没有犯规且落点不是红棋,可以移动

{

array[xi][yi] = CROSS;

array[xj][yj] = R(車);

}

else

{

restart = 1;

}

}

//B(車)----------------------------------------

else if (array[xi][yi] == B(車))

{

if (yi == yj)//列坐标不变,同列移动

{

for (int i = xi+1; i 

{

if (i == 5)

continue;//如果行等于5,跳过

if (array[i][yi] != CROSS)

isStandard = 0;//如果初始位置和目标位置之间有棋子,则不符合规则

}

for (int i = xi-1; i > xj; i --)

{

if (i == 5)

continue;//如果行等于5,跳过

if (array[i][yi] != CROSS)

isStandard = 0;

}

}

else if (xi == xj)//行坐标不变,同行移动

{

for (int i = yi+1; i 

if (array[xi][i] != CROSS)

isStandard = 0;

for (int i = yi-1; i > yj; i --)

if (array[xi][i] != CROSS)

isStandard = 0;

}

if ((xi == xj || yi == yj)&& isStandard && redOrBlack(xj, yj) != -1)//如果棋子直行、没有犯规且落点不是红棋,可以移动

{

array[xi][yi] = CROSS;

array[xj][yj] = B(車);

}

else

{

restart = 1;

}

}

//R(马)----------------------------------------

else if (array[xi][yi] == R(马))

{

if ((redOrBlack(xj, yj) != 1) && ((xj == xi-2 && yj == yi-1 &&redOrBlack(xi-1, yi) == 0) || (xj == xi-2 && yj == yi+1 &&redOrBlack(xi-1, yi) == 0) || (xj == xi-1 && yj == yi-2 &&redOrBlack(xi, yi-1) == 0) || (xj == xi-1 && yj == yi+2 &&redOrBlack(xi, yi+1) == 0) || (xj == xi+1 && yj == yi-2 &&redOrBlack(xi, yi-1) == 0) || (xj == xi+1 && yj == yi+2 &&redOrBlack(xi, yi+1) == 0) || (xj == xi+2 && yj == yi-1 &&redOrBlack(xi+1, yi) == 0) || (xj == xi+2 && yj == yi+1 &&redOrBlack(xi+1, yi) == 0)))

{

array[xi][yi] = CROSS;

array[xj][yj] = R(马);

}

else

{

restart = 1;

}

}

//B(马)----------------------------------------

else if (array[xi][yi] == B(马))

{

if ((redOrBlack(xj, yj) != -1) && ((xj == xi-2 && yj == yi-1 &&redOrBlack(xi-1, yi) == 0) || (xj == xi-2 && yj == yi+1 &&redOrBlack(xi-1, yi) == 0) || (xj == xi-1 && yj == yi-2 &&redOrBlack(xi, yi-1) == 0) || (xj == xi-1 && yj == yi+2 &&redOrBlack(xi, yi+1) == 0) || (xj == xi+1 && yj == yi-2 &&redOrBlack(xi, yi-1) == 0) || (xj == xi+1 && yj == yi+2 &&redOrBlack(xi, yi+1) == 0) || (xj == xi+2 && yj == yi-1 &&redOrBlack(xi+1, yi) == 0) || (xj == xi+2 && yj == yi+1 &&redOrBlack(xi+1, yi) == 0)))

{

array[xi][yi] = CROSS;

array[xj][yj] = B(马);

}

else

{

restart = 1;

}

}

//R(炮)----------------------------------------

else if (array[xi][yi] == R(炮))

{

int count = 0;//起始位置间棋子的个数

if (yi == yj)//列坐标不变,同列移动

{

for (int i = xi+1; i 

{

if (i == 5)

continue;//如果行等于5,跳过

if (redOrBlack(i, yi) != 0)

count++;

}

for (int i = xi-1; i > xj; i --)

{

if (i == 5)

continue;//如果行等于5,跳过

if (redOrBlack(i, yi) != 0)

count++;

}

}

else if (xi == xj)//行坐标不变,同行移动

{

for (int i = yi+1; i 

if (redOrBlack(xi, i) != 0)

count++;

for (int i = yi-1; i > yj; i --)

if (redOrBlack(xi, i) != 0)

count++;

}

if ((xi == xj || yi == yj)&& (count <= 1) && redOrBlack(xj, yj) != 1)//如果棋子直行、没有犯规且落点不是红棋,可以移动

{

array[xi][yi] = CROSS;

array[xj][yj] = R(炮);

}

else

{

restart = 1;

}

}

//B(炮)----------------------------------------

else if (array[xi][yi] == B(炮))

{

int count = 0;//起始位置间棋子的个数

if (yi == yj)//列坐标不变,同列移动

{

for (int i = xi+1; i 

{

if (i == 5)

continue;//如果行等于5,跳过

if (redOrBlack(i, yi) != 0)

count++;

}

for (int i = xi-1; i > xj; i --)

{

if (i == 5)

continue;//如果行等于5,跳过

if (redOrBlack(i, yi) != 0)

count++;

}

}

else if (xi == xj)//行坐标不变,同行移动

{

for (int i = yi+1; i 

if (redOrBlack(xi, i) != 0)

count++;

for (int i = yi-1; i > yj; i --)

if (redOrBlack(xi, i) != 0)

count++;

}

if ((xi == xj || yi == yj)&& (count <= 1) && redOrBlack(xj, yj) != -1)//如果棋子直行、没有犯规且落点不是红棋,可以移动

{

array[xi][yi] = CROSS;

array[xj][yj] = B(炮);

}

else

{

restart = 1;

}

}

//R(兵)----------------------------------------

else if (array[xi][yi] == R(兵))

{

if (xi > xj)

isStandard = 0;//如果倒退,则不符合规范

if (xi == 3)

if ((xj != xi+1) || (yi != yj))

isStandard = 0;//第3行时只能前进一步

if (xi == 4)

if ((xj != xi+2) || (yi != yj))

isStandard = 0;//第4行时只能前进两步

if (xi > 4) {

if ((xj == xi+1 && yi ==yj)|| (xj == xi && yi ==yj+1)||(xj == xi && yi ==yj-1))

{

}

else

isStandard = 0;

}

if ((xi == xj || yi == yj)&& isStandard && redOrBlack(xj, yj) != 1)//

{

array[xi][yi] = CROSS;

array[xj][yj] = R (兵);

}

else

{

restart = 1;

}

}

//B(卒)----------------------------------------

else if (array[xi][yi] == B(卒))

{

if (xi 

isStandard = 0;//如果倒退,则不符合规范

if (xi == 7)

if ((xj != xi-1) || (yi != yj))

isStandard = 0;//第3行时只能前进一步

if (xi == 6)

if ((xj != xi-2) || (yi != yj))

isStandard = 0;//第4行时只能前进两步

if (xi 

if ((xj == xi-1 && yi ==yj)|| (xj == xi && yi ==yj+1)||(xj == xi && yi ==yj-1))

{

}

else

isStandard = 0;

}

if (isStandard && redOrBlack(xj, yj) != -1)//

{

array[xi][yi] = CROSS;

array[xj][yj] = R (卒);

}

else

{

restart = 1;

}

}

//R(相)----------------------------------------

else if (array[xi][yi] == R(相))

{

if ((xj <= 4)&&(redOrBlack(xj, yj) != 1) && ((xj == xi-2 && yj == yi-2 &&redOrBlack(xi-1, yi-1) == 0) || (xj == xi-2 && yj == yi+2 &&redOrBlack(xi-1, yi+1) == 0) || (xj == xi+2 && yj == yi-2 &&redOrBlack(xi+1, yi-1) == 0) || (xj == xi+2 && yj == yi+2 &&redOrBlack(xi+1, yi+1) == 0)))

{

array[xi][yi] = CROSS;

array[xj][yj] = R(相);

}

else

{

restart = 1;

}

}

//B(象)----------------------------------------

else if (array[xi][yi] == B(象))

{

if ((xj >= 6)&&(redOrBlack(xj, yj) != -1) && ((xj == xi-2 && yj == yi-2 &&redOrBlack(xi-1, yi-1) == 0) || (xj == xi-2 && yj == yi+2 &&redOrBlack(xi-1, yi+1) == 0) || (xj == xi+2 && yj == yi-2 &&redOrBlack(xi+1, yi-1) == 0) || (xj == xi+2 && yj == yi+2 &&redOrBlack(xi+1, yi+1) == 0)))

{

array[xi][yi] = CROSS;

array[xj][yj] = B(象);

}

else

{

restart = 1;

}

}

//R(仕)----------------------------------------

else if (array[xi][yi] == R(仕))

{

if ((xj <= 2)&&(redOrBlack(xj, yj) != 1) && ((xj == xi-1 && yj == yi-1 ) || (xj == xi-1 && yj == yi+1 ) || (xj == xi+1 && yj == yi-1 ) || (xj == xi+1 && yj == yi+1 )))

{

array[xi][yi] = CROSS;

array[xj][yj] = R(仕);

}

else

{

restart = 1;

}

}

//B(士)----------------------------------------

else if (array[xi][yi] == B(士))

{

if ((xj >= 8)&&(redOrBlack(xj, yj) != 1) && ((xj == xi-1 && yj == yi-1 ) || (xj == xi-1 && yj == yi+1 ) || (xj == xi+1 && yj == yi-1 ) || (xj == xi+1 && yj == yi+1 )))

{

array[xi][yi] = CROSS;

array[xj][yj] = B(士);

}

else

{

restart = 1;

}

}

//R(帅)----------------------------------------

else if (array[xi][yi] == R(帅))

{

if ((xj <= 2 && yj <= 5 && yj >=3)&&(redOrBlack(xj, yj) != 1) && (((xj == xi)&&(yj == yi + 1 || yj == yi - 1))||((yj == yi)&&(xj == xi + 1 || xj == xi - 1))))

{

array[xi][yi] = CROSS;

array[xj][yj] = R(帅);

}

else

{

restart = 1;

}

}

//B(将)----------------------------------------

else if (array[xi][yi] == B(将))

{

if ((xj >= 8 && yj <= 5 && yj >=3)&&(redOrBlack(xj, yj) != -1) && (((xj == xi)&&(yj == yi + 1 || yj == yi - 1))||((yj == yi)&&(xj == xi + 1 || xj == xi - 1))))

{

array[xi][yi] = CROSS;

array[xj][yj] = B(将);

}

else

{

restart = 1;

}

}

else {

restart = 1;

}

}

chunli@Linux:~$

编译运行:chunli@Linux:~$ gcc -std=c99 main.c  && ./a.out

中国象棋欢迎您

車马相仕帅仕相马車

十十十十十十十十十

十炮十十十十十炮十

兵十兵十兵十兵十兵

十十十十十十十十十

--楚河-汉界--

十十十十十十十十十

卒十卒十卒十卒十卒

十炮十十十十十炮十

十十十十十十十十十

車马相仕将仕相马車

[红棋]请输入你要移动的棋子:

0 0

[红棋]请输入你要放置的位置:

1 0

中国象棋欢迎您

十马相仕帅仕相马車

車十十十十十十十十

十炮十十十十十炮十

兵十兵十兵十兵十兵

十十十十十十十十十

--楚河-汉界--

十十十十十十十十十

卒十卒十卒十卒十卒

十炮十十十十十炮十

十十十十十十十十十

車马相仕将仕相马車

[黑棋]请输入你要移动的棋子:

^C

chunli@Linux:~$

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言和C++中实现象棋游戏可以采用人机对战的方式。一个简单的算法是使用遍历来获取所有人机方棋子能走的地方,然后根据评估函数找出对人机方来说收益最大的一步。这个算法的实现并不容易,因为评估函数需要具有代表性,这直接决定了人机的棋力,并且需要进行迭代遍历,这会导致时间复杂度较高。\[1\] 如果你想获取完整的代码素材和进行C/C++交流学习,你可以访问以下链接:\[2\] 在实现象棋游戏时,你还可以注册鼠标事件,通过鼠标点击不同位置来实现棋子的移动,按照象棋的行棋规范。例如,你可以使用mouseEvent函数来处理鼠标事件,其中x和y表示点击的位置,button表示鼠标左右键和滑轮的事件,e表示点击或抬起的事件。\[3\] #### 引用[.reference_title] - *1* *3* [C/C++:实现象棋游戏](https://blog.csdn.net/linglingnana/article/details/125013081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言编码中国象棋(包教包会)](https://blog.csdn.net/qq958948605/article/details/121124104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值