三子棋-用C语言实现

文章描述了一个简单的井字棋游戏的实现过程,包括创建棋盘、玩家和电脑轮流下棋、判断输赢等功能。代码采用C语言编写,使用3x3的二维数组表示棋盘,并通过头文件、函数实现和主函数三个部分组织。游戏结束条件包括玩家或电脑连成一线获胜,或者棋盘填满形成平局。
摘要由CSDN通过智能技术生成

一:基本的思路

1,菜单界面选择开始游戏、退出游戏
2,创建、初始化棋盘
3,打印棋盘

循环
4,玩家下棋
4,判断输赢
5,电脑下棋
6,判断输赢

参考流程图如下:

二:步骤

1 菜单

void menu() {
	printf("****************************************\n");
	printf("************** 1.play ******************\n");
	printf("************** 0.exit ******************\n");
	printf("****************************************\n");
}

2 创建、初始化棋盘

使用3行3列的二维数组来实现棋盘

#define ROW 3
#define LIE 3

初始化函数

void initboar (char board[ROW][LIE], int row, int lie) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < lie; j++) {
			board[i][j] = ' ';
		}
	}
}

3 打印棋盘

void Display(char board[ROW][LIE], int row, int lie) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < lie; j++) {
			printf(" %c ", board[i][j]);
			if (j < lie- 1) {
				printf("|");
			}
		}
		printf("\n");
		if(i<row-1){
			for (int x = 0; x < row; x++) {
				printf("---");
				if (x < lie - 1) {
					printf("|");
				}
			}
			printf("\n");
		}
	}

}

运行结果测试:

 4 玩家下棋

‘*’ 表示玩家的棋子

玩家输入坐标,并且需要在坐标范围内否则重新输入。

void playermove(char boar[ROW][LIE],int row,int lie) {
	printf("请玩家下棋,请输入坐标中间用空格隔开>:\n");
	while (1)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		//坐标是否合法
		if (x >=0 && x <= row && y > 0 && y <= row) {
			//坐标是否可落字
			if (boar[x-1][y-1] == ' ') {
				boar[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("该位置已被落子,请重新输入>:\n");
			}
		}
		else
		{
			printf("您的落子超出棋盘,请重新输入>;\n");
		}
	}
}

5 电脑落子

电脑需随机产生坐标下棋,用到rand,并使用时间戳。

void computermove(char boar[ROW][LIE], int row, int lie) {
	printf("电脑下棋>:\n");
	while (1)
	{
		int x, y;
		x = rand() % row;//下棋范围0-  row-1
		y = rand() % lie;//下棋范围0-  lie-1
		if (boar[x][y] == ' ') {
			boar[x][y] = '#';
			break;
		}
	}
}

6 判断输赢

'*'表示玩家胜利
'#'表示电脑胜利
'Q'表示平局
'C'表示继续
使用isfull函数判断是否平局

int isfull(char boar[ROW][LIE], int row, int lie) {
	int flag = 1;
	for (int i = 0; i < row; i++) {
		for (int j = 0; i < lie; j++) {
			if (boar[i][j] == ' ') {
				flag = 0;
				break;
			}
		}
	}
	return flag;
}
char iswin(char boar[ROW][LIE], int row, int lie) {
	//赢
	for (int i = 0; i < row; i++) {
		// 列
		if (boar[i][0]==boar[i][1]&& boar[i][2] == boar[i][1]&&boar[i][0]!=' ')
		{
			return boar[i][0];
		}
		// 行
		if (boar[0][i] == boar[1][i] && boar[0][i] == boar[2][i] && boar[0][i] != ' ')
		{
			return boar[0][i];
		}
		//对角线
		if (boar[0][0] == boar[1][1] && boar[2][2] == boar[1][1]&&boar[0][0]!=' ') {
			return boar[0][0];
		}
		if (boar[0][2] == boar[1][1] && boar[1][1] == boar[2][0] && boar[1][1]!= ' ')
		{
			return boar[1][1];
		}
	}	
	//平局
	if (isfull(boar,ROW,LIE)) {
		return 'Q';
	}
	//继续
	return 'C';
}

三 代码实现

分为三个部分  头文件部分 game.h   函数实现部分game.c   主函数部分test.c

头文件部分game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define LIE 3
void initboar(char board[ROW][LIE], int row, int lie);//数据初始化
void Display(char[ROW][LIE], int row, int lie);//打印棋盘
//下棋操作
void playermove(char boar[ROW][LIE], int row, int lie);//玩家下棋
void computermove(char boar[ROW][LIE], int row, int lie);//电脑下棋
char iswin(char boar[ROW][LIE], int row, int lie);//判断输赢
int isfull(char boar[ROW][LIE], int row, int lie);//判断是否满栈

