前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用c语言实现三子棋

用c语言实现三子棋

作者头像
用户11039545
发布2024-03-28 17:31:27
360
发布2024-03-28 17:31:27
举报
文章被收录于专栏:c语言c语言

首先创建三个文本框:game.h(放在头文件内)test.c game.c(放在源文件中)

首先进行框架的搭建(放在test.c文件中)

game.h

代码语言:javascript
复制
#pragma once
#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);//电脑下棋
char IsWin(char board[ROW][COL], int row, int col);//判断输赢

test.c

代码语言:javascript
复制
# define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include<stdio.h>
#include<time.h>
void menu() {//简易菜单的打印
	printf("*********************\n");
	printf("****   1.play *******\n");
	printf("****   0.exit********\n");
}
void game() {
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);//首先要对棋盘进行初始化
	DisplayBoard(board, ROW, COL);//在初始化之后展示棋盘
	while (1){
		char ret = 0;
		PlayerMove(board, ROW, COL);//玩家下棋
		ret=IsWin(board,ROW,COL);//判断输赢
		if (ret != ' C ') {
			break;
		}
	DisplayBoard(board, ROW, COL);//在玩家下棋之后展示棋盘
	ComputerMove(board, ROW, COL);//电脑下棋
	ret = IsWin(board, ROW, COL);//判断输赢
	if (ret != ' C ') {
		break;
	}
	DisplayBoard(board, ROW, COL);//在电脑下棋之后展示棋盘
	if (ret != ' * ') {
		printf("玩家赢\n");
	}
	else if (ret != ' # ') {
		printf("电脑赢\n");
	}
	else {
		printf("平局\n");
	}
	}

}


int main() {
	srand((unsigned int)(time(NULL)));//srand用于生成随机数
	int input = 0;
	do {
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch(input){
			case 1:
				game();
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误\n");
				break;
		}
	} while (input);
	return 0;
}

game.c 

代码语言:javascript
复制
# define _CRT_SECURE_NO_WARNINGS 
#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++)
	{
		//打印数据
		//printf(" %c | %c | %c ",board[i][0],board[i][1],board[i][2]);
		//打印分割信息
		//printf("---|---|---\n");
		//如果这样打印,我们就会发现每一行数据地下都有一条横杠,显然,这不是我们想要得到的结果,所以我们需要换一种方式
		int j = 0;
		for (j = 0; j < col; j++)//我们不妨简化一下打印的过程:打印一个数据,再在他的后面加上竖杠,这样会使得程序看起来简洁不少
		{
			printf(" %c ", board[i][j]);
			//最后一列不需要打印|,所以我们用if来限制条件
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//再打印分割信息
		if (i < row - 1)//最后一行不用打印分割行
		{
			int j = 0;
			for (j = 0; j < col; j++)//有多少列,打印多少对应分隔符
			{
				printf("---");
				printf("|");
			}
			printf("\n");
		}
	}

}
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋:\n");
	while (1) {
		printf("请输入坐标:\n");
		scanf("%d %d", &x, &y);
		//但是要注意的是:玩家输入的坐标和数组的坐标不一致,所以我们要在玩家输入坐标的基础上减去1
		//同时还要检测输入的坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] == ' * ';
				break;
			}

		}
		else {
			printf("输入的坐标非法\n");
		}
	}
}
void ComputerMove(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;
	x = rand() % 3;//rand()用来生成随机值
	y = rand() % 3;//0到2
	while (1) {//如果被占用,重新生成坐标,只有下棋下对,才能结束循环
		if (board[x - 1][y - 1] == ' ') {
			board[x - 1][y - 1] == ' * ';
			break;
		}
	}



}
int isFull(char board[ROW][COL], int row, int col) {//如果满了 返回1 不满返回0
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}
//玩家赢 返回'#' 电脑赢 返回'*' 平局 返回'Q' 继续 返回‘C’
char IsWin(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][0] == board[i][2] && board[i][0] != ' ') {
			return board[i][0];
		}
	}
	//列
	int j = 0;
	for (j = 0; j < row; j++) {
		if (board[0][j] == board[1][j] && board[2][j] == board[0][j] && board[0][j] != ' ') {
			return board[0][j];
		}
	}
	//斜对角线
	if (board[2][2] == board[1][1] && board[1][1] == board[0][0] && 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)) {
		return 'Q';
	}
	return 'C';//游戏继续
}
//如果没有人赢,就要判断是否平局
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档