C语言数组实现三子棋
C语言实现三子棋(通过数组)
- 需要包含的头文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
- 创建一个全局数组
 因为如果数组大小变化,游戏规则和实现思路都会有很大的变化,所以不进行宏定义常量来定义数组
char board[3][3];
- 设计主程序框架
 game()函数为游戏过程框架
int main()
{
	do
	{
		int i = 0;
		printf("1.Start the game\n");
		printf("2.Quit the game\n");
		printf("Please enter your options->");
		scanf("%d", &i);
		switch (i)
		{
			case 1:
				game();    //game()函数为游戏过程框架
				break;
			case 2:
				return 0;
			default:
				printf("Input error,please enter again!\n");
				break;
		}
	} while(1);
}
- 设计游戏过程框架
void game()
{
	initBoard();
	srand((unsigned)time(NULL));    //生成随机种子,后面需要生成随机坐标
	char temp = ' ';                //定义一个字符变量,用于接收后面判断函数返回值,用于决定游戏胜负
	do
	{
		printBoard();           //打印棋盘的函数
		userPlay();             //玩家下棋的函数
		temp = judge();         //判断游戏是否分出胜负
		if (temp != ' ')
			break;
		robotPlay();            //电脑下棋的函数
		temp = judge();
	} while (temp == ' ');
	printBoard();
	switch (temp)
	{
		case '@':
			printf("User WIN!\n");
			break;
		case '$':
			printf("Bobot WIN!\n");
			break;
		case '*':
			printf("Dogfall !\n");
			break;
		dafault:
			break;
	}
}
- 设计棋盘样式
 有兴趣的可以搞的更加花里胡哨,这里草草了事,呸,简单设计一下 哈
//##########
// | |
//_|_|_
// | |
//_|_|_
// | |
//##########
- 打印棋盘
 重点就在这了,棋盘设计的再牛逼,也得能打印出来才行
 这里棋盘设计的比较简易,打印起来也比较简单,关键是思路要清晰
void printBoard()
{
	printf("##########\n");
	int i = 0,j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			if (j != 2)
			{
				printf("%c|",board[i][j]);
			}
			else
				printf("%c\n",board[i][j]);
		}
		if (i != 2)
			printf("_|_|_\n");
	}
	printf("##########\n");
}
- 玩家下棋
 本人习惯用界面编程的坐标系表示坐标,因此下面赋值时横坐标和纵坐标倒过来了
void userPlay()
{
	printf("Please enter coordinates->");
	int x = 0,y = 0;
	while(1)
	{
		scanf("%d %d", &x, &y);
		if (x > 0 && x < 4 && y > 0 && y < 4)
		{
			if (board[y - 1][x - 1] == ' ')
			{
				board[y - 1][x - 1] = '@';
				break;
			}
			else
				printf("There are chess pieces here,please enter again!->");
		}
		else
			printf("Input error,please enter again!->");
	}
}
- 电脑下棋
 这里关键是 要生成可行的坐标,以及随机数的生成
void robotPlay()
{
	int i = 0, j = 0;
	while (1)
	{
		i = rand() % 3;
		j = rand() % 3;
		if (board[i][j] == ' ')
		{
			board[i][j] = '$';
			break;
		}
	}
}
- 判断游戏胜负
 这里就到了最难分析的一部分了
 废话不多说,直接看代码
char judge()
{
	int i = 0, j = 0;
        //判断两条对角线    对i j 的值不做带动,所以放在前面
	if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ')
		return board[i][j];
	if (board[i][j + 2] == board[i + 1][j + 1] && board[i][j + 2] == board[i + 2][j] && board[i][j] != ' ')
		return board[i][j + 2];
        //依次判断三行、三列
	for (i = 0,j = 0; j < 3; j++)
	{
		if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] != ' ')
			return board[i][j];
	}
	for (i = 0,j = 0; i < 3; i++)
	{
		if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] != ' ')
			return board[i][j];
	}
        //判断棋盘是否满了(平局)
	for (i = 0; i < 3; i++)
	{
		for (j = 0;j < 3; j++)
		{
			if (board[i][j] == ' ')
				return board[i][j];
		}
	}
        //如果没出现以上情况,随便返回一个不同符号,使游戏继续进行
	return '*';
}
C语言数组实现三子棋的更多相关文章
- c语言小游戏-三子棋的完成
		三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ... 
