基于windows控制台的五子棋小游戏

本文介绍了一个基于Windows控制台的小型五子棋游戏实现。游戏使用C语言编写,包含光标移动、棋子放置及胜利判断等功能。通过键盘输入控制光标,玩家轮流在25x25的棋盘上下棋,首先连成五子者获胜。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于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(temp
a[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(temp
a[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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fjxx_psy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值