C语言——中国象棋(无图形化界面)
程序员文章站
2024-03-18 13:31:28
...
中国象棋
项目描述
用数组表示棋盘和棋子
0表示无棋子
定义规则,判断棋子是否能移动
保存棋盘功能
读取已保存棋盘功能
判断输赢
初始棋盘截图
获取欲移动棋子信息
对棋盘数组保存
判断输赢
某一方取胜后游戏结束
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <stdlib.h>
int regulate();
void printboard();
void int_put();
void move_piece();
void save_board();
void read_board();
void judged();
int board[10][9]={{1,2,3,4,5,6,7,8,9},
{0,0,0,0,0,0,0,0,0},
{0,10,0,0,0,0,0,11,0},
{12,0,13,0,14,0,15,0,16},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{17,0,18,0,19,0,20,0,21},
{0,22,0,0,0,0,0,23,0},
{0,0,0,0,0,0,0,0,0},
{24,25,26,27,28,29,30,31,32}};
char piece[66]="00车马相士帅士相马车炮炮兵兵兵兵兵卒卒卒卒卒軳軳車馬象仕將仕象馬車";
int i=0,j=0,k=0;
int p=0,q=0,s=0;
int a=0;
int shuai=0,mov=2;//shuai为1将走,为0帅走,mov为1判断能走
int main()
{
printf("1,开始游戏\n2,读取棋盘\n");
scanf("%d",&a);
if(a==2)
read_board();
system("cls");
while(mov!=3)
{
printboard();//打印棋盘
int_put();//获取输入
mov=regulate();//规则判断
move_piece();//棋子移动
system("cls");
save_board();//自动保存棋盘
judged();//判断输赢
}
printboard();
return 0;
}
int regulate()
{
int oldp=20,oldq=20,a=0;
for(i=0;i<10;i++)//获取选中棋子的下标
{
for(j=0;j<9;j++)
{
if(board[i][j]==s)
{
oldp=i;
oldq=j;
break;
}
}
if(oldp!=20||oldq!=20)
break;
}
if(
(oldq==q&&oldp==p)
||(board[oldp][oldq]<=16&&board[p][q]<=16&&board[p][q]>0)
||(board[oldp][oldq]>16&&board[p][q]>16)
)
return 0;
if((shuai==0&&s>16)||(shuai==1&&s<=16))
return 0;
if(s>=12&&s<=16)//兵
{
if(oldp<5)
{
if(p-oldp==1&&q==oldq)
return 1;
}
else
{
if(p-oldp==1&&q==oldq)
return 1;
else if(abs(oldq-q)==1&&p==oldp)
return 1;
else
return 0;
}
}
else if(s>=17&&s<=21)//卒
{
if(oldp>=5)
{
if(oldp-p==1&&q==oldq)
return 1;
}
else
{
if(oldp-p==1&&q==oldq)
return 1;
else if(abs(oldq-q)==1&&p==oldp)
return 1;
else
return 0;
}
}
else
if(s==1||s==9||s==24||s==32)//车
{
a=0;
if(oldp==p)
{
if(q>oldq)
{
for(int
b=oldq+1;b<=q-1;b++)
{
if(board[oldp][b]>0)
return 0;
}
for(int b=oldq;b<=q;b++)
{
if(board[oldp][b]>0)
{
a++;
}
}
}
else if(q<oldq)
{
for(int b=oldq-1;b>=q+1;b--)
{
if(board[oldp][b]>0)
{
return 0;
}
}
for(int b=oldq;b>=q;b--)
{
if(board[oldp][b]>0)
{
a++;
}
}
}
}
else if(oldq==q)
{
if(p>oldp)
{
for(int b=oldp+1;b<=p-1;b++)
{
if(board[b][oldq]>0)
return 0;
}
for(int b=oldp;b<=p;b++)
{
if(board[b][oldq]>0)
a++;
}
}
else if(p<oldp)
{
for(int
b=oldp-1;b>=p+1;b--)
{
if(board[b][oldq]>0)
return 0;
}
for(int b=oldp;b>=p;b--)
{
if(board[b][oldq]>0)
a++;
}
}
}
if(a<=2)
return 1;
}
else if(s==10||s==11||s==22||s==23)//炮
{
a=0;
if(oldp==p)
{
if(q>oldq)
{
for(int b=oldq;b<=q;b++)
{
if(board[oldp][b]>0)
{
a++;
}
}
}
else if(q<oldq)
{
for(int b=oldq;b>=q;b--)
{
if(board[oldp][b]>0)
{
a++;
}
}
}
}
else if(oldq==q)
{
if(p>oldp)
{
for(int b=oldp;b<=p;b++)
{
if(board[b][oldq]>0)
a++;
}
}
else if(p<oldp)
{
for(int b=oldp;b>=p;b--)
{
if(board[b][oldq]>0)
a++;
}
}
}
if(a==1||(a==3&&board[p][q]>0))
return 1;
}
else if(s==5||s==28)//帅
{
if (q == oldq && (abs(p - oldp) >= 5)) {
a
= 0;
if
(p > oldp)// 将吃帅
{
for (int b = oldp; b
<= p; b++)
{
if
((board[oldp][oldq] == 5)&& (board[p][q] == 28))
{
if
(board[b][oldq] > 0) {
a++;
}
}
}
}
else if (p < oldp)// 帅吃将
{
for
(int b = p; b <= oldp; b++)
{
if
((board[oldp][oldq] == 28)&& (board[p][q] == 5))
{
if (board[b][oldq] > 0)
a++;
}
}
}
if
(a == 2) {
return
1;
}
}
else if (((p <= 2 && shuai==0) || (p >= 7 &&
shuai==1))&& (q <= 5 && q >= 3))
{
if
(abs(p - oldp) == 1 && q == oldq) {
return
1;
}
else if (abs(q - oldq) == 1 && p == oldp) {
return
1;
}
}
}
else if(s==4||s==6||s==27||s==29)//士
{
if (shuai==0)// 红方棋子
{
if
(p <= 2 && q <= 5 && q >= 3)
{
if
(abs(p - oldp) == 1&& abs(q - oldq) == 1)
return
1;
}
}
else // 黑方棋子
{
if
(p >= 7 && q <= 5 && q >= 3)
{
if
(abs(p - oldp) == 1
&&
abs(q - oldq) == 1)
return
1;
}
}
}
else if(s==3||s==7||s==26||s==30)//相象
{
if ((p >= 5 && shuai==1)||(p < 5 && shuai==0))
{
if
((p - oldp) == 2 && (q - oldq) == 2)
{
// 移到右下方
if
(board[oldp + 1][oldq + 1] == 0)
{
return
1;
}
}
else if ((p - oldp) == -2 && (q - oldq) == 2)
{
// 移到右上方
if
(board[oldp - 1][oldq + 1] == 0)
{
return
1;
}
}
else if ((p - oldp) == 2 && (q - oldq) == -2)
{ // 移到左下方
if
(board[oldp + 1][oldq - 1] == 0)
{
return
1;
}
}
else if ((p - oldp) == -2 && (q - oldq) == -2)
{
// 移到左上方
if
(board[oldp - 1][oldq - 1] == 0)
{
return
1;
}
}
}
}
else if(s==2||s==8||s==25||s==31)//马
{
if ((p - oldp) == -2 && (q - oldq) == 1)
{ // 移到NE方
if
(board[oldp - 1][oldq] == 0)
{
return
1;
}
}
else if ((p - oldp) == -2 && (q - oldq) == -1)
{ // 移到NW方
if
(board[oldp - 1][oldq] == 0)
{
return
1;
}
}
else if ((p - oldp) == 2 && (q - oldq) == 1)
{ // 移到SE方
if
(board[oldp + 1][oldq] == 0)
{
return
1;
}
}
else if ((p - oldp) == 2 && (q - oldq) == -1)
{ // 移到SW方
if
(board[oldp + 1][oldq] == 0)
{
return
1;
}
}
else if ((p - oldp) == -1 && (q - oldq) == 2)
{ // 移到EN方
if
(board[oldp][oldq + 1] == 0)
{
return
1;
}
}
else if ((p - oldp) == 1 && (q - oldq) == 2)
{ // 移到ES方
if
(board[oldp][oldq + 1] == 0)
{
return
1;
}
}
else if ((p - oldp) == -1 && (q - oldq) == -2)
{ // 移到WN方
if
(board[oldp][oldq - 1] == 0) {
return
1;
}
}
else if ((p - oldp) == 1 && (q - oldq) == -2)
{ // 移到WS方
if
(board[oldp][oldq - 1] == 0)
{
return
1;
}
}
}
return 0;
}
void printboard()
{
printf(" 列 0 1
2 3 4
5 6 7
8\n\n");
printf("行\n");
for(i=0;i<10;i++)
{
printf("%-6d",i);
for(j=0;j<9;j++)
{
if(board[i][j]!=0)
{
k=2*board[i][j];
printf("%2d.%c%c ",board[i][j],piece[k],piece[k+1]);
}
else
printf("%4d ",board[i][j]);
}
printf("\n\n\n");
}
}
void int_put()
{
if(mov==0)
{
printf("走棋不符合规则\n");
}
if(shuai==1)
printf("目前为将方走棋\n");
if(shuai==0)
printf("目前为帅方走棋\n");
printf("请输入想要移动的棋子的编号 ");
scanf("%d",&s);
printf("请输入想要移动棋子到第几行 ");
scanf("%d",&p);
printf("请输入想要移动棋子到第几列 ");
scanf("%d",&q);
}
void move_piece()
{
if(mov==1)
{
if(shuai==0)
shuai=1;
else if(shuai==1)
shuai=0;
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
if(board[i][j]==s)
board[i][j]=0;
if(i==p&&j==q)
board[p][q]=s;
}
}
}
}
void save_board()
{
FILE *fp;
fp=fopen("d:\\test.txt","w");
if(fp==NULL)
{
printf("create file failed\n");
}
fprintf(fp,"%d",shuai);
fprintf(fp,"\n");
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
fprintf(fp,"%d
",board[i][j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}
void read_board()
{
FILE *fp;
fp=fopen("d:\\test.txt","r");
if(fp==NULL)
{
printf("create file failed\n");
}
fscanf(fp,"%d",&shuai);
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
fscanf(fp,"%d",&board[i][j]);
}
}
fclose(fp);
}
void judged()
{
int a=0;
int b=0;
for(i=0;i<=9;i++)
{
for(j=3;j<=5;j++)
{
if(board[i][j]==5)
a=1;
if(board[i][j]==28)
b=1;
}
}
if(a==0)
printf("帅方败北\n");
else if(b==0)
printf("将方败北\n");
a=0;
b=0;
for(i=0;i<=2;i++)
{
for(j=3;j<=5;j++)
{
if(board[i][j]==5)
a=1;
}
}
for(i=7;i<=9;i++)
{
for(j=3;j<=5;j++)
{
if(board[i][j]==28)
b=1;
}
}
if(a==0||b==0)
mov=3;
}
推荐阅读
-
C语言——中国象棋(无图形化界面)
-
C语言彩色版贪吃蛇——图形界面Easyx的简单使用
-
C语言+easyX界面库实现贪吃蛇
-
小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)
-
利用C/C++扩展php语言实现 Usher_GetHostIP无参函数
-
有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”——C语言
-
邻接表无向图---C语言
-
无向图 邻接多重表的创建 - c语言
-
CentOS7.6静默(无图形化界面)安装Oracle 11g
-
c语言:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?打印出来?