#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>//可能不是所有的都会用到
int player=1;//对于游戏者的选择
int state[2][300][300];//用于记录之前子的位置
int x=1,y=1;//用于记录光标位置
#define len 16
void gotoxy(int x, int y) //定义出一个移动光标的函数
{
COORD pos;
pos.X = x - 1;
pos.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void qipan()
{
int i,j;
printf("┌─");
for(i=0;i<len-2;i++)
{
printf("┬─");
}
printf("┐");//打出第一行
for(i=0;i<len-2;i++)
{
printf("\n");
for(j=0;j<len;j++)
printf("│ ");
printf("\n├");
for(j=0;j<len-2;j++)
printf("─┼");
printf("─┤");
}//打出中间的数行
printf("\n");
for(j=0;j<len;j++)
{
printf("│ ");
}
printf("\n└");
for(i=0;i<len-2;i++)
{
printf("─┴");
}
printf("─┘");//打出最后两行
gotoxy(x,y);//光标回到左上角
}
void move()//一个移动光标的函数,并将使用了落子函数
{
switch(getch())//之所以x和y分别移动一次的大小不同是为了每次都移动到方格的交叉点,另外黑框的长和宽的长度应该是不同的,所以这样
{
case 'a':if(x>1) x-=4; break ;
case 's':if(y<2*len-2) y+=2; break;
case 'w':if(y>1) y-=2; break;
case 'd':if(x<4*len-4) x+=4; break;
case ' ':if(state[0][x][y]==0&&state[1][x][y]==0) luo(); break;
}
gotoxy(x,y);
}
void luo()
{
switch(player)
{
case 1: printf("●"); state[player][x][y]=1; break;
case 0: printf("○"); state[player][x][y]=1; break;
}
win();
player++;
player=player%2;//玩家切换
}
void win()
{
int i,j,m,n,shu,k,jishu;
for(i=x-4;i<x+8;i+=4)
for(j=y-2;j<y+4;j+=2)
if(state[player][i][j]==1&&(i!=x|j!=y))//对周围9子进行搜索,如果有子进行下一步
{
m=x;
n=y;
jishu=0;
for(k=0;k<4;k++)
{
if(m>0&&n>0)//利用已知的俩个子写出一个函数然后从变量=x/y-4处开始搜素,用if是防止数组炸掉
{
m+=i-x;
n+=j-y;
}
else
break;
}
for(k=0;k<9;k++)//依照函数向前搜索9格, 有5个连续胜利。
{
if(state[player][m][n]==1)
{
jishu++;
if(jishu>=5)
{
gotoxy(1,1);
printf("最后落子者胜利");
}
}
else
jishu=0;
if(m>0&&n>0)
{
m-=i-x;
n-=j-y;
}
else
break;
}
}
}
void main()
{
system("mode con cols=64 lines=33");//调整窗口大小
system("color E1");//调整窗口指颜色
qipan();
while(1)
{
move();
}
}
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>//可能不是所有的都会用到
int player=1;//对于游戏者的选择
int state[2][300][300];//用于记录之前子的位置
int x=1,y=1;//用于记录光标位置
#define len 16
void gotoxy(int x, int y) //定义出一个移动光标的函数
{
COORD pos;
pos.X = x - 1;
pos.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void qipan()
{
int i,j;
printf("┌─");
for(i=0;i<len-2;i++)
{
printf("┬─");
}
printf("┐");//打出第一行
for(i=0;i<len-2;i++)
{
printf("\n");
for(j=0;j<len;j++)
printf("│ ");
printf("\n├");
for(j=0;j<len-2;j++)
printf("─┼");
printf("─┤");
}//打出中间的数行
printf("\n");
for(j=0;j<len;j++)
{
printf("│ ");
}
printf("\n└");
for(i=0;i<len-2;i++)
{
printf("─┴");
}
printf("─┘");//打出最后两行
gotoxy(x,y);//光标回到左上角
}
void move()//一个移动光标的函数,并将使用了落子函数
{
switch(getch())//之所以x和y分别移动一次的大小不同是为了每次都移动到方格的交叉点,另外黑框的长和宽的长度应该是不同的,所以这样
{
case 'a':if(x>1) x-=4; break ;
case 's':if(y<2*len-2) y+=2; break;
case 'w':if(y>1) y-=2; break;
case 'd':if(x<4*len-4) x+=4; break;
case ' ':if(state[0][x][y]==0&&state[1][x][y]==0) luo(); break;
}
gotoxy(x,y);
}
void luo()
{
switch(player)
{
case 1: printf("●"); state[player][x][y]=1; break;
case 0: printf("○"); state[player][x][y]=1; break;
}
win();
player++;
player=player%2;//玩家切换
}
void win()
{
int i,j,m,n,shu,k,jishu;
for(i=x-4;i<x+8;i+=4)
for(j=y-2;j<y+4;j+=2)
if(state[player][i][j]==1&&(i!=x|j!=y))//对周围9子进行搜索,如果有子进行下一步
{
m=x;
n=y;
jishu=0;
for(k=0;k<4;k++)
{
if(m>0&&n>0)//利用已知的俩个子写出一个函数然后从变量=x/y-4处开始搜素,用if是防止数组炸掉
{
m+=i-x;
n+=j-y;
}
else
break;
}
for(k=0;k<9;k++)//依照函数向前搜索9格, 有5个连续胜利。
{
if(state[player][m][n]==1)
{
jishu++;
if(jishu>=5)
{
gotoxy(1,1);
printf("最后落子者胜利");
}
}
else
jishu=0;
if(m>0&&n>0)
{
m-=i-x;
n-=j-y;
}
else
break;
}
}
}
void main()
{
system("mode con cols=64 lines=33");//调整窗口大小
system("color E1");//调整窗口指颜色
qipan();
while(1)
{
move();
}
}