C语言简单游戏编程入门之四子棋

运行截图

在这里插入图片描述

源代码

#include<stdio.h>
#include<stdlib.h>
/*
	四子棋
	1.在一个6行7列的棋盘中
	2.玩家1和玩家2依次交替下子
	3.每次下子落于棋盘可能达到的最下方
	4.先四子相连为胜
	5.棋盘已满且无四子相连为平局 
*/

/*定义常量*/
//行数 
#define ROW 7
//列数 
#define COL 8
//玩家1的棋子
#define O 1
//玩家2的棋子
#define X 2
//空白
#define WHITE 0 
//胜利需要的连字数
#define COUNT 4 

/*定义全局变量*/ 
int map[ROW][COL]={0};

//打印地图  
void PrintMap(int map[][COL],int row,int col);
//下子
int PlayChess(int map[][COL],int col,int piece); 
//是否已经赢了
int IsWin(int map[][COL],int row,int col,int piece); 

int main()
{ 
	int piece=O;
	int row;
	int col;
	int Winner=0;
	int count_piece=0;
	
	while(1)
	{
		/*清屏*/
		system("cls");
		
		PrintMap(map,ROW-1,COL-1);
		if(Winner!=0||count_piece==(ROW-1)*(COL-1))
		{
			break;
		}
		printf("现在%d号玩家下子\n",piece);
		printf("落子位置(1~%d):",COL-1);
		scanf("%d",&col);
		if(col<1||col>=COL)
		{
			printf("下子位置无效!\n");
			continue;
		}
		row=PlayChess(map,col,piece);
		if(row==0)
		{
			printf("该列已经满了!\n");
		}
		else
		{
			count_piece++;
			Winner=IsWin(map,row,col,piece);
			if(Winner!=0)
			{
				
			}
			else
			{
				if(piece==O)
				{
					piece=X;
				}
				else if(piece==X)
				{
					piece=O;
				}
			}
		}
	}
	if(Winner!=0)
	{
		printf("%d号玩家获胜!\n",Winner);
	}
	else
	{
		printf("平局!\n");
	}
	return 0;
}

//打印地图  
void PrintMap(int map[][COL],int row,int col)
{
	/*
	int i=1;
	while(i<=row)
	{
		int j=1;
		while(j<=col)
		{
			if(map[i][j]==O)
			{
				printf("O");
			}
			else if(map[i][j]==X)
			{
				printf("X");
			}
			else if(map[i][j]==WHITE)
			{
				printf(" ");
			}
			j++;	
		}	
		printf("\n");
		i++;
	} 
	*/
	int number=1;
	while(number<=2*COL-2)
	{
		if(number%2==0)
		{
			printf("%d",number/2);
		}
		else
		{
			printf(" ");
		}
		number++;
	}
	printf("\n");
	
	int i=1;
	while(i<=2*ROW-1)
	{
		int j=1;
		while(j<=2*COL-1)
		{
			if(i%2==1)
			{
				printf("-");
			}
			else if(j%2==1)
			{
				printf(" ");
			}
			else
			{
				int h=i/2;
				int z=j/2;
				if(map[h][z]==O)
				{
					printf("O");
				}
				else if(map[h][z]==X)
				{
					printf("X");
				}
				else
				{
					printf(" ");
				}
			}
			j++;
		}
		printf("\n");
		i++;
	} 
} 

//下子
int PlayChess(int map[][COL],int col,int piece)
{
	int i=ROW-1;
	while(i>=1)
	{
		if(map[i][col]==WHITE)
		{
			map[i][col]=piece;
			return i;
		}
		i--;
	}
	return 0;
}

//是否已经赢了
int IsWin(int map[][COL],int row,int col,int piece)
{
	int countH=1,countS=1,countP=1,countN=1;
	int i;
	
	/*计算countH*/
	/*左边*/
	i=col-1;
	while(i>=1)
	{
		if(map[row][i]==piece)
		{
			countH++;
		}
		else
		{
			break;
		}
		i--;
	}
	/*右边*/
	i=col+1;
	while(i<=COL-1)
	{
		if(map[row][i]==piece)
		{
			countH++;
		}
		else
		{
			break;
		}
		i++;
	}
	
	/*计算countS*/
	/*上边*/
	i=row-1;
	while(i>=1)
	{
		if(map[i][col]==piece)
		{
			countS++;	
		}	
		else
		{
			break;
		}
		i--;
	} 
	/*下边*/
	i=row+1;
	while(i<=ROW-1)
	{
		if(map[i][col]==piece)
		{
			countS++;	
		}	
		else
		{
			break;
		}
		i++;
	}
	
	int j;
	/*计算countN*/
	/*左上*/
	i=row-1;
	j=col-1;
	while(i>=1&&j>=1)
	{
		if(map[i][j]==piece)
		{
			countN++;
		}
		else
		{
			break;
		}
		i--;
		j--;
	}
	/*右下*/
	i=row+1;
	j=col+1;
	while(i<=ROW-1&&j<=COL-1)
	{
		if(map[i][j]==piece)
		{
			countN++;
		}
		else
		{
			break;
		}
		i++;
		j++;
	}
	
	/*计算countP*/
	/*右上*/
	i=row-1;
	j=col+1;
	while(i>=1&&j<=COL-1)
	{
		if(map[i][j]==piece)
		{
			countP++;
		}
		else
		{
			break;
		}
		i--;
		j++;
	}
	/*左下*/
	i=row+1;
	j=col-1;
	while(i<=ROW-1&&j>=1)
	{
		if(map[i][j]==piece)
		{
			countP++;
		}
		else
		{
			break;
		}
		i++;
		j--;
	}
	
	if(countH>=COUNT||countS>=COUNT||countP>=COUNT||countN>=COUNT)
	{
		return piece;
	}
	else 
	{
		return 0;
	}
}

实现思路

整形二维数组存储棋盘
其余的比较简单,在源码中描述的比较仔细,在此不多赘述。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值