前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言简易版三子棋游戏的实现(超详细版)

C语言简易版三子棋游戏的实现(超详细版)

作者头像
用户11036582
发布2024-03-21 18:18:11
740
发布2024-03-21 18:18:11
举报

前言

知不足而奋进,望远山而前行。

今天让我们来学习一下C语言实现简易版三子棋游戏。

一、三子棋游戏介绍

《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。

二、游戏大致实现过程

想用C语言来实现三子棋游戏,首先我们要创建三个文件,一个头文件:game.h 两个源文件:game.c test.c

这里我们给大家介绍一下在三子棋这个游戏里面,每个文件是做什么的呢? (1)头文件game.h,头文件里是用来存放函数的声明,#define常量的定义,库函数的引用 (2)源文件test.c,这个文件里面放的是游戏的测试逻辑 (3)源文件game.c,这个文件里面放的是游戏的实现逻辑,用于函数实现

三、游戏的具体实现过程

3.1游戏菜单的生成

首先,我们都知道,一个游戏,最起码要存在一个游戏的菜单,以便让玩家更好的去进入这个游戏进而去玩这个游戏,所以,我们先创建一个游戏菜单,不用过于花哨,简便一些即可。

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void menu()    //游戏菜单
{
	printf("******************************\n");
	printf("**********  1.play  **********\n");
	printf("**********  0.exit  **********\n");
	printf("******************************\n");
}
void game()//实现玩游戏的函数,这里我们先不去写出来,便于游戏菜单的观看
{

}
int main()
{
	int input = 0;   
     do   //这里我们利用do-while循环可以便于用户进行多次游戏
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);//根据do-while的特性,若输入0,则游戏结束
	return 0;
}

通过以上代码,我们便构建出来一个大致的游戏菜单,这里建议大家代码到这一步时,先去检测一下是否存在错误,便于之后代码的进行。

3.2游戏过程的逐步实现

生成游戏菜单之后,我们便可以进一步去思考这个游戏的一步步的实现过程

3.2.1初始化游戏键盘
代码语言:javascript
复制
#pragma once
# define ROW 3 //在此对游戏键盘的大小进行规定,便于后来的修改
# define COL 3

void InitBoard(char board[ROW][COL],int row,int col);


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] = ' ';
		}
	}
}

//test.c
void game()
{
	//最开始的时候数组的内容全是空格,进而达到初始化这一个目的
	char board[ROW][COL]; 
	InitBoard(board, ROW, COL);
}

当然这只是一个简单的初始化,我们还要让其变得更加的美观

像这样:

代码语言:javascript
复制
void DisplayBoard(char board[ROW][COL],int row,int col)
{
	int i = 0,j=0;
	for (i = 0; i < row; i++) {
		for ( j = 0; j < col; j++) {
			//打印数据
			printf(" %c ", board[i][j]);
			//打印分割信息
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < col; j++) {
				printf("---");
				if(j<col-1)
				printf("|");
			}
			printf("\n");
			}
	}
}

通过上面这串代码,我们便可达到那样一个效果,下面,我们再进一步进行下面的实现。

3.2.2玩家棋子的规定及实现

我们规定玩家的棋子为'*',代码实现为:

代码语言:javascript
复制
//玩家下棋
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");
		}
	}
}
3.2.3电脑的棋子及实现

为了区分玩家与电脑的棋子,我们规定电脑的棋子为'#',下面我们来看一下如何实现:

代码语言:javascript
复制
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	printf("电脑下棋:>\n");
	while (1) {
		x = rand() % row;//生成的随机数已经是0~2了
		y = rand() % col;
		if (board[x][y] == ' ') 
		{
			board[x][y] = '#';
			break;
		}
	}
}

在此我们要知道如何去随机生成一个位置,来让电脑去下棋,在此我们利用的是rand函数,同时要记住在使用rand函数时要求的头文件及调用srand函数

下面我们通过几行简单的代码看一下rand函数如何使用

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    // 使用当前时间作为种子
    srand((unsigned int)time(NULL));

    // 生成并打印 5 个随机数
    for (int i = 0; i < 5; i++) {
        printf("%d\n", rand());
    }

    return 0;
}

不要去认为这个代码过于简单,记住,多难得事情都要从0做起,多难得知识也应该从一个个小的知识点去开始

3.2.4 判断输赢

这里我们规定一下玩家或电脑输赢的不同返回值 首先游戏的结束一定分为三种情况: 1玩家赢 我们规定返回值为’*‘ 2电脑赢 我们规定返回值为’#‘ 3平局 我们规定返回值为’Q‘ 4我们在游戏中还需去判断游戏是否结束,这里我们利用’C‘

代码语言:javascript
复制
int IsFull(char board[ROW][COL], int row, int col) {
	int i = 0,j=0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}

//找出获胜者
//电脑玩家or平局
//玩家 -'*'
//电脑-’#‘
//平局-'Q'
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0; int j = 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 (j = 0; j < col; j++) {
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') {
			return board[1][j];
		}
	}
	//对角线
	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))
	{
		return 'Q';
	}
	return 'C';
}

同时,我也将几种情况展示给大家:

1玩家胜利:

2.电脑胜利:

3.平局:

这便是所有情况的展示

四.三子棋游戏实现的完整代码(详细代码)

4.1game.h
代码语言:javascript
复制
#pragma once
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<time.h>
#include<stdlib.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);

//获胜者
char IsWin(char board[ROW][COL], int row, int col);

int IsFull(char board[ROW][COL], int row, int col);
4.2game.c
代码语言:javascript
复制
#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,j=0;
	for (i = 0; i < row; i++) {
		for ( j = 0; j < col; j++) {
			//打印数据
			printf(" %c ", board[i][j]);
			//打印分割信息
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			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, y = 0;
	printf("电脑下棋:>\n");
	while (1) {
		x = rand() % row;//生成的随机数已经是0~2了
		y = rand() % col;
		if (board[x][y] == ' ') 
		{
			board[x][y] = '#';
			break;
		}
	}
}


int IsFull(char board[ROW][COL], int row, int col) {
	int i = 0,j=0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}

//找出获胜者
//电脑玩家or平局
//玩家 -'*'
//电脑-’#‘
//平局-'Q'
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0; int j = 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 (j = 0; j < col; j++) {
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') {
			return board[1][j];
		}
	}
	//对角线
	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))
	{
		return 'Q';
	}
	return 'C';
}
4.3test.c
代码语言:javascript
复制
#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 };

	//初始化棋盘的函数
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard( board, ROW, COL);

	while (1) {
		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");
		}
		DisplayBoard(board, ROW, COL);
	
}


int main() {
	srand((unsigned)time(NULL));//设置随机数的生成起点。
	int input = 0;
	do {
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("---三子棋游戏---\n");
			game();
			break;
		case 0:
			printf("成功退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);  //input为非0就继续,为0就结束
	return 0;
}

总结

以上便是C语言简易版三子棋游戏的代码了,同时,这个游戏还可以有更好的想法,比如能否建立三个难度(简单,正常,困难),当然,我们要在弄懂这些的基础上才能进一步的去探索。同时也欢迎大家找我来探讨。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、三子棋游戏介绍
  • 二、游戏大致实现过程
  • 三、游戏的具体实现过程
    • 3.1游戏菜单的生成
      • 3.2游戏过程的逐步实现
        • 3.2.1初始化游戏键盘
        • 3.2.2玩家棋子的规定及实现
        • 3.2.3电脑的棋子及实现
        • 3.2.4 判断输赢
        • 4.1game.h
        • 4.2game.c
        • 4.3test.c
    • 四.三子棋游戏实现的完整代码(详细代码)
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档