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;
}