【C語言小游戲】中國象棋-創(chuàng)新互聯(lián)

人人對戰(zhàn)

創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),微信小程序開發(fā),10年建站對邊坡防護(hù)網(wǎng)等多個方面,擁有多年的網(wǎng)站營銷經(jīng)驗。

【C語言小游戲】 中國象棋

chunli@Linux:~$ cat main.c 
//  main.c
//  象棋

//  車馬相仕帥仕相馬車
//  十十十十十十十十十
//  十炮十十十十十炮十
//  兵十兵十兵十兵十兵
//  十十十十十十十十十
//  --楚河-漢界--
//  十十十十十十十十十
//  卒十卒十卒十卒十卒
//  十炮十十十十十炮十
//  十十十十十十十十十
//  車馬象士將士象馬車

//

#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include <stdlib.h>

#define R(piece) "\033[31m"#piece"\033[0m"http://紅色棋子
//#define B(piece) "\033[30m"#piece"\033[0m"http://黑色棋子
#define B(piece) "\033[32m"#piece"\033[0m"http://黑色棋子
#define CROSS "\033[33m十\033[0m"

//定義外部變量,棋盤坐標(biāo)
char* array[11][9];
int xi,yi;//要移動的棋子
int xj,yj;//移動的目標(biāo)位置
bool isStandard = 1;//是否符合規(guī)則,初始值1,符合
bool gameOverSign = 1;//游戲是否結(jié)束,0結(jié)束
bool restart = 0;
//生成棋盤
void chessboardBuilding();
//打印棋盤
void printChessboard();
//判斷是紅棋還是黑棋,紅旗返回1,黑棋返回-1,否則返回0
int redOrBlack(int x,int y);
//紅棋移動
void redMove();
//黑棋移動
void blackMove();
//每種棋子的規(guī)則
void rulesOfAllKindsOfChessPieces();
//判斷游戲結(jié)束
void isGameOver();

//**************************主函數(shù)******************************
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("游戲結(jié)束!\n");
    
  
    
}//主函數(shù)結(jié)束


//*************************自定義函數(shù)*****************************

