三子棋大致构建思路

2023-10-27

设计思路:

1*  菜单——输入选择:1.PLAY(开始游戏

                                   0.EXIT(退出游戏

                                    其他,重新进入菜单选择

2* PLAY(开始游戏)(大致结构):

       1.创建并打印棋盘-2.玩家下棋-3.电脑下棋-4.判断局势-5.得出结果-6.返回1*菜单

3*创建并打印棋盘:

       棋盘为3*3结构,创建一个二维数组存放棋子即可

       1.创建二位数组char ch[3][3]

       2.数组ch初始化为空格

void init(char ch[R][C], int r, int c)
{
	//数组初始化,赋予空格
	int i = 0; int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			ch[i][j] = ' ';
		}
	}
}

       3.棋盘框架的构建

void Printf(char ch[R][C],int r, int c)//r和c分别是棋盘的行和列数
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)//打印表格以“空格字符空格竖杠”为一组( %c |)
		{                      //在打印最后一组的时候不用输出竖杠   
			printf(" %c ", ch[i][j]);
			if (j < r - 1)//竖杠的打印,只输出两组
			{
				printf("|");
			}
		}
		printf("\n");在第一行打印完后记得换行
		if (i < r-1)//以三个短横杠和一个竖杠为一组,组成划分横行的界线(三子棋只需要两组划分
		{
			for (j = 0; j < c; j++)
			{
				printf("---");
				if (j < c - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//棋盘效果图,上部分为菜单//

                                

 4*玩家下棋

void human(char ch[R][C], int r, int c)
{
	printf("玩家回合\n");
	while (1)//因为有输入错误超出棋盘范围及输出到有棋子的格子的情况
	{        //所以选择循环结果,当成功数组成功被赋值(即下棋到一个空位的情况
		int a = 0;//可以直接选择break跳出循环就可以了
		int b = 0;
		printf("请输入要填放的坐标\n");
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= r && b >= 1 && b <= c)//判断坐标是否在棋盘内                                                                 
                                                 //注意数组的下标从0开始
		{                                        //对应的存放的数组坐标为棋盘的行列坐标-1
			if (ch[a - 1][b - 1] == ' ')//判断是否有空位
			{
				ch[a - 1][b - 1] = '*';//没有则赋值*
				break;//赋值成功跳出循环
			}
			else
			{
				printf("已有棋子,请重新输入\n");
			}
		}
		else
		{
			printf("超出范围,请重新输入\n");
		}
	}
}

5*电脑下棋

void pc(char ch[R][C], int r, int c)
{
	printf("电脑回合\n");
	while (1)
	{                    //rand取余多少就是在取余数的范围内随机输出 例如%3,随机值就在3内
		int x = rand() % r;
		int y = rand() % c;
		if (ch[x][y] == ' ')
		{
			ch[x][y] = '#';
			break;
		}
	}
}

6*判断局势

char win(char ch[R][C], int r, int c)
{
	int i = 0;
	for (i = 0; i < R; i++)//判断行
	{
		if (ch[i][0] == ch[i][1] && ch[i][0] == ch[i][2] && ch[i][0] != ' ')
		{
			return ch[i][0];
		}
	}

	for (i = 0; i < R; i++)//判断列
	{
		if (ch[0][i] == ch[1][i] && ch[0][i] == ch[2][i] && ch[0][i] != ' ')
		{
			return ch[0][i];
		}
	}
	//判断对角线
	if (ch[0][0] == ch[1][1]&& ch[0][0] == ch[2][2] && ch[0][0] != ' ')
	{
		return ch[1][1];
	}
	if (ch[0][2] == ch[1][1]&&ch[0][2] == ch[2][0] && ch[0][2] != ' ')
	{
		return ch[1][1];
	}
	//判断是否满棋盘
	if (full(ch, r, c) == 1)//判断是否棋盘满的函数在下列
	{
		return 'q';//q返回代表满棋盘,平局
	}

	return 'c';//均不符合以上条件,没人胜利,棋盘没满继续游戏
}

判断棋盘是否满的函数

static int full(char ch[R][C], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < R; i++)
	{
		for (j = 0; j < C; j++)
		{
			if (ch[i][j] == ' ')
			{
				return 0;//任意一个坐标有空位则继续游戏
			}
		}
	}
	return 1;//返回1代表棋盘满了
}

7*得出结果

void game()
{
	char ch[R][C];
	char ret;

	init(ch, R, C);//数组初始化

	Printf(ch, R, C);//打印棋盘

	while (1)
	{
		human(ch, R, C);//玩家回合
		Printf(ch, R, C);//打印玩家下棋后的棋盘
		ret = win(ch, R, C);//判断是否获胜
		if (ret != 'c')
		{
			break;//如果在win函数中返回值不为c(c的含义是没人胜利,棋盘没满
		}         //则跳出循环,经行下方的结果判断
		pc(ch, R, C);//电脑回合
		Printf(ch, R, C);//打印电脑下棋后的棋盘
		ret = win(ch, R, C);//判断是否获胜
		if (ret != 'c')
		{
			break;
		}
	}
    //结果判断
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	else if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'q')
	{
		printf("平局\n");
	}
}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define R 3
#define C 3

