动物棋制作(C语言)

期末大作业要求:

1.完成动物棋的对局功能;

2.能够实现复盘的功能;

具体操作如下:(图形库用的是EasyX)

因为是第一次做,可能会有些乱,有的地方会比较繁琐,也欢迎指出问题。

开始是一些准备工作。

#include <stdio.h>                
#include <graphics.h>
#include <conio.h>
#include<stdlib.h>
#include<time.h>
#define R 16
//这里有用到一些全局变量
int a[14],b[14];
int A[14],B[14];
char c[14]={'E','E','T','T','L','L','W','W','D','D','C','C','M','M'};
char C[15];
int e[14],f[14];
int g[1000],h[1000];
//用结构体来标记棋子的位置
typedef struct locate
{
    int x;
    int y;
}Locate;
//用结构体来完成对棋子的计数
typedef struct num
{
    int E;
    int T;
    int L;
    int W;
    int D;
    int C;
    int M;
}player_1,player_2;

typedef struct num_x
{
    int a;
}sum,num_1,num_2;
//一些函数声明
void Draw();
void draw(player_1*m,player_2*n,sum*d);
void Chess();
void PutChess(Locate*p,player_1*m,player_2*n,sum*d);
void chess(Locate*p,player_1*m,player_2*n,sum*d,num_1*q);
void playgame();
void show(player_1*m,player_2*n);
void FuPan();

//主体框架
int main()
{
    int z;
    printf("1.开始游戏");
    printf("\n2.进行复盘");
    printf("\n选择:");
    scanf("%d",&z);
    switch(z)
    {
    case 1:{
    playgame();
    _getch();
    };
    break;
    case 2:{
    FuPan();
    _getch();
    };
    break;
    default:
        break;
    }
    return 0;
}

接下来是一些更多的代码段

1.画棋盘

void Draw()
{
    int i, j = 32;
    cleardevice();
    setlinestyle(PS_SOLID, 2);
    setcolor(RGB(0, 0, 0));

    for (i = 1; i <= 17; i++)
    {
        line(i * j, j, i * j, 17 * j);
        line(j, i * j, 17 * j, i * j);
    }
    circle(47, 47, R);
    setfillcolor(RGB(0, 0, 0));

    _getch();
}

2.敌我双方棋子的生成。

void draw(player_1*m,player_2*n,sum*d)
{
    int i, j = 32;
    cleardevice();
    setlinestyle(PS_SOLID, 2);
    setcolor(RGB(0, 0, 0));
    show(m,n);
    for (i = 1; i <= 17; i++)
    {
        line(i * j, j, i * j, 17 * j);
        line(j, i * j, 17 * j, i * j);
    }
    for(i=0;i<14;i++)
    {
        setfillcolor(BLACK);      //如果是所生成的随机数,则标黑
        outtextxy(44+a[i]*32,44+b[i]*32,c[i]);
        fillcircle(47+a[i]*32,47+b[i]*32,R);
    }
    for(i=0;i<=d->a;i++)
    {
        clearcircle(e[i],f[i],R);
    }
}

void Chess()                    //电脑自动生成棋子
{
    int m=32,x,y;
    int i,j;
    srand((int)time(0));
    a[0]=rand()%16;
    for(i=1;i<14;i++)
    {
        a[i]=rand()%16;
        for(j=0;j<i;j++)
        {
            if(a[i]==a[j])
            {
                i--;
            }
        }
    }
    b[0]=rand()%16;
    for(i=1;i<14;i++)
    {
        b[i]=rand()%16;
        for(j=0;j<i;j++)
        {
            if(b[i]==b[j])
            {
                i--;
            }
        }
    }
    for(i=0;i<14;i++)
    {
            for(x=47;x<47+16*32;)
            {
                for(y=47;y<47+16*32;)
                {
                    if(x==47+a[i]*32&&y==47+b[i]*32)
                    {
                        setfillcolor(BLACK);      //如果是所生成的随机数,则标黑
                        fillcircle(x,y,R);
                        //circle(x,y,R);
                    }
                    y+=m;
                }
                x+=m;
            }
    }
}

3.playgame的框架

