linux下的c语言实现象棋,【C语言小游戏】 中国象棋
人人对战
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:~$
linux下的c语言实现象棋,【C语言小游戏】 中国象棋相关推荐
- python·pygame小游戏--中国象棋(原码附上,免费下载)
大家好我是小豪,今天给大家带来的是pygame小游戏-中国象棋 因为看到博客上面很多上传了的中国象棋py文件,都是收费的.所以我大胆的上传个免费的-已经把原码上传了,感兴趣的可以去下载. pygame ...
- QT小游戏——中国象棋
QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...
- Java小游戏-中国象棋
摘 要 随着互联网的发展,人们的娱乐生活变得多种多样.许多从前的,线下的娱乐设备,在电脑中也可进行.中国象棋起源于中国,因其入门相对围棋来说较为简单,故拥有庞大的玩家群体. 对现实游戏在计算机里的复刻 ...
- c语言设置一个选择数字的程序,C语言编一个数字益智小游戏
程序功能及运行情况 设计的程序是一个数字益智游戏,旨在培养小朋友玩家的数学思维,提高玩家的数学能力.游戏共设有四个不同的小游戏,分别是一位数四则运算.两位数四则运算.找最值游戏.排序游戏.程序能实现产 ...
- c语言成语接龙编程,C语言完成成语接龙小游戏
用C语言实现成语接龙小游戏(新手上路,大神勿喷) 1.首先需要找到一个成语库(从网上下载即可,保存为.txt文件) 2.整体思路如下 由于要用的成语保存在文件里,一边用一边读取会降低代码的效率,所以我 ...
- 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)
作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...
- 暗棋单机版_中国象棋暗棋下载_中国象棋暗棋安卓版下载 v1.6.8 安卓单机版_飞飞巴士下载...
介绍 中国象棋,博大精深,老一代人留下在的文化遗产,它的精髓所在决定了它注定要流芳百世.在中国人的眼里,那就是谁不会玩象棋?你不会玩象棋,你爸妈知道吗? 棋艺没有最好,只有更好,永无止境.想更好的提升 ...
- c语言写一个简单的小游戏-推箱子
在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...
- c语言贪吃蛇打包到桌面,C语言实现桌面贪吃蛇小游戏
本篇写的是桌面贪吃蛇小游戏,大家自己看吧,感谢大家的支持,谢谢!O(∩_∩)O~~ #define _CRT_SECURE_NO_WARNINGS #include #include #include ...
- java游戏下载象棋暗棋_JS小游戏之象棋暗棋源码详解
本文实例讲述了JS小游戏的象棋暗棋源码,分享给大家供大家参考.具体如下: 游戏运行后如下图所示: Javascript 部分: /** chinese chess * Author: fdipzone ...
最新文章
- Zabbix邮件报警设置方法
- Oracle数据库——数据库安全性管理
- 基于Xcode安装CocoaPods报错
- 机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)...
- java程序中date类型比较大小总结
- Feign从配置文件中读取url
- 谷歌浏览器安卓_安卓免费时代结束,国产手机或将集体涨价?
- 专题突破一之分块——Untitled Problem II,Balanced Lineup,[ioi2009]Regions
- Cenos 7修改时区的方法
- 上海消保委评饿了么“多等5分钟”功能:逻辑上有问题
- Java应用打包后运行需要注意编码问题
- CodeForces - 245H Palindromes区间dp_记忆化搜索
- liferay开发小结, liferay瘦身一
- Intel® Extreme Tuning Utility (Intel® XTU)服务 xtu无法自动启动的问题
- SD卡格式化重建分区
- 51单片机实战教程基础硬件篇(一 电子元件PCB 封装库设计教程)
- 微信小程序wx.base64ToArrayBuffer调用,提示thirdScriptError atob failed;undefined Error: atob failed
- s一般怎么称呼自己的m_“老公、老婆、亲爱的”?快来围观明星怎么称呼自己的另一半!...
- matlab飞机大战小游戏(第二版)
- 【JavaScript】Interview必背(详细版)
热门文章
- 固定Excel首行和首列作为标题以及某些行和列
- 实战 OSPF建立连接的过程7中状态?通俗易懂
- poi 导出word带单个图片
- CentOS下搭建openstack-Havana
- Serif Affinity Designer(矢量图设计工具)官方中文版V1.9.2.1035 | 足以抗衡Adobe的优秀矢量图形软件
- 安科瑞ANet通信管理机在电力监控系统中的应用-Susie 周
- Spring打印sql语句,MybatisLog小黑鸟无法打印sql的解决
- 使用百度地图做GIS相关开发简单示例
- 概率统计笔记:用python实现贝叶斯回归
- 从三节课看中国互联网人教育的再发展