- c语言实现:三子棋
		问题描述:两个游戏者在3*3棋盘里轮流作标记,如果一个人在行,列或者两个对角线可以作三个标记,则为获胜. 我们首先得打印菜单供玩家选择(可以选择玩游戏或者退出游戏) void menu() { pri ... 
- 用c语言实现三子棋
		1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ... 
- C语言简易三子棋
		这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ... 
- 51Nod:1995 三子棋
		1995 三子棋 题目来源: syu校赛 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 小的时候大家一定玩过"井"字棋吧.也就是在 ... 
- React + Ts 实现三子棋小游戏
		在这里阅读效果更佳 还记得当年和同桌在草稿纸上下三子棋的时光吗 今天我们就用代码来重温一下年少(假设你有react基础,没有也行,只要你会三大框架的任意一种,上手react不难) 游戏规则 双方各执一 ... 
- GO语言数组和切片实例详解
		本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ... 
- C语言 数组 列优先 实现
		C语言数组结构列优先顺序存储的实现 (GCC编译). 从行优先转换为列优先存储方式, 与行优先相比, 不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址. /** * @brief ... 
- C语言 数组 行优先 实现
		C语言数组结构行优先顺序存储的实现 (GCC编译). /** * @brief C语言 数组 行优先 实现 * @author wid * @date 2013-11-02 * * @note 若代码 ... 
随机推荐
- Linux 安装配置 NET模式网络环境配置
			1.下载linux:发行版 Ubuntu REdHat centos Debain Fedora,SUSE,OpenSUSEcentos 6.xcentos 7.x在虚拟机(VmWare)上 安装l ... 
- Struts2之国际化
			时间:2017-1-11 11:12 --国际化Struts2已经对国际化进行了封装,我们只需要根据其提供的API进行访问即可.要使用国际化的Action必须继承ActionSupport.1.什么是 ... 
- for循环操作(for...in、forEach)
			1.for...in语句用于对数组或者对象的属性进行循环操作,是for循环的一种. 注意:该方法可用于数组或对象. 语法: for(变量 in 对象/数组){} 如: var obj = { nam ... 
- 高性能利器:CDN我建议你好好学一下!
			硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! CDN 概述 CDN 全称 Content Delivery Netwo ... 
- 主要DL Optimizer原理与Tensorflow相关API
			V(t) = y*V(t-1) + learning_rate*G(x) x(t) = x(t-1) - V(t) 参考:https://arxiv.org/pdf/1609.04747.pdf DL ... 
- JavaScript——数组——数组长度
			JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ... 
- JDK、JRE、JVM的基本介绍
			一 .Java三大版本 JavaSE 标准版(桌面程序.控制台开发-) JavaWE 嵌入式开发(手机.家电-) JavaEE 企业开发(web端.服务器开发-) 二.JDK.JRE.JVM区别 JD ... 
- Java 学习:数据类型
			前言:Java属于强类型语言 强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用 优势就是安全性高,但劣势速度慢 数据类型 Java的数据类型分为两大类: 基本类型(primit ... 
- 剑指 Offer 31. 栈的压入、弹出序列
			剑指 Offer 31. 栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某 ... 
- JDK1.8源码阅读笔记(2) AtomicInteger  AtomicLong    AtomicBoolean原子类
			JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类 Unsafe Java中无法直接操作一块内存区域,不能像C++中那样可以自己申请内存 ... 
