三子棋C语言实现

虽然题目是三子棋,但是其实我实现的是5*5棋盘的4子棋玩法

废话不多说直接上代码

一共三个文件:

1.game.h 存放函数声明等

2.game.c 存放函数的定义(实现)

3.test.c 游戏主函数

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>

#define ROW 6 //棋盘的行数
#define COL 6 //棋盘的列数
#define CHESS1 'O'//一号玩家的棋子形状
#define CHESS2 'X'//二号玩家的棋子形状
#define CHESSPC_P  'P'//玩家棋子形状
#define CHESSPC_C  'C'//电脑棋子形状

void Chess(char chess[ROW][COL], int row, int col);//初始化棋子数组(可以下棋的位置)
void ChessBroad(char chess[ROW][COL], int row, int col);//打印棋盘
void PlayerMove(char chess[ROW][COL], int row, int col, int n);//玩家下棋 
void ComputerMove(char chess[ROW][COL], int row, int col);//电脑走
char Win(char chess[ROW][COL], int row, int col);//判断胜负
int Full(char chess[ROW][COL], int row, int col);//判断棋盘是否为满

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Chess(char chess[ROW][COL], int row, int col) {
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			chess[i][j] = ' ';
}
void ChessBroad(char chess[ROW][COL], int row, int col) {
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			printf(" %c ", chess[i][j]);
			if (j < col - 1)
				printf("│");
		}
		printf("\n");
		if (i < row - 1) {
			for (j = 0; j < col; j++) {
				printf(" 一");
				if (j < col - 1)
					printf("│");
			}
			printf("\n");
		}

	}
}
int r = 0;//玩家要下的行数
int c = 0;//玩家要下的列数
//我想用记录每次玩家落字的坐标这样每次判断只用判断该子所在的行列斜线是否达到获胜条件,但是我不会
void PlayerMove(char chess[ROW][COL], int row, int col, int n) {
	while (1) {
		switch (n) {
			//1 2为玩家对战模式  0为玩家电脑对战模式
		case 1:
		case 2:
			printf("请玩家 %d 下棋\n请输入您要下的位置(y,x)\n", n);
			break;
		case 0:
			printf("请玩家下棋\n请输入您要下的位置(y,x)\n");
			break;

		}
		scanf("%d %d", &r, &c);
		if (r > 0 && r <= row && c > 0 && c <= col) {
			if (chess[r - 1][c - 1] == ' ') {
				if (n == 1)
					chess[r - 1][c - 1] = CHESS1;
				else if (n == 2)
					chess[r - 1][c - 1] = CHESS2;
				else if (n == 0)
					chess[r - 1][c - 1] = CHESSPC_P;
				system("cls");
				break;
			}

			else {
				system("cls");
				printf("该位置已经有棋子了!请重新选择位置!\n");
				ChessBroad(chess, ROW, COL);
			}
		}
		else {
			system("cls");
			printf("请输入正确的棋盘位置!\n");
			ChessBroad(chess, ROW, COL);
		}
	}
}
char Win(char chess[ROW][COL], int row, int col) {
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row - 1; i++) {
		for (j = 0; j < col + 1 - 4; j++) {
			if (chess[i][j] == chess[i][j + 1] && chess[i][j + 1] == chess[i][j + 2] && chess[i][j + 2] == chess[i][j + 3] && chess[i][j] != ' ')
				return 'W';
		}
	}
	//判断列
	for (i = 0; i < col - 1; i++) {
		for (j = 0; j < row + 1 - 4; j++) {
			if (chess[j][i] == chess[j + 1][i] && chess[j + 1][i] == chess[j + 2][i] && chess[j + 2][i] == chess[j + 3][i] && chess[j][i] != ' ')
				return 'W';
		}
	}
	//判断斜线 5*5 棋盘的 四子棋玩法判断
	//!!不会写普遍的规律
	if (chess[0][0] == chess[1][1] && chess[1][1] == chess[2][2] && chess[2][2] == chess[3][3] && chess[0][0] != ' ')
		return 'W';
	if (chess[1][1] == chess[2][2] && chess[2][2] == chess[3][3] && chess[3][3] == chess[4][4] && chess[1][1] != ' ')
		return 'W';
	if (chess[1][0] == chess[2][1] && chess[2][1] == chess[3][2] && chess[3][2] == chess[4][3] && chess[1][0] != ' ')
		return 'W';
	if (chess[0][1] == chess[1][2] && chess[1][2] == chess[2][3] && chess[2][3] == chess[3][4] && chess[0][1] != ' ')
		return 'W';
	if (Full(chess, row, col))//Full函数判断棋盘是否为满 
		return 'E';
}
int Full(char chess[ROW][COL], int row, int col) {
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			if (chess[i][j] == ' ')
				return 0;
	return 1;
}
void ComputerMove(char chess[ROW][COL], int row, int col) {
	while (1) {
		int x = rand() % col;
		int y = rand() % row;
		if (chess[y][x] == ' ') {
			chess[y][x] = CHESSPC_C;
			system("cls");
			break;
		}
	}
}


 3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Menu1() {
	printf("***********************************\n");
	printf("************** 三子棋**************\n");
	printf("************请输入: 1 0************\n");
	printf("**************1:start**************\n");
	printf("**************0: exit *************\n");
	printf("***********************************\n");
}
void Menu2() {
	printf("***********************************\n");
	printf("****1.   自由   玩家对战    *******\n");
	printf("*** 2.   自由    人机       *******\n");
	printf("****0.      返回主菜单      *******\n");
	printf("***********************************\n");
}
void game() {
	char  Judge = 0;
	char chess[ROW][COL] = { 0 };//这个数组存放可以下棋的位置,我们叫它棋子
	Chess(chess, ROW, COL);//初始化棋子数组
	ChessBroad(chess, ROW, COL);//打印棋盘
	while (1) {
		PlayerMove(chess, ROW, COL, 1);//玩家1下棋
		ChessBroad(chess, ROW, COL);
		Judge = Win(chess, ROW, COL);//调用Win游戏输赢判断数
		if (Judge == 'W') {//一号下完棋退出游戏的可能只能是一号获胜或者平局 
			printf("一号玩家取胜!\n");//两者都不是游戏继续 
			break;
		}
		else if (Judge == 'E') {
			printf("平局\n");
			break;
		}
		PlayerMove(chess, ROW, COL, 2);//玩家2下棋
		ChessBroad(chess, ROW, COL);
		Judge = Win(chess, ROW, COL);
		if (Judge == 'W') {//同理 二号玩家下完棋退出游戏的可能只能时 二号玩家取胜或者平局
			printf("二号玩家取胜!\n");//否则 游戏继续
			break;
		}
		else if (Judge == 'E') {
			printf("平局\n");
			break;
		}
	}
}
void game2() {
	srand((unsigned)time(NULL));
	char  Judge = 0;
	char chess[ROW][COL] = { 0 };
	Chess(chess, ROW, COL);
	ChessBroad(chess, ROW, COL);
	while (1) {
		PlayerMove(chess, ROW, COL, 0);
		ChessBroad(chess, ROW, COL);
		Judge = Win(chess, ROW, COL);
		if (Judge == 'W') {
			printf("玩家获胜!\n");
			break;
		}
		else if (Judge == 'E') {
			printf("平局!\n");
			break;
		}
		ComputerMove(chess, ROW, COL);
		ChessBroad(chess, ROW, COL);
		Judge = Win(chess, ROW, COL);
		if (Judge == 'W') {
			printf("电脑获胜!\n");
			break;
		}
		else if (Judge == 'E') {
			printf("平局!\n");
			break;
		}
	}
}
void test2() {
	int InPut = 0;
	do {
		Menu2();
		scanf("%d", &InPut);
		switch (InPut) {
		case 0:
			break;
		case 1:
			game();//玩家
			break;
		case 2:
			game2();//人机
			break;
		default:
			printf("选择错误!请重新选择\n");
			break;

		}
	} while (InPut);
}
void test1() {
	int Input = 0;//菜单选项
	do {
		system("cls");
		Menu1();//游戏菜单
		scanf("%d", &Input);
		switch (Input) {
		case 1:
			test2();//调用游戏程序
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");

		}
	} while (Input);//0退出循环 其他输入继续循环 
}
int main() {
	test1();//菜单界面程序
	return 0;
}


有什么指教问题可以在下面留言哦~

对您有帮助不妨点一个赞~

发布了19 篇原创文章 · 获赞 88 · 访问量 3267

猜你喜欢

转载自blog.csdn.net/qq_44954010/article/details/103750691