首页 > 其他分享 >C语言实现三子棋

C语言实现三子棋

时间:2024-12-08 23:27:57浏览次数:5  
标签:实现 三子 void C语言 int board printf COL ROW

//主函数
#include "game.h"
int main() {
	int input = 0;
	srand(time(NULL));  //利用时间戳生成随机数
	do {
		menu();  //打印菜单
		scanf("%d", &input); //输入1开始游戏,0退出游戏
		if (input)
			game();   
		else {
			printf("退出游戏\n");
			break;
		}
	} while (input);
	return 0;
}

//game()函数
#include "game.h"
void menu() {
	printf("*******************************\n");
	printf("***1.start************0.exit***\n");
	printf("*******************************\n");
	printf("请选择\n");
}
void initboard(int board[ROW][COL]) {
	//初始化board数组每个元素为空格(不初始化,会导致打印棋盘时出现问题)
	int i = 0;
	for (i = 0; i < ROW; i++) {
		int j = 0;
		for (j = 0; j < COL; j++) {
			board[i][j] =' ';
		}
	}
}
void printboard(int board[ROW][COL]) {
	int i = 0;
	for (i = 0; i < ROW; i++) {
		int j = 0;
		for (j = 0; j < COL; j++) {
			//打印1行
			printf("%c ", board[i][j]);
			if (j < COL - 1)
				printf("|");   //打印竖向分割线
		}
		printf("\n");   //第一行打印完,换行
		if (i < ROW - 1)
			for (j = 0; j < COL; j++) {
				printf("--");   //打印横向分割线
				if (j < COL - 1)
					printf("|");  //打印竖向分割线
			}
		printf("\n");  //一行分割线打印完,换行
	}
}
void player_move(int board[ROW][COL]) {
	int r = 0;
	int c = 0;
	printf("请输入坐标\n");
	scanf("%d %d", &r, &c);
	if (board[r - 1][c - 1] ==' ')
		board[r - 1][c - 1] ='*';
	else
		printf("请重新输入\n");
}
char judge(int board[ROW][COL]) {
	int i = 0;
	int j = 0;
	char tmp = '!';   //表示棋盘已经下满了
	//判断是否有三个相同的在一行
	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[0][j] != ' '))
			return board[0][j];
	}
	//判断对角线是否有三个相同的
	if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') || (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '))
		return board[1][1];
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++) {
			//遍历每个元素,若都不为空格,则为平局
			if (board[i][j] == ' ')
				tmp = '@';   //来表示棋盘没下满
		}
	}
	return tmp;  
}
void print_winner(char rst) {
	if (rst == '*') {
			printf("YOU WIN\n");
	}
		else if (rst == '#') {
			printf("YOU LOSE\n");
		}
		else if (rst == '!') {
			printf("平局\n");
		}
}
void AI_move(int board[ROW][COL]) {
	printf("电脑下棋\n");
	while (1) {
		int r = rand() % 3;  //随机数取余3,得到0-2的数
		int c = rand() % 3;
		if (board[r][c] == ' ') {
			board[r][c] = '#';
			break;
		}
	}
}
void game() {
	printf("开始游戏\n");
	//初始化棋盘
	int board[ROW][COL] = { 0 };
	initboard(board);
	//打印初始化棋盘
		printboard(board);
		while (1) {
		//玩家下棋
		player_move(board);
		printboard(board);
		//判断
		char rst = judge(board);
		print_winner(rst);
		if ((rst == '*' )||(rst == '#')||(rst == '!'))
			break;
		//电脑下棋
		AI_move(board);
		printboard(board);
		//判断
		rst = judge(board);
		print_winner(rst);
		if ((rst == '*') || (rst == '#') || (rst == '!'))
			break;
	}
}
//声明函数的头文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#define ROW 3
#define COL 3
void menu();
void game();
void initboard(int board[ROW][COL]);
void printboard(int board[ROW][COL]);
void player_move(int board[ROW][COL]);
char judge(int board[ROW][COL]);
void print_winner(char ret);
void player_move(int board[ROW][COL]);

标签:实现,三子,void,C语言,int,board,printf,COL,ROW
From: https://blog.csdn.net/2402_83534870/article/details/144326645

相关文章

  • 16.在 Vue 3 中使用 OpenLayers 实现自定义地图缩放控件
    前言在前端开发中,地图交互是一个常见且重要的需求。默认情况下,OpenLayers提供了丰富的控件(如缩放、旋转、属性标注等),但有时我们需要根据项目需求自定义交互逻辑,比如禁用默认缩放控件并实现自己的按钮式缩放功能。本文将带大家实现一个自定义地图缩放的功能,通过Vue3的Com......
  • 数组练习题14道【C语言】
    一维数组1键盘录入一组数列,利用冒泡排序将数据由大到小排序/*************************************************************************>FileName:work11.c>Author:sgc>Description:键盘录入一组数列,利用冒泡排序将数据由大到小排序>Cre......
  • 10_C语言 -数组(常规)
    数组引例如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,如:intscore。假如我们要在程序中表示一组成绩,此时我们所学的常规数据类型就无法再表示,这个时候我们就需要使用到一种新的表现形式,这种表现形式就是我们的数组。什么是数组数组是相同类型,有序数据......
  • 基于boost的https服务器端实现
    需求分析客户需要管理一批数据(数据采集来的),内网环境下让授权用户在任何计算机都可以访问数据,处理数据,但不让下载(保护数据资产安全)设计是数据存储到mysql服务器,使用redis加速数据中关键参数的访问,由于对数据的访问速度有要求(需要对数据可视化然后进行处理,不能让用户点一下按钮......
  • 实验5_C语言指针应用编程
    任务1_1#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){inta[N];intmin,max;printf("录入%d个数据:\n",N);input......
  • 扫雷游戏的实现
    怎么说呢,扫雷游戏已经是我的二次学习了,第一次没学会,到第二次的昏昏欲睡,结果当然是没有学会,我还是决定熟悉它并学会它。首先是游戏进入一定要有一个进入界面功能进行选择,do-while循环就十分合适,可以进入也可以退出,进入游戏应有一个扫雷的打印,我们先要对二维数组进行初始化,后对......
  • C语言基础一:概述
    C语言:概述章节内容计算机组成:中央处理器CPU内存输入设备输出设备网络C语言程序的开发过程开发三步骤编辑(编写代码):程序员向.C文件写入程序编译(编译的详细过程):将源文件(.c)编译成可执行程序(二进制)编译过程分为4步预处理编译汇编:链接运行:运行可执行......
  • 用CAS思想实现一个自旋锁
    publicclassSpinLockDemo{//原子引用线程AtomicReference<Thread>atomicReference=newAtomicReference<>();publicvoidmyLock(){Threadthread=Thread.currentThread();System.out.println(thread.getName()+"\t......
  • 影刀RPA实现图片批量生成,效率翻倍!
    引言影刀RPA是一种先进的自动化技术,它通过模拟人类用户的操作来执行重复性任务。影刀RPA以其易用性、灵活性和高效率著称,特别适合于处理需要大量重复操作的图片生成工作。在数字化时代,图片处理需求日益增长,影刀RPA的应用可以显著提高图片批量生成的效率,减少人力成本,实现效率......
  • Java毕设项目案例实战II基于Java+Spring Boot+MySQL的玩具租赁系统设计与实现(开发文档
    目录一、前言二、技术介绍三、系统实现四、核心代码五、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。一、前言在环保意识日益增强的今天,玩具租赁作为一种绿色、经济的消费方式,逐渐受到家长和孩......