IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言小项目之三子棋游戏(简易版) -> 正文阅读

[C++知识库]C语言小项目之三子棋游戏(简易版)

哈哈哈!!!

?????? 今天给大家带来一篇三子棋小游戏(简易版)的代码,xdm请跟随我的节奏一起来起舞吧!!!说是简易版是因为没有实现电脑智能化,这样让我们尽情的去向电脑复仇吧!!!

一、知识储备

????????二维数组

????????分支循环熟练运用

????????函数熟练操作

????????逻辑思维分析

二、需求分析

????????三子棋,简而言之,三子成线,给出一个9宫格,玩家和电脑轮流下棋,看哪一方先三子成线则胜利,项目相对来说对初学者有点困难。

????????1、二维数组初始化

????????2、棋盘打印

????????3、玩家下棋

????????4、电脑下棋

????????5、判断输赢

????????6、游戏逻辑函数设计

????????7、主函数设计

三、代码呈现

此项目采用模块化设计

????????分game.h? game.cpp? test.cpp三个模块

??????? 1、头文件设计

???????????? 为了方便改动和使其有好的扩展性采用宏定义来设置行和列数

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3//行数
#define COL 3//列数

//菜单
void menu();

//初始化
void init_board(char board[ROW][COL], int row, int col);

//打印
void display_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断胜负
char judge_result(char board[ROW][COL], int row, int col);

??????? 2.函数设计

????????? (1)、菜单函数

//菜单函数
void menu()
{
	printf("*********************\n");
	printf("****** 1、play ******\n");
	printf("****** 0、exit ******\n");
	printf("*********************\n");
}

????????(2)、棋盘初始化

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

??????? (3)、棋盘打印

//打印棋盘
void display_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)//控制行数
	{
		for (int j = 0; j < col; j++)//控制每一列
		{
			printf(" %c ", board[i][j]);
			if (j < col-1)
			{
				printf("|");
			}
		}
		printf("\n");//打完一行加换行符
		for (int j = 0; j < col; j++)//控制每一列
		{
			if (i < row-1)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("+");
				}
			}
		}
		printf("\n");//打完一行加换行符
	}
}

??????? (4)、玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;//代表行
	int y = 0;//代表列
	printf("玩家下棋:");
	while (1)
	{
		scanf("%d %d", &x, &y);
		if (x < row && y < col && x>0 && y>0 && board[x-1][y-1] == ' ')
		{
			board[x - 1][y - 1] = '*';//由于数组下标是从0开始的,人们正常思维是从1开始的
			break;//输入符合条件则记录下来后跳出,若不符合条件则继续重新输入
		}
		else
		{
			printf("输入有误,请重新输入:");
		}
	}
}

??????? (5)电脑下棋

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;//电脑仅仅随机出一个坐标位置,没有智能化
	int y = 0;
	do {
		x = rand() % row;//电脑随机出x行
		y = rand() % col;//电脑随机出y列
	} while (board[x][y] != ' ');
	board[x][y] = '#';
	printf("电脑下棋:%d %d \n", x+1, y+1);
}

??????? (6)、判断棋盘是否满

//判断是否棋盘满
int is_full(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//如果有一个位置为空则返回0,代表棋盘没满
			}
		}
	}
	return 1;//如果每一个位置都不为空则棋盘满返回1,如果棋盘没有满则在上面已经返回不会来到这
}

??????? (7)、判断胜负

??????????????? 此部分设计巧妙在于由于玩家下棋下的是 * ,电脑下棋下的是 # ,若一方胜利直接返回他们所下的棋代表,然后判断是否棋盘满即平局的判断,若平局返回‘P',若都不是则返回‘C’

//判断输赢
char judge_result(char board[ROW][COL], int row, int col)
{
	for (int 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 (int j = 0; j < row; j++)//判断每一列三个是否一样
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[0][j];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')//判断对角线
	{
		return board[0][2];
	}
	if (is_full(board, ROW, COL))
	{
		return 'P';
	}
	else
		return 'C';

}

??????? (8)、游戏逻辑设计

//游戏函数
void game()
{
	char board[ROW][COL];
	char result = 0;
	printf("游戏开始\n");
	init_board(board, ROW, COL);
	while (1)
	{
		player_move(board, ROW, COL);
		display_board(board, ROW, COL);
		result = judge_result(board, ROW, COL);
		if (result != 'C')
		{
			break;
		}

		computer_move(board, ROW, COL);
		display_board(board, ROW, COL);
		result = judge_result(board, ROW, COL);
		if (result != 'C')
		{
			break;
		}
	}
	if (result == '*')
	{
		printf("玩家获胜!\n");
	}
	else if (result == '#')
	{
		printf("电脑获胜!\n");
	}
	else
	{
		printf("平局!\n");
	}
}

??????? (9)、主函数设计

//主函数
int main()
{
	int input = 1;
	do
	{
		menu();
		srand((unsigned int)time(NULL));
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;

		case 0:
			printf("退出游戏!!!\n");
			break;

		default:
			printf("输入错误,请重新输入");
			break;

		}
	} while (input);

	return 0;
}

????????本文写到这里就结束了,若是有兴趣的话您可以自行修改,自行增添内容使项目丰富多彩。

若本文是对您有所帮助的话,希望你可以点赞下,你的支持是我创作最大的动力!!!

??????????????? 谢谢!!!

注:作者水平有限,若有错误,欢迎指正!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 10:38:58  更:2022-01-24 10:39:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:05:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码