void init(char ch[R][C], int r, int c);

void Printf(char ch[R][C], int r, int c);

void human(char ch[R][C], int r, int c);

void pc(char ch[R][C], int r, int c);

char win(char ch[R][C], int r, int c);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"


void game()
{
	char ch[R][C];
	char ret;

	init(ch, R, C);//数组初始化

	Printf(ch, R, C);//打印棋盘

	while (1)
	{
		human(ch, R, C);
		Printf(ch, R, C);
		ret = win(ch, R, C);
		if (ret != 'c')
		{
			break;
		}
		pc(ch, R, C);
		Printf(ch, R, C);
		ret = win(ch, R, C);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	else if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'q')
	{
		printf("平局\n");
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	int a = 0;
	do
	{
		menu();

		printf("请选择项\n");
		scanf("%d", &a);

		switch (a)
		{
		case 1: printf("开始游戏\n"); game(); break;
		case 0: printf("退出游戏\n"); break;
		default: printf("选择无效,请重新选择\n"); break;
		}
	} while (a);
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void menu()
{
	printf("***************************\n");
	printf("*******   1.PLAY  *********\n");
	printf("*******   0.EXIT  *********\n");
	printf("***************************\n");
}

void init(char ch[R][C], int r, int c)
{
	//数组初始化,赋予空格
	int i = 0; int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			ch[i][j] = ' ';
		}
	}
}

