用C语言实现三子棋小游戏(C语言菜单创建--设置光标,隐藏光标)


前言

本文主要用C语言实现三子棋(简易版)小游戏,同时介绍C语言中的菜单设置。


一、菜单设置

我们在C语言中设置菜单一般如下:
例:设置一个简单的游戏菜单

void menu()
{
    
    
	printf("*******************************\n");
	printf("************三子棋**************\n");
	printf("***1.play*******0.exit*********\n");
	printf("*******************************\n");
}

其运行结果如下:
在这里插入图片描述
这种菜单实现简单,但整体不够美观,我们可以来看以下这种:
先看代码:

#include<stdio.h>
#include<stdbool.h>
#include<windows.h>
//隐藏光标
void HideCursor(bool flag)
{
    
    
	//获取标准输出的句柄
	HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO info = {
    
     100, !flag };
	SetConsoleCursorInfo(hdl, &info);
}
//设置光标
void SetCurPos(int x, int y)
{
    
    
	//获取标准输出的句柄
	HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);
	//定义字符在控制台屏幕上的坐标
	COORD pos = {
    
     y, x };
	//移动命令行中光标的位置,使用头文件:"windows.h"
	SetConsoleCursorPosition(hdl, pos);
}
void menu()
{
    
    
	
	SetCurPos(0, 10);
	printf("三子棋\n");
	SetCurPos(2, 6);
	printf("欢迎进入游戏!\n");
	SetCurPos(4, 3);
	printf("1.play\n");
	SetCurPos(4, 16);
	printf("2.exit\n");
	SetCurPos(6, 0);
	//调用该函数,光标会被隐藏。
	//HideCursor(true);  

}

假设我们在主函数中调用该菜单函数:

int main()
{
    
    
	menu();//在主函数中调用menu()菜单函数
}

其运行结果如下:
在这里插入图片描述

若加上隐藏光标函数HideCursor(true); ,则结果如下:
在这里插入图片描述
对菜单设置部分代码进行解释:
在这里插入图片描述


二、三子棋游戏

整个游戏分为以下几个部分:
在这里插入图片描述

1.各部分代码

(1)菜单menu.c
此部分具体内容参考如上。
以下是代码:

#include<stdio.h>
#include<stdbool.h>
#include<windows.h>
//隐藏光标
void HideCursor(bool flag)
{
    
    
	HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO info = {
    
     100, !flag };
	SetConsoleCursorInfo(hdl, &info);
}
//设置光标
void SetCurPos(int x, int y)
{
    
    
	HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = {
    
     y, x };
	SetConsoleCursorPosition(hdl, pos);
}
void menu()
{
    
    
	
	SetCurPos(0, 10);
	printf("三子棋\n");
	SetCurPos(2, 6);
	printf("欢迎进入游戏!\n");
	SetCurPos(4, 3);
	printf("1.play\n");
	SetCurPos(4, 16);
	printf("2.exit\n");
	SetCurPos(6, 0);
	HideCursor(true);

}

(2)头文件部分:game.h
代码:

#pragma once
#define ROW 3   
#define COL 3   
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
#include<windows.h>
//初始化棋盘(char board[ROW][COL]——棋盘数组[行][列]
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家走
void PlayerMove(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);


(3)游戏各模块部分:game.c
代码:

#include"game.h"
#include<stdio.h>
//初始化棋盘,相当于将数组每个元素值为空
void InitBoard(char board[ROW][COL], int row, int col)
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i < row; ++i)
	{
    
    
		for (j = 0; j < col; ++j)
		{
    
    
			board[i][j] = ' ';
		}
	}
}
//打印出棋盘上的分隔符
void DisplayBoard(char board[ROW][COL], int row, int col)
{
    
    
	int i = 0;
	for (i = 0; i < row; ++i)
	{
    
    
		int j;
		for (j = 0; j < col; ++j)
		{
    
    
			//打印一行的数据 
			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 PlayerMove(char board[ROW][COL], int row, int col)
{
    
    
	int x = 0;
	int y = 0;
	printf("玩家走:\n");
	while (1)
	{
    
    
		printf("请输入要下的坐标:\n");
		scanf_s("%d%d", &x, &y);
		if (x > 0 && x <= ROW && y > 0 && y <= COL)
		{
    
    
			if (board[x - 1][y - 1] == ' ')
			{
    
    
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
    
    
				printf("该坐标被占用,请重新选择\n");
			}

		}
		else
		{
    
    
			printf("坐标非法,请重新选择\n");
		}
	}
}
//电脑随机产生坐标
void ComputerMove(char board[ROW][COL], int row, int col)
{
    
    
	int x = 0;
	int y = 0;
	printf("电脑走:\n");
	while (1)
	{
    
    
		x = rand() % row;
		y = rand() % row;
		if (board[x][y] == ' ')
		{
    
    
			board[x][y] = '#';
			break;
		}

	}

}
//1———表示棋盘满了  0——表实没满
int  IsFull(char board[ROW][COL], int row, int col)
{
    
    
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
    
    
		for (j = 0; j < col; j++)
		{
    
    
			if (board[i][j] == ' ')
			{
    
    
				return 0;
			}

		}
	}
	return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
    
    
	int i = 0;
	//行
	for (i = 0; i < row; i++)
	{
    
    
	    //如果连成一行,赢
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
    
    
			return board[i][1];
		}
		break;
	}
	//列
	for (i = 0; i < col; i++)
	{
    
     
		//如果连成一列,赢
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
    
    
			return board[1][i];
		}
		break;
	}
	//连城两个对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
    
    
		return board[1][1];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
    
    
		return board[1][1];
	}
	//判断平局
	if (1 == IsFull(board, ROW, COL))
	{
    
    
		return 'Q';
	}
	return 'C';//C继续
}

(4)主体模块:sanziqi.c

代码:

#include<stdio.h>
#include"game.h"
void game()
{
    
    
	char board[ROW][COL] = {
    
     0 };//定义数组存放棋盘信息
	char ret = 0;

	//数组初始化
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	while (1)
	{
    
    
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
    
    
			break;
		}
		//电脑下
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
    
    
			break;
		}
	}

	if (ret == '*')
	{
    
    
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
    
    
		printf("电脑赢\n");
	}
	else
	{
    
    
		printf("平局\n");

	}

}
void test()
{
    
    
	int input;
	srand((unsigned int)time(NULL));
	do
	{
    
    
		menu();
		printf("请选择:\n");
		scanf_s("%d", &input);
		switch (input)
		{
    
    
		case 1:
			printf("游戏开始!\n");
			game();
			break;
		case 2:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);

}
int main()
{
    
    
	test();
	return 0;
}

2.运行结果

结果如下:
在这里插入图片描述
注意以下问题:
(1)坐标超出范围,提示输入非法。
在这里插入图片描述

(2)坐标已有元素,其实被占用,请重新选择。
在这里插入图片描述
(3)输入错误

在这里插入图片描述


总结

提示:以上就是本文的全部内容。

猜你喜欢

转载自blog.csdn.net/m0_53689542/article/details/123607656