C语言三字棋优化,实现ROW*COL个格子,ZI字棋

三字棋优化 ,主要是针对棋局大小及方式的优化,可实现ROW*COL个格子,ZI字棋。也即棋盘方式,与下法都可以变化。

其中game.c中分别写了纯三字棋>优化>ROW*COL三字棋>优化>ROW*COL个格子ZI字棋的三种写法。

运行过程如下

 

 

 

主程序代码:

test.c


#pragma warning(disable : 4996)
#pragma warning(disable : 6031)


#include "game.h"
#include "menu.h"



int main() 
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		clc();
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

 

菜单栏头文件

menu.h

#ifndef __MENU_H__
#define __MEBU_H__

void menu();

#endif 

 

菜单栏c文件

menu.c

#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include "game.h"
void menu()
{
	printf("****************************************\n");
	printf("*******棋盘模式%d行,%d列,%d字棋*********\n", ROW, COL, ZI);
	printf("********  1:play   0:exit  ***********\n");
	printf("****************************************\n");
}
游戏程序代码,头文件

game.h


#pragma warning(disable : 4996)
#pragma warning(disable : 6031)

#ifndef __GAME_H__
#define __GAME_H__

#define ROW 3   //3行
#define  COL 5  //5列
#define  ZI 3   //后续需传参几字棋
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

void game();
void InitChess(char chess[ROW][COL]);
void DisplayChess(char chess[ROW][COL]);
void PlayerMove(char chess[ROW][COL]);
void ComputerMove(char chess[ROW][COL]);
void clc();                   //清除多余字符
char IsWin(char chess[ROW][COL]);
int IsFull(char chess[ROW][COL]);


#endif // !__GAME_H__
游戏程序代码,c文件

game.c


#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
 
#include "game.h"


void game()
{
	char ret;
	char chess[ROW][COL]; 
	InitChess(chess);     //初始化棋盘
	DisplayChess(chess);  //输入棋盘
	while (1)
	{
		PlayerMove(chess);    //玩家下棋
		DisplayChess(chess);
		ret=IsWin(chess);
		if(ret!= 'C')
			break;
		ComputerMove(chess);   //电脑下棋
		DisplayChess(chess);
		ret = IsWin(chess);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢!\n");
	else if (ret == '#')
		printf("电脑赢!\n");
	else
		printf("平局!\n");
} 

//player win  return '*'
//computer win return '#'
//平局 return  'Q'
//继续 return 'C'

void InitChess(char chess[ROW][COL])
{
	int i, j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			chess[i][j] = ' ';
		}
	}
}


void DisplayChess(char chess[ROW][COL])
{
	int i, j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			printf(" %c ", chess[i][j]);
			if(j<COL-1)
				printf("|");
		}
		printf("\n");
		for (j = 0; j < COL; j++)
		{
			if (i == ROW - 1)
				break;
			printf("---");
			if (j < COL - 1)
				printf("|");
		} 
		printf("\n");
	} 
}

void clc()
{
	int ch = 0;
	while ((ch = getchar()) != '\n')
	{
		;
	}
}

void PlayerMove(char chess[ROW][COL])
{
	printf("输入坐标形式例如>>3,4<<,表示第3行第4列\n");
	int i, j;
	while (1)
	{
		printf("玩家下棋请输入:>");
		scanf("%d,%d", &i, &j);
		clc();
		if (i >= 1 && i <= ROW && j>=1 && j <= COL)
		{
			if (chess[i - 1][j - 1] == ' ')
			{
				chess[i - 1][j - 1] = '*';
				break;
			}
			else
				printf("此处已有棋子,换一处吧~\n");
		}
		else
			printf("输入格式错误,请重新输入!\n");
	}
}

void ComputerMove(char chess[ROW][COL])
{
	printf("电脑下棋:>\n");
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (chess[x][y] == ' ')
		{
			chess[x][y] = '#';
			break;
		}
	}
}