void Printf(char ch[R][C],int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf(" %c ", ch[i][j]);
			if (j < r - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < r-1)
		{
			for (j = 0; j < c; j++)
			{
				printf("---");
				if (j < c - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void human(char ch[R][C], int r, int c)
{
	printf("玩家回合\n");
	while (1)
	{
		int a = 0;
		int b = 0;
		printf("请输入要填放的坐标\n");
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= r && b >= 1 && b <= c)
		{
			if (ch[a - 1][b - 1] == ' ')
			{
				ch[a - 1][b - 1] = '*';
				break;
			}
			else
			{
				printf("请勿重新输入,请重新输入\n");
			}
		}
		else
		{
			printf("超出范围,请重新输入\n");
		}
	}
}

void pc(char ch[R][C], int r, int c)
{
	printf("电脑回合\n");
	while (1)
	{
		int x = rand() % r;//rand取余多少就是在取余数的范围内随机输出例如%3,随机值就不超过3
		int y = rand() % c;
		if (ch[x][y] == ' ')
		{
			ch[x][y] = '#';
			break;
		}
	}
}

static int full(char ch[R][C], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < R; i++)
	{
		for (j = 0; j < C; j++)
		{
			if (ch[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char win(char ch[R][C], int r, int c)
{
	int i = 0;
	for (i = 0; i < R; i++)//判断行
	{
		if (ch[i][0] == ch[i][1] && ch[i][0] == ch[i][2] && ch[i][0] != ' ')
		{
			return ch[i][0];
		}
	}

	for (i = 0; i < R; i++)//判断列
	{
		if (ch[0][i] == ch[1][i] && ch[0][i] == ch[2][i] && ch[0][i] != ' ')
		{
			return ch[0][i];
		}
	}
	//判断对角线
	if (ch[0][0] == ch[1][1]&& ch[0][0] == ch[2][2] && ch[0][0] != ' ')
	{
		return ch[1][1];
	}
	if (ch[0][2] == ch[1][1]&&ch[0][2] == ch[2][0] && ch[0][2] != ' ')
	{
		return ch[1][1];
	}
	//判断是否满棋盘
	if (full(ch, r, c) == 1)
	{
		return 'q';//q返回代表满棋盘,平局
	}

	return 'c';//均不符合以上条件,没人胜利,棋盘没满继续游戏
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三子棋大致构建思路 的相关文章

随机推荐

  • 养娃探索记录

    0 3岁 搞好身体 3 6岁 培养好生活习惯 6 9岁 培养好学习习惯 9 12岁 培养自学能力 12 15岁 了解三百六十行 不同行业不同职业都是做什么的 15 18岁 确定未来发展方向和人生目标 自我决定理论对我们的教育有着重要的指导作
  • Anaconda安装Pytorch,以及在Pycharm中的配置

    Anaconda安装Pytorch 以及在Pycharm中的配置 有关Anaconda安装请移步安装Anaconda Python3 9 Tensorflow pytorch cpu 打开Anaconda Prompt 创建环境 这个步骤同
  • 八大排序(二)-----堆排序

    基本思想 1 将带排序的序列构造成一个大顶堆 根据大顶堆的性质 当前堆的根节点 堆顶 就是序列中最大的元素 2 将堆顶元素和最后一个元素交换 然后将剩下的节点重新构造成一个大顶堆 3 重复步骤2 如此反复 从第一次构建大顶堆开始 每一次构建
  • JavaScript 浅层克隆和深度克隆

    文章目录 JS 浅层克隆和深度克隆 1 相关知识点 2 浅层克隆 2 1 浅克隆函数 2 2 运用实例 3 深度克隆 3 1 深克隆步骤分析 3 2 深克隆函数 3 3 运用实例 3 4 hasOwnProperty JS 浅层克隆和深度克
  • 【自学笔记】后端01_Web服务器01_Tomcat

    一 web服务器 web服务器是一个应用程序 对HTTP协议的操作进行封装 使得程序员不必直接对协议进行操作 简化开发 主要功能是 提供网上信息浏览服务 说人话 服务器的作用就是封装了HTTP协议操作简化网站部署 让人可以在浏览器访问部署的
  • 【Leetcode笔记】重复的子字符串

    Leetcode原题链接 重复的子字符串 零 前情提要 自己写了个暴力法 LeetCode的一个巨长的字符串测试 然后嫌弃我时间太长了没通过 先放这里了 自己测试着没什么问题 代码 class Solution def repeatedSu
  • python基础:基本数据类型:整数,浮点数,字符串

    基本数据类型介绍 整数 浮点数 字符串 在介绍之前先来了解一个python在终端窗口运行的解释器 在你安装好python之后 运行终端命令行 输入python后回车 你会看到你的python版本以及提示信息和 gt gt gt 等待输入 你
  • 安卓刷机之pixel

    刷机记录 提示 本例子是pixel sailfish 刷rom 提示 刷rom及刷容比较简单一点 1 首先去谷歌的官网去下载手机对应的机型 2 下载刷机工具platform tools zip github地址好像404了 不过下载的地方很
  • windows 64位 apachect2.4+php5.5 无法加载php_curl模块

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 环境 windows2008 64位 单独装了apachect2 4 php5 5版本 今天服务迁移后 一直报call to undefined function curl
  • unity的触摸类touch使用

    这篇博文将简单的记录 如何用unity处理在移动设备上的触控操作 iOS和Android设备能够支持多点触控 在unity中你可以通过Input touches属性集合访问在最近一帧中触摸在屏幕上的每一根手指的状态数据 简单的触控响应实现起
  • Android studio单击按钮时,提示文字信息,并实现图片的显示

    MainActivity2 java package com example myapplication one import android media Image import android os Bundle import andr
  • 2021年计算机专业研究生分数线,2021年计算机科学与技术在职研究生分数线是多少?...

    计算机科学与技术为时下热门专业 国内对此专业人才的需求量比较大 薪资待遇也是比较不错的 国内有多所院校开设了此专业在职研课程班 但有学员对其分数线不了解 那么2021年计算机科学与技术在职研究生分数线是多少 据了解得知 就读计算机科学与技术
  • springboot非配置实现动态多数据库查询

    1需求 数据库配置信息不能在项目代码中配置或写死 系统能接入用户配置的数据库并保存和读取 每个用户可添加多个数据库 不同数据库类型 不同host 多个用户可添加相同的一个数据库 同一个数据库只创建一个连接池 数据库类型差异对业务逻辑透明 2
  • Python列表转换为字典

    如何将两个列表组合生成字典 1 源码 how to convert list into dict list1 1 2 3 list1 print list1 list2 one two three list2 print list2 obj
  • http2-浏览器支持的情况

    毕竟http2是新事物 尽管它的协议文本已经正式发布 但是相应的服务器和客户端代码依然在演进中 我本人也特别关注浏览器部分 因为研究了颇有一段时间的node http2 希望它可以和浏览器互操作 而不是自己的client 自己的server
  • Redis系列 - 单线程的Redis为什么那么快?

    Redis系列 单线程的Redis为什么那么快 Redis为什么使用单线程 在说这个问题之前我们先来了解下引入多线程常见的开销 1 上下文切换 即使是单核CPU也支持多线程执行代码 CPU通过给每个线程分配CPU时间片来实现这个机制 时间片
  • 三种开窗函数详细用法,图文详解

    开窗函数的详细用法 一 开窗函数的语法 二 从聚合开窗函数sum score over partition by name 讲起 三 开窗函数之first value last value lead lag 四 排名开窗函数ROW NUMB
  • 什么是百分比堆积条形图?

    条形图实际上范围很广 它是以横置图形展示数据的一种图表类型 百分比堆积条形图即以堆积条形图的形式来显示多个数据序列 但是每个堆积元素的累积比例始终总计为 100 它主要用于显示一段时间内的多项数据占比情况 百分比堆叠条形图将多个数据集的条形
  • Web网站的性能测试工具

    随着Web 2 0技术的迅速发展 许多公司都开发了一些基于Web的网站服务 通常在设计开发Web应用系统的时候很难模拟出大量用户同时访问系统的实际情况 因此 当Web网站遇到访问高峰时 容易发生服务器响应速度变慢甚至服务中断 为了避免这种情
  • 三子棋大致构建思路

    设计思路 1 菜单 输入选择 1 PLAY 开始游戏 0 EXIT 退出游戏 其他 重新进入菜单选择 2 PLAY 开始游戏 大致结构 1 创建并打印棋盘 2 玩家下棋 3 电脑下棋 4 判断局势 5 得出结果 6 返回1 菜单 3 创建并