【C语言小游戏】 中国象棋

人人对战

[email protected]:~$ 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"//红色棋子
//#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 < 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;
    }
}

[email protected]:~$

编译运行:

[email protected]:~$ gcc -std=c99 main.c  && ./a.out 
  中国象棋欢迎您

車马相仕帅仕相马車
十十十十十十十十十
十炮十十十十十炮十
兵十兵十兵十兵十兵
十十十十十十十十十
--楚河-汉界--
十十十十十十十十十
卒十卒十卒十卒十卒
十炮十十十十十炮十
十十十十十十十十十
車马相仕将仕相马車
[红棋]请输入你要移动的棋子:
0 0
[红棋]请输入你要放置的位置:
1 0
  中国象棋欢迎您

十马相仕帅仕相马車
車十十十十十十十十
十炮十十十十十炮十
兵十兵十兵十兵十兵
十十十十十十十十十
--楚河-汉界--
十十十十十十十十十
卒十卒十卒十卒十卒
十炮十十十十十炮十
十十十十十十十十十
車马相仕将仕相马車
[黑棋]请输入你要移动的棋子:
^C
[email protected]:~$
时间: 2024-10-08 17:43:07

【C语言小游戏】 中国象棋的相关文章

C语言小游戏设计报告

课程设计名称:贪吃蛇小游戏 专业班级:计科15-2 学号:150809229 姓名:XXX 一.设计目标 通过设计,培养学生对电脑的动手能力,使学生巩固<C语言程序设计>课程学习的内容,掌握编写程序的基本方法,强化对其的动手能力,可以独自完成程序的编写. 二.设计内容和要求 设计内容 编写贪吃蛇的小游戏,使其可以成功运行并且操作玩耍. 设计要求 1)源程序要有适当的注释,使程序便于阅读. 2)要有程序运行结果作为依据 三.程序流程 1.编写地图 运用函数,数组编写地图 2.相同的方法把蛇添加进

【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

? 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文

C语言 小游戏之贪吃蛇

还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半的编程,如今认为这个C语言的贪吃蛇还是比較简单的,花的时间不非常多! 我认为主要是思路正确,基本上就米什么大的问题. 如今贴上我的代码和我的详解,希望大家多交流. 首先说下我这个贪吃蛇仅仅是一个简单的,游戏结束有2种可能:一碰墙,二自杀即蛇头碰到蛇身. 如有不好之处,请见谅把. 首先说下我这个贪吃蛇

C语言小游戏开发之贪吃蛇

寒假期间一时兴起,想着用C语言能开发出贪吃蛇小游戏应该是一件不错的事!但C语言学习过程中从来都是字符界面的编程,如何能有"图形化"的效果呢?于是小编就在度娘, 谷歌等网站搜索了一番,发现了一些有用的Win32 API函数,于是小编的心一下子激动了起来,有了这些API函数也许能够实现哟!开始吧! 编程之前小编的构思是这样的,贪吃蛇小游戏应该实现的有: 1.贪吃蛇在不进行控制的条件下应该能够自主前进. 2.玩家可以通过WASD键来控制贪吃蛇的前进方向. 3.运行过程中若贪吃蛇撞击到墙壁或自

C语言小游戏: 2048.c

概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展示如何用C语言实现一个简单但有用的程序. 一.程序简介 本文分析的代码是mevdschee在GitHub上的项目2048.c,游戏的规则和安装说明都可以到主页查看,本文不再赘述.顺便一提,这个程序虽然是纯C编写的,但是它适用于Linux终端,因此如果你想要看一下运行效果可能需要一个Linux. 20

c语言小游戏

#include<windows.h> #include<stdio.h> #include<time.h> #include"function.h" LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,UINT wparam,UINT lparam); int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hpre,LPSTR lPstring,int ncmd) {

【C语言小游戏】 贪吃蛇

windows编译运行 源代码: /*这是一个贪吃蛇代码,运行环境VC++6.0(亲测完美运行)*/ /*该程序在dos系统下运行,不需要graphics.h头文件*/ #include <windows.h> #include <stdlib.h> #include <time.h> #include <stdio.h> #include <string.h> #include <conio.h> #define N 21 int 

C语言小游戏---画面愤怒的小鸟

学习B站 https://www.bilibili.com/video/av34118200?p=41 还没写完,1.撞柱子没死呢 2.没计分呢 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<graphics.h> #include<conio.h> #pragma comment(lib,"Winmm.

C语言实现双人控制的战斗小游戏

实现功能 1.双人分别控制小人移动 2.子弹碰撞 3.可改变出弹方向 4.血条实体化 前言 这个游戏是看了知乎一位非常好的老师的专栏后练手写的,(至于是哪位,知乎搜C语言小游戏最牛逼的那位) 有老师系统性的交这些的确规范了许多,我之前自己摸索写的游戏相对它来说规范性是大大的不抵. 我大致是看了一个飞机游戏的代码,学会了实时更新函数与用户输入更新函数,与设置子弹体. 在此基础上我结合我最近学的弹球写出了这个靠风骚走位的双人战斗小游戏.下面是图与具体实现. 0.游戏主体   while(1) {•