函数实现部分game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu() {
	printf("****************************************\n");
	printf("************** 1.play ******************\n");
	printf("************** 0.exit ******************\n");
	printf("****************************************\n");
}

void initboar (char board[ROW][LIE], int row, int lie) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < lie; j++) {
			board[i][j] = ' ';
		}
	}
}
void Display(char board[ROW][LIE], int row, int lie) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < lie; j++) {
			printf(" %c ", board[i][j]);
			if (j < lie- 1) {
				printf("|");
			}
		}
		printf("\n");
		if(i<row-1){
			for (int x = 0; x < row; x++) {
				printf("---");
				if (x < lie - 1) {
					printf("|");
				}
			}
			printf("\n");
		}
	}

}
void playermove(char boar[ROW][LIE],int row,int lie) {
	printf("请玩家下棋,请输入坐标中间用空格隔开>:\n");
	while (1)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		//坐标是否合法
		if (x >=0 && x <= row && y > 0 && y <= row) {
			//坐标是否可落字
			if (boar[x-1][y-1] == ' ') {
				boar[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("该位置已被落子,请重新输入>:\n");
			}
		}
		else
		{
			printf("您的落子超出棋盘,请重新输入>;\n");
		}
	}
}
void computermove(char boar[ROW][LIE], int row, int lie) {
	printf("电脑下棋>:\n");
	while (1)
	{
		int x, y;
		x = rand() % row;//下棋范围0-  row-1
		y = rand() % lie;//下棋范围0-  lie-1
		if (boar[x][y] == ' ') {
			boar[x][y] = '#';
			break;
		}
	}
}
int isfull(char boar[ROW][LIE], int row, int lie) {
	int flag = 1;
	for (int i = 0; i < row; i++) {
		for (int j = 0; i < lie; j++) {
			if (boar[i][j] == ' ') {
				flag = 0;
				break;
			}
		}
	}
	return flag;
}
char iswin(char boar[ROW][LIE], int row, int lie) {
	//赢
	for (int i = 0; i < row; i++) {
		// 列
		if (boar[i][0]==boar[i][1]&& boar[i][2] == boar[i][1]&&boar[i][0]!=' ')
		{
			return boar[i][0];
		}
		// 行
		if (boar[0][i] == boar[1][i] && boar[0][i] == boar[2][i] && boar[0][i] != ' ')
		{
			return boar[0][i];
		}
		//对角线
		if (boar[0][0] == boar[1][1] && boar[2][2] == boar[1][1]&&boar[0][0]!=' ') {
			return boar[0][0];
		}
		if (boar[0][2] == boar[1][1] && boar[1][1] == boar[2][0] && boar[1][1]!= ' ')
		{
			return boar[1][1];
		}
	}	
	//平局
	if (isfull(boar,ROW,LIE)) {
		return 'Q';
	}
	//继续
	return 'C';
}

主函数部分test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game() {
	char ret;
	char board[ROW][LIE] = { 0 };
	initboar(board, ROW, LIE);
	//打印棋盘
	Display(board, ROW, LIE);
	//下棋
	while (1)
	{
		//玩家下棋
		playermove(board,ROW,LIE);
		Display(board, ROW, LIE);
		ret=iswin(board, ROW, LIE);
		if (ret != 'C')//判断是否结束
			break;
		//电脑下棋
		computermove(board, ROW, LIE);
		Display(board, ROW, LIE);
		ret=iswin(board, ROW, LIE);
		if (ret != 'C')
			break;
	}
	if (ret = '*') {
		printf("恭喜玩家获胜\n");
	}
	else if(ret='#')
	{
		printf("恭喜电脑获胜\n");
	}
	else
	{
		printf("平局\n");
	}

}
int main() {
	srand((unsigned int)time(NULL));
	int input = 0;
	do{
		menu();	//打印菜单
		printf("请选择:\n");
		scanf("%d", &input);//选择
		switch (input)
		{
		case 0:
			printf("亲爱的玩家您好,您已退出游戏\n");//退出游戏
			break;
		case 1:		//玩游戏
			printf("进入井字棋游戏。\n");
			game();
			break;
		default://选择错误
			printf("亲爱的玩家您的选择错误,请重新选择。\n");
			break;
		}
	} while (input);
	
}

四 结果演示

玩家胜利测试:

电脑胜利测试 :

 平局测试:存在问题等待各位大佬发现问题

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值