c语言学完数组就可以完成的小游戏--三子棋

2023-11-11

小游戏嘛,再简单也要有个菜单不是。

菜单:


int menu() {
	printf("欢迎来到稻草人游戏\n");
	printf("*****************\n");
	printf("******1 play*****\n");
	printf("******2 退出*****\n");
	printf("*****************\n");
}

这里我们利用switch语句完成菜单功能的选择。输入1开始游戏,输入2退出游戏也就是退出循环,其他输入皆为非法。


int main() {
	 srand((unsigned)time(NULL));
	int input = 0;
	do {
		menu();
		printf("请选择-》\n");
		scanf("%d", &input);
		//选择退出还是游戏
		switch(input) {
			case 1:
				game();
				break;
			case 2:
				printf("你已退出游戏\n");
				break;
			default :
			printf("输入有误!\n");
				break;
		}
	} while (input != 2);

	return 0;
}

开始游戏,调用game()函数。game()函数实现的功能就是模拟玩家下棋以及电脑随机下棋的过程。到玩家下棋时需要判断输入坐标的合法性以及当前局面是否已经游戏结束。电脑下棋时,由于我这里只是随机下棋,就只需要借用rand()生成随机坐标再判断合法就行了。


int game() {
	char res = 0;
	char board[3][3];
	InitBoard(board, Row, Col);
	PrintBoard(board, Row, Col);
	//下棋
	//int f = 1;//用0 1 来表示到谁下棋了
	while (1) {
		PlayMove(board, Row, Col);//玩家移动
		PrintBoard(board, Row, Col);
		//判断输赢
		 res = IsWin(board, Row, Col);
		if (res != 'c') {
			break;
		}
		ComputerMove(board, Row, Col);//电脑移动
		PrintBoard(board, Row, Col);
		if (res != 'c') {
			break;
		}
	}
	if (res == '*') {
		printf("玩家胜利\n");
	}
	else if(res=='#') {
		printf("电脑胜利\n");
	}
	else {
		printf("平局\n");
	}

}

游戏里的函数我都放在了game.c文件里面:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"

//初始化棋盘
void InitBoard(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] = ' ';
		}
	}
}

//打印棋盘

void PrintBoard(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");
		if (i < row - 1)
			printf("-----------\n");
	}
	printf("\n");
}
//玩家移动
void PlayMove(char board[Row][Col], int row, int col) {
	int x = 0;
	int y = 0;
	while (1) {
        printf("请玩家输入下棋坐标-》\n");
		scanf("%d %d", & x, &y);
		x--;
		y--;
		if (x >= 0 && x < col && y >= 0 && y < row ) {
			if (board[x][y] == ' ') {
                board[x][y] = '*';
			    break;
			}
			else {
				printf("该位置已被下过\n");
			}
		}
		else {
			printf("输入有误\n");
		}
	}
}

//电脑随机移动
void ComputerMove(char board[Row][Col], int row, int col) {
	printf("电脑下棋\n");
	while (1) {
		//随机生成坐标
        int x = rand() % row;
	    int y = rand() % col;
		if (x >= 0 && x < col && y >= 0 && y < row && board[x][y] == ' ') {
			board[x][y] = '#';
			break;
		}
	}
}

//判断输赢
//返回 * ---玩家赢
//返回 # ---电脑赢
//返回 d ---平局
//返回 c ---继续

char IsWin(char board[Row][Col], int row, int col) {
	//一行都相等
	for (int i = 0; i < row; i++)
	{
         if (board[i][0] == board[i][1]&& board[i][0] == board[i][2]&&board[i][0]!=' ') {
			return board[i][0];
		 }
	}
		
	//一列都相等
	for (int j = 0; j < col; j++) {
         if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] != ' ') {
			 return board[0][j];
		  }
	}
		
	//对角线相等
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
		return board[0][0];
	}

	if ((board[0][2] == board[1][1]) && (board[0][2] == board[2][0] )&& board[0][2] != ' ') {
		return board[0][2];
	}
	//判断是否还能下棋,如果不可以就是平局,否则就是继续
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 'c';
			}
		}
	}

	return 'd';
}

最后我把game.c里的函数放在game.h头文件里面声明:

define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#define Row 3
#define Col 3

//声明函数
 void InitBoard(char board[Row][Col], int row, int col);//初始化

 void PrintBoard(char board[Row][Col], int row, int col);//打印

 void PlayMove(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);//判断输赢

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

c语言学完数组就可以完成的小游戏--三子棋 的相关文章