void playgame()
{
    initgraph(600, 600);
    setbkcolor(WHITE);
    cleardevice();
    Draw();
    _getch();
    Chess();
    char ch_1;
    int i;
    sum d;
    num_1 q;
    d.a=0;
    q.a=0;
    Locate p;
    p.x = 47;
    p.y = 47;
    player_1 m;
    player_2 n;
    m.E=2;m.T=2;m.L=2;m.W=2;m.D=2;m.C=2;m.M=2;
    n.E=2;n.T=2;n.L=2;n.W=2;n.D=2;n.C=2;n.M=2;
    while(1)
    {
        if(m.E+m.T+m.L+m.W+m.D+m.C+m.M==0||n.E+n.T+n.L+n.W+n.D+n.C+n.M==0)
        {
            if(m.E+m.T+m.L+m.W+m.D+m.C+m.M==0)
            {
                outtextxy(300,250,"你赢了");
                FILE*fp;
                fp=fopen("1.dat","w");                      //每次要修改文件的名字
                int v=q.a;
                for(i=0;i<v;i++)
                    fprintf(fp,"%d\t%d\t%d\n",v,g[i],h[i]);
                for(i=0;i<14;i++)
                {
                    A[i]=44+a[i]*32;
                    B[i]=44+b[i]*32;
                    fprintf(fp,"%d\t%d%c\n",A[i],B[i],C[i]);
                }
                fclose(fp);
                _getch();
                break;
            }
            else
            {
                outtextxy(300,250,"你输了");
                FILE*fp;
                fp=fopen("1.dat","w");                       //每次要修改文件的名字
                int v=q.a;
                for(i=0;i<v;i++)
                    fprintf(fp,"%d\t%d\t%d\n",v,g[i],h[i]);
                for(i=0;i<14;i++)
                {
                    A[i]=44+a[i]*32;
                    B[i]=44+b[i]*32;
                    fprintf(fp,"%d\t%d%c\n",A[i],B[i],C[i]);
                }
                fclose(fp);
                _getch();
                break;
            }
        }
        else
        {
            ch_1=_getch();
            if(ch_1==' ')
        {
            PutChess(&p,&m,&n,&d);
        }
            else
            chess(&p,&m,&n,&d,&q);
        }
    }
}

4.控制棋子的移动并记录坐标

void chess(Locate *p,player_1*m,player_2*n,sum*d,num_1*q)
{
    int y=p->y;
    int x=p->x;
    char ch_1;
    ch_1 = _getch();
    switch (ch_1)
    {
    case 72: // up
    {
        if (y>47)
        {
            p->y = p->y - 32;
            draw(m,n,d);
            circle(p->x, p->y, R);
            g[q->a]=p->x;
            h[q->a]=p->y;
            q->a=q->a+1;
        }
        break;
    }
    case 80: // down
    {
        if (y<47+15*32)
        {
            p->y = p->y + 32;
            draw(m,n,d);
            circle(p->x, p->y, R);
            g[q->a]=p->x;
            h[q->a]=p->y;
            q->a=q->a+1;
        }
        break;
    }
    case 75: // left
    {
        if (x>47)
        {
            p->x = p->x - 32;
            draw(m,n,d);
            circle(p->x, p->y, R);
            g[q->a]=p->x;
            h[q->a]=p->y;
            q->a=q->a+1;
        }
        break;
    }
    case 77: // right
    {
        if (x<47+15*32)
        {
            p->x = p->x + 32;
            draw(m,n,d);
            circle(p->x, p->y, R);
            g[q->a]=p->x;
            h[q->a]=p->y;
            q->a=q->a+1;
        }
        break;
    }
    default:
        break;
    }
}

5.VS的逻辑

