人人對戰

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"
//定義外部變量,棋盤坐標
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 < 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("違反游戲規則,請重新輸入\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 < 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;
}
}
//每種棋子的規則
void rulesOfAllKindsOfChessPieces()
{
//R(車)----------------------------------------
if (array[xi][yi] == R(車))
{
if (yi == yj)//列坐標不變,同列移動
{
for (int i = xi+1; i < xj; 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 < 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))//如果棋子直行、沒有犯規且落點不是紅棋,可以移動
{
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 < xj; 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 < 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)//如果棋子直行、沒有犯規且落點不是紅棋,可以移動
{
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 < 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)//行坐標不變,同行移動
{
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)//如果棋子直行、沒有犯規且落點不是紅棋,可以移動
{
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 < 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)//行坐標不變,同行移動
{
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)//如果棋子直行、沒有犯規且落點不是紅棋,可以移動
{
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 < xj)
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 < 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:~$編譯運行:
chunli@Linux:~$ gcc -std=c99 main.c && ./a.out 中國象棋歡迎您 車馬相仕帥仕相馬車 十十十十十十十十十 十炮十十十十十炮十 兵十兵十兵十兵十兵 十十十十十十十十十 --楚河-漢界-- 十十十十十十十十十 卒十卒十卒十卒十卒 十炮十十十十十炮十 十十十十十十十十十 車馬相仕將仕相馬車 [紅棋]請輸入你要移動的棋子: 0 0 [紅棋]請輸入你要放置的位置: 1 0 中國象棋歡迎您 十馬相仕帥仕相馬車 車十十十十十十十十 十炮十十十十十炮十 兵十兵十兵十兵十兵 十十十十十十十十十 --楚河-漢界-- 十十十十十十十十十 卒十卒十卒十卒十卒 十炮十十十十十炮十 十十十十十十十十十 車馬相仕將仕相馬車 [黑棋]請輸入你要移動的棋子: ^C chunli@Linux:~$
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。