随机推荐

  • Java线程协作的两种方式

    介绍 Java中线程协作的最常见的两种方式 利用Object wait Object notify 和使用Condition 方法一 Object中的wait notify notifyAll方法定义如下 public final nati
  • 基于域名的恶意网站检测

    基于域名的恶意网站检测 0x00 数据来源 0x01 基于网页内容的判别方法 0x02 基于域名数据的判别方法 0x03 参考文献 0x00 数据来源 根据老师给的 300w 域名列表爬到的相应 DNS 响应数据 0x01 基于网页内容的判
  • 【翻译】 2.6 中的 4K 堆栈 [发布于 2004 年 5 月 12 日,作者:corbet

    传统上 Linux 内核在大多数架构上都使用 8KB 内核堆栈 该堆栈必须满足系统调用可能产生的任何调用序列 以及可能同时调用的任何 硬或软 中断处理程序的需要 实际上 在稳定的内核中 堆栈溢出的情况几乎闻所未闻 内核开发人员早已学会避免使
  • 【Docker教程(一)】WSL2、Docker以及docker-compose安装及环境配置

    一 如何安装WSL2 二 如何安装和配置docker 三 如何安装docker compose 四 如何基于ip代理池获取代理ip 注意 先安装WSL2 再安装docker和docker compose 参考资料 软件下载及安装教程 a d
  • JavaScript循环语句和分支语句

    JavaScript中的分支语句 1 if分支语句 2 if else语句 3 if else if else语句 4 switch语句 注 if语句可以单独存在 else语句不能单独存在 else找离自己最近的同一级别的if搭配成对 在i
  • linux创建711文件,linux权限---【600,644,700,755,711,666,777】,644711

    linux权限 600 644 700 755 711 666 777 644711 chmod命令详解 使用权限 所有使用者 使用方式 chmod cfvR help version mode file 说明 Linux Unix 的档案
  • 用streamlit,几行代码就可以拥有漂亮图表!

    大家注意 因为微信最近又改了推送机制 经常有小伙伴说错过了之前被删的文章 比如前阵子冒着风险写的爬虫 再比如一些限时福利 错过了就是错过了 所以建议大家加个星标 就能第一时间收到推送 大家好 我是爱搞事情的了不起 之前我们爬过懂车帝的车型评
  • c语言报告 列主元lu分解,求助:求个R语言的选主元LU分解。

    推荐答案 上善若水666 来自团队 乐于助人2018 04 21 采纳率 57 等级 50 已帮助 96万人 可以 这是数值分析书上的定理 就是存在排列矩阵P 对换矩阵的乘积 使得PA LU 这个定理说明先对A进行对换矩阵的行得到PA 然后
  • 【面试题】1、总结面试题1

    1 Java语言有哪些特点 1 面向对象 Java是一种面向对象的语言 支持封装 继承和多态等面向对象的特性 Java特别强调类和对象的关系 要求所有代码都必须位于类中 和Java一样很流行的Python也是面向对象的语言 但它对面向对象的
  • PVE虚拟化平台之安装Ubuntu Desktop系统

    PVE虚拟化平台之安装Ubuntu Desktop系统 一 Ubuntu介绍 1 1 Ubuntu简介 1 2 Ubuntu版本 1 3 ubuntu命名规则 二 上传镜像到PVE 2 1 检查PVE环境 2 2 上传镜像到PVE 三 新建
  • ARM软件测试库STL( Software Test libraries )介绍

    原文链接 https www arm com zh TW products development tools embedded and software software test libraries Faster Safety Comp
  • XXL-JOB 分布式定时任务调度平台

    文章目录 1 概述 2 使用 1 概述 首先我们要知道什么是XXL JOB 官方简介 XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 现已开放源代码并接入多家公司线上产品线 开箱即用 XXL JO
  • JavaScript/ES6中的Object

    记录Object构造函数的一些静态方法 Object是编程中常见的一种构造函数 创建一个对象包装器 为什么说是创建了一个对象包装器 Object构造器会根据传入的参数的类型 将参数包装成具体的对象 如有数字对象 boolean对象 字符串对
  • 程序设计模式23+1种定义+UML图(有部分分析和联用)

    程序设计模式这门课已经学完了 复习的时候做了一个这样的汇总 希望可以给后来学习这门课的同学一些帮助 设计模式的分类 根据目的 模式是用来做什么的 可分为创建型 Creational 结构型 Structural 和行为型 Behaviora
  • 问题1:将静态库编译成动态库

    一 描述 1 多个同事间合作开发一个软件项目 每个人负责一部分模块开发 商定好彼此的对外接口 编程实现后 最后需要将所有人的开发代码编译链接到一起 生成一个最终目标文件 2 由于多人开发 若全部采用源文件编译 编译时文件数量众多 编写Mak
  • AES加解密,Base64编解码

    AES是什么 美国国家标准技术研究所在2001年发布了高级加密标准 AES AES是基于数据块的加密方式 即 每次处理的数据是一块 16字节 当数据不是16字节的倍数时填充 这就是所谓的分组密码 区别于基于比特位的流密码 16字节是分组长度
  • POSIX多线程程序设计(第4章:使用线程的几种方式)

    1概述 线程编程模型有以下三种方式 模型 说明 流水线 每个线程反复地在数据系列集上执行同一种操作 并把操作结果传递给下一步骤的其他线程 这就是 流水线 方式 即流水线上的线程对数据执行同一种操作 如简单的加1 再把数据的操作结果传递给下一
  • 戴尔服务器关闭系统自检,戴尔开机自检取消操作方法

    摘要 腾兴网为您分享 洛克王国菲菲 美丽拍 nba2k17选秀名单 瞩目会议 助理来也 hevc 奥迪出行 优奢易拍 威海公积金 久币网 奸笑表情包 gocom html按钮 爱物网 麦乐迪 jscript教程 苹果wifi密码查看等知识经
  • MySQL中select语句的执行顺序

    其实SQL语句并不是按照书写的顺序执行的 了解正确的执行顺序有助于我们更好的理解数据库 select语句的完整书写顺序如下 select distinct 字段列表 from 左表 连接类型 JOIN 右表 on 多表条件 where 条件
  • c语言学完数组就可以完成的小游戏--三子棋

    小游戏嘛 再简单也要有个菜单不是 菜单 int menu printf 欢迎来到稻草人游戏 n printf n printf 1 play n printf 2 退出 n printf n 这里我们利用switch语句完成菜单功能的选择