[c语言]三子棋小游戏

提示:难度不高,耐心看完

目录

前言

一、整体思路

二、游戏的实现

1.创建菜单

2.棋盘

2.1创建二维数组,存储数据 

2.2初始化棋盘

2.3打印棋盘

3.下棋

3.1玩家下棋

3.2电脑下棋

最后所有代码



前言

天我们用C语言实现一下三子棋这一小游戏,运用多文件写代码的形式来完成我们的三子棋游戏,希望通过这个小游戏能对大家有所帮助,话不多说开始我们今天的讲解。


一、整体思路

首先我们是要运用多文件写代码的形式来实现三子棋,那自然需要先添加多个文件:

 在这里我们创建三个文件,具体文件解释如图所示,这里不做过多赘述。

说完整个项目的大概框架,接下来我们来说说游戏实现的大概框架。

  1. 创建二维数据————存储数据
  2. 初始化棋盘
  3. 打印棋盘
  4. 玩家和电脑下棋
  5. 判断胜负

二、游戏的实现

1.创建菜单

创建一个菜单,引导用户操作:

//打印菜单
void menu()
{
	printf("******************************\n");
	printf("*******    1.play       ******\n");
	printf("*******    0.exit       ******\n");
	printf("******************************\n");
}

注意:这里每一行后面要添加换行符,不然打印出来的菜单会很难看

2.棋盘

这里我们需要一个棋盘,给用户做一个可视化界面,让用户知道自己的每一步棋落在了哪里,同时这个棋盘需要有存储数据的功能,记录用户和电脑每一步走的棋,也方便系统后面判定结果的胜负。

2.1创建二维数组,存储数据 

//存储数据,创建二维数组
//方法一
char board[3][3];

//方法二
char board[ROW][COL]
//#define ROW 3
//#define COL 3

 这里方法一和方法二都可以,但我更加推荐方法二,采用宏定义的全局变量,如果后期我们想改为四子棋、五子棋就可以在宏定义那里改变数字即可,省去了很多不必要的操作。


2.2初始化棋盘

在这里我们初始化棋盘,将棋盘初始化为空格

函数声明:

 函数实现:

 函数调用:

 到这里我们实现了函数的初始化,但是,用户依旧看不到一个完整的棋盘。所以我们还得有一个完成的棋盘。

2.3打印棋盘

这里我们要打印一个可视化的棋盘,让用户可以更好的完成操作

函数声明:

 函数实现:

 这里可能不太好理解,为什么row和col都需要-1,这是因为我们在最后一行和最后一列都不需要分隔符,因为一旦加了分隔符之后棋盘就会变得很难看,不信让我们看看

row-1、col-1版本:

 没有-1的版本:

 有没有感觉哪里怪怪的,哈哈

3.下棋

3.1玩家下棋

在玩家下棋这里我们需要注意一般我们输入的是序列,而数组下标是从0开始的,而这两者之间就存在一个转换关系:数组下标=序列号-1除此之外我们还应当考虑到玩家输入的下标是否合法,以及即便是合法坐标也存在被占用而无法落子的情况,接下来,让我们看代码:

函数声明:

 函数实现:

 函数调用:

 在这里我们是每下一步棋,就让计算机打印一次当前棋盘,让玩家知道自己走的每一步棋

3.2电脑下棋

电脑下棋这里我们采用生成随机数的方式,来产生两个在棋盘范围内数作为电脑下棋的落子。

函数声明:

函数实现:

 

函数调用:

 这里至于具体随机数是怎样生成的不是我们的重点,这里不做过多讲解

4.胜负判断

这里判断的情况无非就是电脑赢,玩家赢,平局(棋盘满),未下完(继续下棋操作)

函数声明:

 函数实现:

 

 这里采用的是穷举法判断的胜负,哈哈,等我后面改进

最后所有代码

 

 

#pragma once
#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 IsWin(char board[ROW][COL], int row, int col);
#include"game.h"

//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)//行
	{
		int j = 0;
		for (j = 0; j < col; j++)//列
		{
			board[i][j] = ' ';
		}
	}
}








//3.0版本   打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)//行
	{

		int j = 0;
		for (j = 0; j < col; j++)//数据行
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");

		if (i < row - 1)
		{
			int k = 0;
			for (k = 0; k < col; k++)//分隔符行
			{
				printf("---");
				if (k < 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("坐标非法,请重新输入");
		}
	}
}





//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋>:\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//遍历二维数组
int isFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}





//判断胜负
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][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[0][i] != ' ')
		{
			return board[0][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';
}
#include"game.h"

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

void game()
{
	//存储数据 ——创建二维数组
	char board[ROW][COL];

	//初始化棋盘 -初始化空格
	InitBoard(board, ROW, COL);

	//打印棋盘
	DisplayBoard(board, ROW, COL);

	//下棋
	char ret = 0;
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		//判断胜负
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		

		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		//判断胜负
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}
}


int main()
{
	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);

	return 0;

}
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自然语言编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值