【原创】【程序小游戏】从井字棋下到30子棋!可以扩充棋盘的棋!

N子棋

描述

如题,
具体自己Copy下来看~AuA

代码

#include<ctime>
#include<cstdio>
#include<conio.h>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<windows.h>
#include<algorithm>
using namespace std;

void color(int a)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void gt(int x,int y)
{
    COORD pos;
    pos.X=y;
    pos.Y=x;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void gt2(int x,int y)
{
    COORD pos;
    pos.X=y*2;
    pos.Y=x*2;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void ShakeWindow()
{   
    int SHAKE=5;
    RECT rect;   
    HWND hwnd=GetForegroundWindow();  
    GetWindowRect(hwnd,&rect);   
    MoveWindow(hwnd,rect.left+SHAKE,rect.top,rect.right-rect.left,rect.bottom-rect.top,TRUE);   
    Sleep(28);   
    MoveWindow(hwnd,rect.left+SHAKE,rect.top-SHAKE,rect.right-rect.left,rect.bottom-rect.top,TRUE);   
    Sleep(28);   
    MoveWindow(hwnd,rect.left,rect.top-SHAKE,rect.right-rect.left,rect.bottom-rect.top,TRUE);   
    Sleep(28);   
    MoveWindow(hwnd,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,TRUE);   
}  

void FullScreen()
{ 
    HWND hwnd=GetForegroundWindow();
    int x=GetSystemMetrics(SM_CXSCREEN);
    int y=GetSystemMetrics(SM_CYSCREEN);
    char setting[30];
    sprintf(setting,"mode con:cols=%d lines=%d",x,y);
    system(setting); 
    SetWindowPos(hwnd,HWND_TOPMOST,0,0,x,y,NULL);
    MoveWindow(hwnd,0,0,x,y,0);
    printf("\n\n");
}

char mmp[1000][1000],c;//地图
int cmp[1000][1000],co[2]={11,12};//地图对应位置的颜色编号

int R=6,C=6,W=3,round;//R/2行C/2列(显示的问题),W子连线获胜
char ply[2][1000];
int posx=0,posy=0;

bool vis[1000][1000];

void init_map();
void out_map();
int check();

int main()
{
    FullScreen();
    //system("mode con cols=360 lines=360 ");
    gt(5,3);printf("请输入玩家1姓名(不能超过20个字符):");fgets(ply[1],21,stdin);ply[1][strlen(ply[1])-1]='\0';
    system("cls");
    gt(5,3);printf("请输入玩家2姓名(不能超过20个字符):");fgets(ply[0],21,stdin);ply[0][strlen(ply[0])-1]='\0';
    system("cls");

    init_map();
    while(1)
    {
        int a=check();
        if(a==1||a==2) 
        {
            gt(R,0);
            printf("恭喜玩家%s胜利!\n",ply[--a]);
            Sleep(2000);
            gt(R+8,0);
            color(7);
            break;
        }
        if(a==3)
        {
            gt(R,0);
            color(11);
            printf("平局!\n");
            Sleep(2000);
            gt(R+8,0);
            color(7);
            break;
        }
        out_map();
        round=(round+1)%2;
        gt(R+1,0);
        printf("请玩家%s操作!\n",ply[round]);
        printf("1.落子                                        \n");
        printf("2.在下面增加一行(上限18行)                      \n");
        printf("3.在右边增加一列(上限36列)                      \n");
        printf("4.增加胜利棋子个数(不能超过行数或列数)       \n");
        gt(0,0);
        hh: c=getch();

        if(c=='1')
        {
            posx=0; posy=0;
            gt2(posx,posy);
            gt(R+2,0); printf("请用wasd移动光标,读入空格即为落子。");
            gt(R+3,0); printf("                                ");
            gt(R+4,0); printf("                                ");
            gt(R+5,0); printf("                                                  ");
            gt(0,0);
            char b;
            pp:while(1)
            {
                b=getch();
                if(b=='w'||b=='W') 
                    posx=max(0,posx-1);
                if(b=='s'||b=='S')
                    posx=min(R/2-1,posx+1);
                if(b=='a'||b=='A')
                    posy=max(0,posy-1);
                if(b=='d'||b=='D')
                    posy=min(C/2-1,posy+1);
                if(b==' ')
                {
                    if(mmp[posx*2][posy*2]==' ')
                    {
                        cmp[posx*2][posy*2]=co[round];
                        mmp[posx*2][posy*2]='O';
                        color(co[round]);
                        putchar(mmp[posx*2][posy*2]);
                        break;
                    }
                    else 
                    {
                        gt(R,0);
                        printf("此地不能下棋!请重新选择!");
                        Sleep(500);
                        gt(R,0);
                        printf("                                      ");
                        gt2(posx,posy);
                        goto pp;
                        break;
                    }
                }
                else gt2(posx,posy);
            }
        }
        else if(c=='2')
        {
            if(R<=34) R+=2,system("cls");
            else goto hh;
        }
        else if(c=='3')
        {
            if(C<=70) C+=2,system("cls");
            else goto hh;
        }
        else if(c=='4')
        {
            if(W<R/2||W<C/2) W++,system("cls");
            else goto hh;
        }
        else goto hh;
    }
}

void init_map()
{
    for(int i=0;i<=150;i++)
    {
        for(int j=0;j<=100;j++)
            mmp[i][j]=' ',
            mmp[i][++j]='|',
            cmp[i][j]=7;
        i++;
        for(int j=0;j<=150;j++)
            mmp[i][j]='-',cmp[i][j]=7;
    }
}

void out_map()
{
    for(int i=0;i<R-1;i++,putchar('\n'))
        for(int j=0;j<C-1;j++)
            color(cmp[i][j]),gt(i,j),
            putchar(mmp[i][j]);

    color(7);gt(R/2-1,C/2+C);
    printf("当前有%d行,%d列\n",R/2,C/2);
    gt(R/2,C/2+C);
    printf("%d子连线胜利\n",W);
}

int dx[9]={0,0,2,-2,2,-2,2,-2},dy[9]={2,-2,0,0,2,-2,-2,2};

bool dfs(int x,int y)
{
    for(int i=0;i<8;i++)
    {
        int j;
        for(j=1;j<W;j++)
        {
            if(x+j*dx[i]>=0&&x+j*dx[i]<R
                &&y+j*dy[i]>=0&&y+j*dy[i]<C
                &&mmp[x+j*dx[i]][y+j*dy[i]]==mmp[x][y]
                &&cmp[x+j*dx[i]][y+j*dy[i]]==cmp[x][y])
                continue;
            else break;
        }
        if(j>=W) return 1;
    }
    return 0;

}

int check()
{
    bool f=0;
    for(int i=0;i<R;i+=2)
        for(int j=0;j<C;j+=2)
            if(mmp[i][j]!=' ')
            {
                memset(vis,0,sizeof vis);
                if(dfs(i,j)) return cmp[i][j]==11?1:2;
            }
            else f=1;
    if(f) return 0;
    return 3;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值