C语言实现《五子棋》

C语言实现《五子棋》

《五子棋》要考虑到棋盘的大小,对灵活性的考虑,所以在头文件里用到了
#define ROW 3
#define COL 3
这里的数字3可以改变成其他值(这里以3为例玩五子棋),例如:改变为10:图示如下:
在这里插入图片描述
此刻 #define ROW/COL 均为10
#define ROW 10
#define COL 10
又因为两个源文件均用到了头文件,所以在头文件里放入
在这里插入图片描述
这两个头文件就行了,共用。

  • 定义一个头文件<game.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3  //这里可以改变不同的值
#define COL 3

void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
// 玩家赢 -----返回*
// 电脑赢 -----返回#
// 平局  -- ---返回Q
// 继续 ----  -返回C
char CheckWin(char board[ROW][COL], int row, int col);
  • 定义第一个源文件<test.c>

#include "game.h"

void menu()
{
	printf("***********************\n");
	printf("*****   1. play   *****\n");
	printf("*****   0. exit   *****\n");
	printf("***********************\n");
}
void game()
{
	char ret = 0;
	char board[ROW][COL] = {0};  //定义棋盘  是二维数组 利用row col防止写死
	// 初始化棋盘---空格(函数)
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while(1)
	{
	
		//玩家走
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = CheckWin(board, ROW, COL);//检测是平局还是两方哪一家赢了,会停止游戏
		if(ret != 'C')
		{
			break;
		}
		//电脑走
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = CheckWin(board, ROW, COL);
		if(ret != 'C')
		{
			break;  //先让游戏停止
		}
	}
	if(ret == '*')   //游戏停止后的判断
	{
		printf("玩家赢\n");
	}
	else if(ret == '#')
	{
		printf("电脑赢\n");
	}
	else if(ret == 'Q')
	{
		printf("平局\n");
	}
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));  //用来设置随机数的生成起点
	do
	{
		menu();
		printf("请输入您的选择:》");
		scanf("%d",&input);	
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏成功!\n");
			break;
		default:
			printf("输入错误,请重试:\n");
			break;
		}
	}while(input);
}
int main()
{
	//测试游戏
	test();
	return 0;
}
  • 定义第二个源文件<game.c>

#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for(i=0; i<row; i++)
	{
		for(j=0; j<col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for(i=0; i<row; i++)
	{
		//1.数据
	//	printf(" %c | %c | %c \n", board[i][0],board[i][1],board[i][2]); 写一个适用的
		int j = 0;
		for(j=0; j<col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j < col-1)
				printf("|");
		}
		printf("\n");
		//2.分割的行
		if(i < row-1)
		{
			//printf("---|---|---\n");
			for(j=0; j<col; j++)
			{
				printf("---");
				if(j < col-1)
					printf("|");
			}
		}
		printf("\n");
	}
}
// 玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走:\n");

	while(1)
	{
		printf("请输入要走的坐标:");
		scanf("%d%d", &x, &y);
		if(x>=1 && x<=row && y>=1 && y<=col)
		{
			//判断是否被占用的位置了
			if(board[x-1][y-1] == ' ')  //未被占用
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入!\n");
			}
		}
		else
		{
			printf("坐标不合法,请重新输入!\n");
		}
	}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:\n");
	while(1)
	{
		x = rand()%row;  //x~[0,1,2]
		y = rand()%col;
		if(board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
static int isFull(char board[ROW][COL], int row, int col)//isFull函数没必要给别人看到,所以static
{
	int i = 0;
	int j = 0;
	for(i=0; i<row; i++)
	{
		for(j=0; j<col; j++)
		{
			if(board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}
char CheckWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for(i=0; i<row; i++)//三行相等
	{
		if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	for(i=0; i<col; i++) //三列相等
	{
		if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	//判断对角
	if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//平局
	if(isFull(board, row, col) == 1)  //定义一个判断棋满且平局的函数
	{
		return 'Q';  //平局
	}
	//没人赢 没平局  那就继续
	return 'C';
}

文件定义图示
在这里插入图片描述
看下最后的运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是第一种情况::玩家赢,下边看让电脑赢
在这里插入图片描述
在这里插入图片描述
这是第二种情况,玩家赢,看下平局(前边过程省略)
在这里插入图片描述
游戏玩累了,想退出游戏,如下:
在这里插入图片描述

  • 好啦 期待小伙伴有更好的建议,因为里边有一块代码(如下图),写的很死不够灵活,期待指点(*❦ω❦) (*❦ω❦)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个很好的五子棋c语言源程序代码,最重要的是能运行正确!!! #include #include #include #include #include #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #define CROSSRD 0xd9 /*右下角点*/ #define CROSSL 0xc3 /*左边*/ #define CROSSR 0xb4 /*右边*/ #define CROSSU 0xc2 /*上边*/ #define CROSSD 0xc1 /*下边*/ #define CROSS 0xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义1号玩家的操作键键码*/ #define PLAY1UP 0x1157/*上移--'W'*/ #define PLAY1DOWN 0x1f53/*下移--'S'*/ #define PLAY1LEFT 0x1e41/*左移--'A'*/ #define PLAY1RIGHT 0x2044/*右移--'D'*/ #define PLAY1DO 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #define PLAY2UP 0x4800/*上移--方向键up*/ #define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/ #define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL 0 /*没有棋子*/ #define CHESS1 'O'/*一号玩家的棋子*/ #define CHESS2 'X'/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ 下载可看到完整的...

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值