基于windows控制台的五子棋小游戏
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define N 25 //25 * 25 的棋盘
int prtMap(int a[N][N]); //(*a)[N]
int keyScan(int (*a)[N],int *x,int *y,int *flag);
int judge_victory(int (*a)[N],int *x,int *y,int *flag);
int main()
{
int a[N][N] = {{0}};
int x = 10,y = 10;
int flag = 0; //0 – 玩家1 1 – 玩家2
a[x][y] = 1; //初始化光标光标位置
while(1)
{
prtMap(a); //打印地图
keyScan(a,&x,&y,&flag); //按键处理
if(judge_victory(a,&x,&y,&flag) == 1)//判断输赢
break; //只要有一方赢,立即退出
}
if(flag == 0)
printf(“玩家1获胜\n”);
else
printf(“玩家2获胜\n”);
getchar(); //按任意键退出
return 0;
}
int prtMap(int a[N][N]) //(*a)[N]
{
int i,j;
system(“cls”);
system(“color 2f”);
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
switch(a[i][j])
{
case 0: printf(“┼”); break; // 0 == 棋盘
case 1: printf(“╬”); break; // 1 == 光标
case 2: printf(“○”); break; // 2 == 黑棋
case 3: printf(“●”); break; // 3 == 白棋
case 4: printf(“①”); break; // 4 == 光标在白棋上面
case 5: printf(“②”); break; // 5 == 光标在黑棋上面
}
}
printf("\n");
}
return 0;
}
int keyScan(int (*a)[N],int *x,int *y,int *flag)
{
char get_ch = getch();
switch(get_ch)
{
case ‘w’:
{
if(*x > 0) (*x) = (*x)-1; //光标向上移动
if(a[*x][*y] == 0) a[*x][*y] = 1; //空白处光标为1
if(a[*x][*y] == 2) a[*x][*y] = 4; //白棋上光标为4
if(a[*x][*y] == 3) a[*x][*y] = 5; //黑棋上光标为5
if(a[*x+1][*y] == 1) a[*x+1][*y] = 0; //消除脚印
if(a[*x+1][*y] == 4) a[*x+1][*y] = 2; //消除脚印
if(a[*x+1][*y] == 5) a[*x+1][*y] = 3; //消除脚印
}break;
case 's':
{
if(*x < 19) (*x) = (*x)+1;
if(a[*x][*y] == 0) a[*x][*y] = 1; //空白处光标为1
if(a[*x][*y] == 2) a[*x][*y] = 4; //白棋上光标为4
if(a[*x][*y] == 3) a[*x][*y] = 5; //黑棋上光标为5
if(a[*x-1][*y] == 1) a[*x-1][*y] = 0;
if(a[*x-1][*y] == 4) a[*x-1][*y] = 2;
if(a[*x-1][*y] == 5) a[*x-1][*y] = 3;
}break;
case 'a':
{
if(*y > 0) (*y) = (*y)-1;
if(a[*x][*y] == 0) a[*x][*y] = 1; //空白处光标为1
if(a[*x][*y] == 2) a[*x][*y] = 4; //白棋上光标为4
if(a[*x][*y] == 3) a[*x][*y] = 5; //黑棋上光标为5
if(a[*x][*y+1] == 1) a[*x][*y+1] = 0;
if(a[*x][*y+1] == 4) a[*x][*y+1] = 2;
if(a[*x][*y+1] == 5) a[*x][*y+1] = 3;
}break;
case 'd':
{
if(*y < 19) (*y) = (*y)+1;
if(a[*x][*y] == 0) a[*x][*y] = 1; //空白处光标为1
if(a[*x][*y] == 2) a[*x][*y] = 4; //白棋上光标为4
if(a[*x][*y] == 3) a[*x][*y] = 5; //黑棋上光标为5
if(a[*x][*y-1] == 1) a[*x][*y-1] = 0;
if(a[*x][*y-1] == 4) a[*x][*y-1] = 2;
if(a[*x][*y-1] == 5) a[*x][*y-1] = 3;
}break;
case 32:
{
if(a[*x][*y] == 1)
{
if((*flag) == 1)
a[*x][*y] = 2;
else a[*x][*y] = 3;
*flag = !(*flag);
}
}break;
}
return 0;
}
//judge victory
int judge_victory(int (*a)[N],int *x,int *y,int *flag)
{
int i = 0,j = 0;
int temp = (3-!(*flag));
for(i=0,j=*y; i<N; i++) //锁定列,扫描同一列上的元素是否相等
{
if(tempa[i][j]&&tempa[i+1][j]&&tempa[i+2][j]&&tempa[i+3][j]&&tempa[i+4][j])
return 1;
}
for(i=*x,j=0; j<N; j++) //锁定行,扫描同一行上的元素是否相等
{
if(tempa[i][j]&&tempa[i][j+1]&&tempa[i][j + 2]&&tempa[i][j+3]&&tempa[i][j+4])
return 1;
}
//找到左下最后一个元素的行标,扫描落子所在正对角线
for(i=(*x)+(*y),j=0; i>=0; i–,j++)
{
if(tempa[i][j]&&tempa[i-1][j+1]&&tempa[i-2][j+2]&&tempa[i-3][j+3]&&tempa[i-4][j+4])
return 1;
}
//先找到左上第一个元素的列标,扫描落子所在副对角线上
for(i=(*x)-(*y),j=0; j<N; i++,j++)
{
if(tempa[i][j]&&tempa[i+1][j+1]&&tempa[i+2][j+2]&&tempa[i+3][j+3]&&tempa[i+4][j+4])
return 1;
}
return
0;
}