欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言——中国象棋(无图形化界面)

程序员文章站 2024-03-18 13:31:28
...

中国象棋

项目描述

用数组表示棋盘和棋子
0表示无棋子
定义规则,判断棋子是否能移动
保存棋盘功能
读取已保存棋盘功能
判断输赢

初始棋盘截图

C语言——中国象棋(无图形化界面)

获取欲移动棋子信息

C语言——中国象棋(无图形化界面)

对棋盘数组保存

C语言——中国象棋(无图形化界面)

判断输赢

C语言——中国象棋(无图形化界面)

某一方取胜后游戏结束

完整代码



#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;

}