char IsWin(char chess[ROW][COL])
{
	int row,col,x,i,j;

    //纯纯的3字棋

	//横三行判断
	//for (row = 0; row < ROW; row++)
	//{
	//	if (chess[row][0] == chess[row][1] && chess[row][0] == chess[row][2] && chess[row][1] != ' ')
	//	{
	//		return chess[row][0];
	//	}
	//}
	竖三行判断
	//for (col = 0; col < COL; col++)
	//{
	//	
	//	if (chess[0][col] == chess[1][col] && chess[0][col] == chess[2][col] && chess[2][col]  != ' ')
	//	{
	//		return chess[0][col];
	//	}
	//}

	两个对角线
	//if (chess[0][0] == chess[1][1] && chess[0][0] == chess[2][2] && chess[2][2] != ' ')
	//	return chess[0][0];
	//if (chess[2][0] == chess[1][1] && chess[2][0] == chess[0][2] && chess[0][2] != ' ')
	//	return chess[0][0];
	


/**************************************************************************************************************************/

	优化1   N行N列,3字棋
	
	判断列连续
	//
	//for (i = 0; i < ROW-2; i++)
	//{
	//	for (j = 0; j < COL; j++)
	//	{
	//		if (chess[i][j] == chess[i + 1][j] && chess[i][j] == chess[i + 2][j] && chess[i][j] != ' ')
	//			return chess[i][j];
	//	}
	//}

	判断行连续
	//for (j = 0; j < COL-2; j++)
	//{
	//	for (i = 0; i < ROW; i++)
	//	{		
	//		if (chess[i][j] == chess[i][j+1] && chess[i][j] == chess[i][j+2] && chess[i][j] != ' ')
	//			return chess[i][j];
	//	}
	//}

	左对角
	//for (i = 0; i < ROW-2; i++)
	//{
	//	for (j = 0; j < COL-2; j++)
	//	{
	//		if (chess[i][j] == chess[i + 1][j+1] && chess[i][j] == chess[i + 2][j+2] && chess[i][j] != ' ')
	//			return chess[i][j];
	//	}
	//}

	右对角
	//for (i = 2; i < ROW; i++)
	//{
	//	for (j = 0 ; j < COL-2; j++)
	//	{
	//		if (chess[i][j] == chess[i - 1][j + 1] && chess[i][j] == chess[i - 2][j + 2] && chess[i][j] != ' ')
	//			return chess[i][j];
	//	}
	//}

/***************************************************************************************************************************/
	
	//优化2   ROW行COL列,ZI字棋
	
	 
	//判断列连续
	for (i = 0; i < ROW-ZI+1; i++)
	{
		for (j = 0; j < COL; j++)
		{
			int sum = 0;
			for (row = 0; row < ZI ; row++)
				sum += chess[i + row][j];
			if (sum == ZI * '*')
				return '*';
			else if (sum == ZI * '#')
				return '#';
		}
	}

	//判断行连续
	for (j = 0; j < COL-ZI+1; j++)
	{
		for (i = 0; i < ROW; i++)
		{
			int sum = 0;
			for (col = 0; col < ZI; col++)
				sum += chess[i][j+col];
			if (sum == ZI * '*')
				return '*';
			else if (sum == ZI * '#')
				return '#';
		}
	}

	//左对角
	for (i = 0; i < ROW-ZI+1; i++)
	{
		for (j = 0; j < COL-ZI+1; j++)
		{
			int sum = 0;
			for (x = 0; x < ZI; x++)
				sum += chess[i + x][j + x];
			if (sum == ZI * '*')
				return '*';
			else if (sum == ZI * '#')
				return '#';
		}
	}

	//右对角
	for (i = ZI-1; i < ROW ; i++)
	{
		for (j = 0; j < COL - ZI + 1; j++)
		{
			int sum = 0;
			for (x = 0; x < ZI; x++)
				sum += chess[i - x][j + x];
			if (sum == ZI * '*')
				return '*';
			else if (sum == ZI * '#')
				return '#';
		}
	}



	if (IsFull(chess) == 1)
		return 'Q';
	return 'C';
}

int IsFull(char chess[ROW][COL])
{
	//flag适用于需要都执行完的程序,此处效率低,用return更好
	int i, j;
//	int	flag=1;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (chess[i][j] == ' ')
				return 0;
	//			flag = 0;
		}
	}
	return 1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值