void PutChess(Locate*p,player_1*m,player_2*n,sum*d)         //下出棋子
{
    char ch_1, A;
    int i;
    ch_1 = _getch();
    switch (ch_1)
    {
    case 69:                                            //大象
    {
        if(n->E==0)
            outtextxy(300,300,"该类棋子已用完");
        else
     {
        A = 'E';
        C[d->a]='E';
        outtextxy(p->x, p->y, A);
       for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 84:                        //电脑的字母小
                    {
                            m->T=m->T-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 76:                        //电脑的字母小
                    {
                            m->L=m->L-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 87:                        //电脑的字母小
                    {
                            m->W=m->W-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 68:                        //电脑的字母小
                    {
                            m->D=m->D-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 67:                        //电脑的字母小
                    {
                            m->C=m->C-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 77:                        //游戏玩家的字母小
                    {
                            n->E=n->E-1;
                    }
                    break;
                case 69:
                    {
                            m->E=m->E-1;
                            n->E=n->E-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }
        }
       }
     }
    }
    break;
    case 84:                                         //老虎
    {
        if(n->T==0)
        outtextxy(300,300,"该类棋子已用完");
        else
        {
            A = 'T';
            C[d->a]='T';
            outtextxy(p->x, p->y, A);
        for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 76:                        //电脑的字母小
                    {
                            m->L=m->L-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 87:                        //电脑的字母小
                    {
                            m->W=m->W-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 68:                        //电脑的字母小
                    {
                            m->D=m->D-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 67:                        //电脑的字母小
                    {
                            m->C=m->C-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 77:                        //电脑的字母小
                    {
                            m->M=m->M-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 69:                        //游戏玩家的字母小
                    {
                            n->T=n->T-1;
                    }
                    break;
                case 84:
                    {
                            m->T=m->T-1;
                            n->T=n->T-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }
        }
       }
        }
    }
    break;
    case 76:                                       //狮子
    {
        if(n->L==0)
        outtextxy(300,300,"该类棋子已用完");
        else
        {
            A = 'L';
            C[d->a]='L';
            outtextxy(p->x, p->y, A);
        for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 87:                        //电脑的字母小
                    {
                            m->W=m->W-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 68:                        //电脑的字母小
                    {
                            m->D=m->D-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 67:                        //电脑的字母小
                    {
                            m->C=m->C-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 77:                        //电脑的字母小
                    {
                            m->M=m->M-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 84:                        //游戏玩家的字母小
                    {
                            n->L=n->L-1;
                    }
                case 69:                        //游戏玩家的字母小
                    {
                            n->L=n->L-1;
                    }
                    break;
                case 76:
                    {
                            m->L=m->L-1;
                            n->L=n->L-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }
        }
        }
        }
    }
    break;
    case 87:
    {
        if(n->W==0)                             //狼
        outtextxy(300,300,"该类棋子已用完");
        else
        {
            A = 'W';
            C[d->a]='W';
            outtextxy(p->x, p->y, A);
        for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 68:                        //电脑的字母小
                    {
                            m->D=m->D-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 67:                        //电脑的字母小
                    {
                            m->C=m->C-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 77:                        //电脑的字母小
                    {
                            m->M=m->M-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 76:                        //游戏玩家的字母小
                    {
                            n->W=n->W-1;
                    }
                    break;
                case 84:                        //游戏玩家的字母小
                    {
                            n->W=n->W-1;
                    }
                    break;
                case 69:                        //游戏玩家的字母小
                    {
                            n->W=n->W-1;
                    }
                    break;
                case 87:
                    {
                            m->W=m->W-1;
                            n->W=n->W-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }
        }
       }
        }
    }
    break;
    case 68:                                      //狗
    {
        if(n->D==0)
        outtextxy(300,300,"该类棋子已用完");
        else
        {
            A = 'D';
            C[d->a]='D';
            outtextxy(p->x, p->y, A);
        for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 67:                        //电脑的字母小
                    {
                            m->C=m->C-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 77:                        //电脑的字母小
                    {
                            m->M=m->M-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 87:                        //游戏玩家的字母小
                    {
                            n->D=n->D-1;
                    }
                    break;
                case 76:                        //游戏玩家的字母小
                    {
                            n->D=n->D-1;
                    }
                    break;
                case 84:                        //游戏玩家的字母小
                    {
                            n->D=n->D-1;
                    }
                    break;
                case 69:                        //游戏玩家的字母小
                    {
                            n->D=n->D-1;
                    }
                    break;
                case 68:
                    {
                            m->D=m->D-1;
                            n->D=n->D-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }

        }
       }
        }
    }
    break;
    case 67:                                        //猫
    {
        if(n->C==0)
        outtextxy(300,300,"该类棋子已用完");
        else
        {
            A = 'C';
            C[d->a]='C';
            outtextxy(p->x, p->y, A);
        for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 77:                        //电脑的字母小
                    {
                            m->M=m->M-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 68:                        //游戏玩家的字母小
                    {
                            n->C=n->C-1;
                    }
                    break;
                case 87:                        //游戏玩家的字母小
                    {
                            n->C=n->C-1;
                    }
                    break;
                case 76:                        //游戏玩家的字母小
                    {
                            n->C=n->C-1;
                    }
                    break;
                case 84:                        //游戏玩家的字母小
                    {
                            n->C=n->C-1;
                    }
                    break;
                case 69:                        //游戏玩家的字母小
                    {
                            n->C=n->C-1;
                    }
                    break;
                case 67:
                    {
                            m->C=m->C-1;
                            n->C=n->C-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }
        }
       }
        }
    }
    break;
    case 77:                                          //老鼠
    {
        if(n->M==0)
        outtextxy(300,300,"该类棋子已用完");
        else
        {
            A = 'M';
            C[d->a]='M';
            outtextxy(p->x, p->y, A);
        for(i=0;i<14;i++)
       {
        if(47+a[i]*32==p->x&&47+b[i]*32==p->y)
        {
            switch(c[i])
            {
                case 69:                        //电脑的字母小
                    {
                            m->E=m->E-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                case 67:                        //游戏玩家的字母小
                    {
                            n->M=n->M-1;
                    }
                    break;
                case 68:                        //游戏玩家的字母小
                    {
                            n->M=n->M-1;
                    }
                    break;
                case 87:                        //游戏玩家的字母小
                    {
                            n->M=n->M-1;
                    }
                    break;
                case 76:                        //游戏玩家的字母小
                    {
                            n->M=n->M-1;
                    }
                    break;
                case 84:                        //游戏玩家的字母小
                    {
                            n->M=n->M-1;
                    }
                    break;
                case 77:
                    {
                            m->M=m->M-1;
                            n->M=n->M-1;
                            clearcircle(47+a[i]*32,47+b[i]*32,R);
                            e[d->a]=47+a[i]*32;
                            f[d->a]=47+b[i]*32;
                            d->a+=1;
                    }
                    break;
                default:
                    break;
            }
        }
       }
        }
    }
    break;
    default:
        break;
    }
}

6.页面的布局 

void show(player_1*m,player_2*n)
{
    settextstyle(16,0,"微软黑体");
    char s[50];
    sprintf(s,"电脑:E:%d T:%d L:%d W:%d D:%d C:%d M:%d",m->E,m->T,m->L,m->W,m->D,m->C,m->M);
    outtextxy(10,3,s);
    char t[50];
    sprintf(t,"玩家:E:%d T:%d L:%d W:%d D:%d C:%d M:%d",n->E,n->T,n->L,n->W,n->D,n->C,n->M);
    outtextxy(10,550,t);
}

7.复盘

void FuPan()
{
    int q;
    int i;
    char M[50];
    printf("输入你要复盘的对局的文件名:");         
    scanf("%s",&M);
    FILE*fp;
    fp=fopen(M,"r");
    rewind(fp);
    fscanf(fp,"%d",&q);
    for(i=0;i<q;i++)
    {
        fscanf(fp,"%d%d",&h[i],&g[i]);
             fseek(fp,5L,SEEK_CUR);
    }
    fseek(fp,-3L,SEEK_CUR);
    for(i=0;i<14;i++)
    {
        fscanf(fp,"%d%d%c",&A[i],&B[i],&C[i]);//fscanf读取时中间不能有空格
        fseek(fp,1L,SEEK_CUR);
    }
    initgraph(600, 600);
    setbkcolor(WHITE);
    cleardevice();
    Draw();
    settextstyle(16,0,"微软黑体");
    outtextxy(10,3,"上方字母是你下的棋,下方字母是电脑下的棋");
    for(i=0;i<14;i++)
    {
        outtextxy(A[i],B[i],c[i]);
        outtextxy(A[i],B[i]-13,C[i]);
    }
    for(i=0;i<q;i++)
    {
        setfillcolor(BLACK);
        circle(h[i],g[i],R);
    }
    fclose(fp);
}

可能整体看下来比较繁琐,希望能够抛砖引玉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值