//生成棋盤
void chessboardBuilding()
{
    for (int i = 0; i < 11; i ++) {
        for (int j = 0; j < 9 ; 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 < 11;  i ++) {
        for (int j = 0; j < 9; 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("違反游戲規(guī)則,請重新輸入\n");
        restart = 0;
    }
    printf("[紅棋]請輸入你要移動的棋子:\n");
    scanf("%d %d",&xi,&yi);
    printf("[紅棋]請輸入你要放置的位置:\n");
    scanf("%d %d",&xj,&yj);
    rulesOfAllKindsOfChessPieces();
    printChessboard();
}

//黑棋移動
void blackMove()
{
    if (restart) {
        printf("違反游戲規(guī)則,請重新輸入\n");
        restart = 0;
    }
    printf("[黑棋]請輸入你要移動的棋子:\n");
    scanf("%d %d",&xi,&yi);
    printf("[黑棋]請輸入你要放置的位置:\n");
    scanf("%d %d",&xj,&yj);
    rulesOfAllKindsOfChessPieces();
    printChessboard();
}

//判斷游戲結(jié)束
void isGameOver()
{
    bool sign_r = 0;
    bool sign_b = 0;
    for (int i = 0; i < 11; i ++) {
        for (int j = 0; j < 9; 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;
    }
}

//每種棋子的規(guī)則
void rulesOfAllKindsOfChessPieces()
{
//R(車)----------------------------------------
    if (array[xi][yi] == R(車))
    {
        if (yi == yj)//列坐標(biāo)不變,同列移動
        {
            for (int i = xi+1; i < xj; i ++)
            {
                if (i == 5)
                    continue;//如果行等于5,跳過
                if (array[i][yi] != CROSS)
                    isStandard = 0;//如果初始位置和目標(biāo)位置之間有棋子,則不符合規(guī)則
            }
            for (int i = xi-1; i > xj; i --)
            {
                if (i == 5)
                    continue;//如果行等于5,跳過
                if (array[xi][yi] != CROSS)
                    isStandard = 0;
            }
        }
        else if (xi == xj)//行坐標(biāo)不變,同行移動
        {
            for (int i = yi+1; i < yj; 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))//如果棋子直行、沒有犯規(guī)且落點不是紅棋,可以移動
        {
            
            array[xi][yi] = CROSS;
            array[xj][yj] = R(車);
        }
        else
        {
            restart = 1;
        }
    }

//B(車)----------------------------------------
    else if (array[xi][yi] == B(車))
    {
        
        if (yi == yj)//列坐標(biāo)不變,同列移動
        {
            for (int i = xi+1; i < xj; i ++)
            {
                if (i == 5)
                    continue;//如果行等于5,跳過
                if (array[i][yi] != CROSS)
                    isStandard = 0;//如果初始位置和目標(biāo)位置之間有棋子,則不符合規(guī)則
            }
            for (int i = xi-1; i > xj; i --)
            {
                if (i == 5)
                    continue;//如果行等于5,跳過
                if (array[i][yi] != CROSS)
                    isStandard = 0;
            }
        }
        else if (xi == xj)//行坐標(biāo)不變,同行移動
        {
            for (int i = yi+1; i < yj; 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)//如果棋子直行、沒有犯規(guī)且落點不是紅棋,可以移動
        {
            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;//起始位置間棋子的個數(shù)
        if (yi == yj)//列坐標(biāo)不變,同列移動
        {
            for (int i = xi+1; i < xj; 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)//行坐標(biāo)不變,同行移動
        {
            for (int i = yi+1; i < yj; 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)//如果棋子直行、沒有犯規(guī)且落點不是紅棋,可以移動
        {
            array[xi][yi] = CROSS;
            array[xj][yj] = R(炮);
        }
        else
        {
            restart = 1;
        }
    }
    
//B(炮)----------------------------------------
    else if (array[xi][yi] == B(炮))
    {
        int count = 0;//起始位置間棋子的個數(shù)
        if (yi == yj)//列坐標(biāo)不變,同列移動
        {
            for (int i = xi+1; i < xj; 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)//行坐標(biāo)不變,同行移動
        {
            for (int i = yi+1; i < yj; 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)//如果棋子直行、沒有犯規(guī)且落點不是紅棋,可以移動
        {
            array[xi][yi] = CROSS;
            array[xj][yj] = B(炮);
        }
        else
        {
            restart = 1;
        }
    }
    
//R(兵)----------------------------------------
    else if (array[xi][yi] == R(兵))
    {
        if (xi > xj)
            isStandard = 0;//如果倒退,則不符合規(guī)范
        if (xi == 3)
            if ((xj != xi+1) || (yi != yj))
                isStandard = 0;//第3行時只能前進(jìn)一步
        if (xi == 4)
            if ((xj != xi+2) || (yi != yj))
                isStandard = 0;//第4行時只能前進(jìn)兩步
        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 < xj)
            isStandard = 0;//如果倒退,則不符合規(guī)范
        if (xi == 7)
            if ((xj != xi-1) || (yi != yj))
                isStandard = 0;//第3行時只能前進(jìn)一步
        if (xi == 6)
            if ((xj != xi-2) || (yi != yj))
                isStandard = 0;//第4行時只能前進(jìn)兩步
        if (xi < 4) {
            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:~$

編譯運(yùn)行:

chunli@Linux:~$ gcc -std=c99 main.c  && ./a.out 
  中國象棋歡迎您

車馬相仕帥仕相馬車
十十十十十十十十十
十炮十十十十十炮十
兵十兵十兵十兵十兵
十十十十十十十十十
--楚河-漢界--
十十十十十十十十十
卒十卒十卒十卒十卒
十炮十十十十十炮十
十十十十十十十十十
車馬相仕將仕相馬車
[紅棋]請輸入你要移動的棋子:
0 0
[紅棋]請輸入你要放置的位置:
1 0
  中國象棋歡迎您

十馬相仕帥仕相馬車
車十十十十十十十十
十炮十十十十十炮十
兵十兵十兵十兵十兵
十十十十十十十十十
--楚河-漢界--
十十十十十十十十十
卒十卒十卒十卒十卒
十炮十十十十十炮十
十十十十十十十十十
車馬相仕將仕相馬車
[黑棋]請輸入你要移動的棋子:
^C
chunli@Linux:~$

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

名稱欄目:【C語言小游戲】中國象棋-創(chuàng)新互聯(lián)
文章鏈接:http://www.muchs.cn/article32/ejhsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、網(wǎng)站設(shè)計公司、響應(yīng)式網(wǎng)站企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)