猜数字游戏和三子棋游戏

//主程序

#define _CRT_SECURE_NO_WARNINGS
#pragma once//防止一个头文件被多次include
#include<iostream>
#include<string>
#include<sstream>
#include<ctime>
#include<algorithm>
#include<vector>
#include<conio.h>
using namespace std;
string result;
int flag = 1;
#include"game.h"
#include"GameGo.h"

int main()
{
	srand(unsigned(time(0)));//初始化随机种子,用于后面随机生成一个四位数
	while (MainMenu());
}

//用于函数声明的头文件

#pragma once
#define ROW 3
#define COL 3
int MainMenu();
void InitBord(char bord[ROW][COL], int row, int col); 
//初始化棋盘
void BordGame();
//三子棋游戏
void DisplayBord(char bord[ROW][COL], int row, int col);
//打印棋盘
void PlayerMove(char bord[ROW][COL]);
//记录玩家下棋位置
void ComputerMove(char bord[ROW][COL]);
//随机生成电脑下棋位置
char Judge(char bord[ROW][COL]);
//判断输赢
//玩家赢 * /电脑赢 # /平局 e/继续 c
/*————————————————————————————————————*/

void PlayerGuess();
//你画我猜函数;
string MakeResult();
//随机生成一个四位数;
string GetAnswer();
//读取用户输入的四位字符
bool IsUnavailable(string s);
//判断输入的数字是否合法
void Compare(string result, string answer);
//比较输入的数字有有多少(位置)正确?

//用于函数实现的头文件 

#pragma once
int MainMenu()
{
	system("cls");
	cout << "1.我想你猜" << endl;
	cout << "2.三子棋" << endl;
	cout << "3.你想我猜 (暂未开发)" << endl;
	cout << "4.排行榜 (暂未开发)" << endl;
	cout << "0.退出" << endl;
	int chioce;
	chioce = _getch();
	switch (chioce)
	{
	case '1':PlayerGuess(); break;
	case '2':BordGame(); break;
	case '3':cout << "尽请期待~" << endl; break;
	case '4':cout << "尽请期待~" << endl; break;
	case '0':return 0;
	default:cout << "输入错误,请重新选择!" << endl; break;
	}
	cout << "即将返回主菜单" << endl;
	system("pause");
	return 1;
}
string MakeResult()
{
	char temp[] = "0123456789";
	random_shuffle(temp, temp + 10);
	temp[4] = 0;
	return temp;
}
void PlayerGuess()
{
	system("cls");
	result = MakeResult();
	int round = 0;
	for (; round < 16; round++)
	{
		flag = 1;
		if (round == 0)
		{
			cout << "我会随机生成一个不重复的四位数字" << endl;
			cout << "------------------------------------------" << endl;
			cout << "如果不想猜了,输入0000可查看答案并退出程序" << endl;
			cout << "------------------------------------------" << endl;
		}
		string answer = GetAnswer();//在GetAnswer里面判断是否合理
		{
			if (flag == 0)
			{
				cout << endl;
				continue;
			}
			if (answer == result)
			{
				if (round == 0)
				{
					cout << "恭迎欧皇大人!!!" << endl;
					//					system("pause");
					return;

				}
				else if (round <= 5)
				{
					cout << "真聪明! " << ++round << "次就猜对了,可真牛啊!佩服佩服" << endl;
					//					system("pause");
					return;
				}
				else if (round <= 10)
				{
					cout << "不错不错,在多思考下就能更快了" << endl;
					//					system("pause");
					return;
				}
				else if (round <= 14)
				{
					cout << "恭喜!还可以更快的欧!欢迎继续挑战!" << endl;
					//					system("pause");
					return;
				}
				else
				{
					cout << "二师兄,师傅都被妖怪抓走了,你才猜出来?继续挑战吧!" << endl;
					//					system("pause");
					return;
				}

			}
			else
			{
				Compare(result, answer);
			}
		}
		cout << endl;
	}
	if (round == 16)
	{
		cout << "牛马!你没能在16次以内猜出数字:" << result << "欢迎下次继续,加油,奥里给!" << endl;
		system("pause");
		return;
	}
}
string GetAnswer()
{
	string answer;
	cout << "请输入你所猜的不重复的四位数字:";
	cin >> answer;
	if (answer == "0000")
	{
		cout << "答案是:" << result << endl;
		system("pause");
		exit(0);
	}
	while (!IsUnavailable(answer))break;
	return answer;
}
bool IsUnavailable(string s)
{
	int i;
	int count[10] = { 0 };
	for (i = 0; i < 4; i++)
	{
		if (s[i] < '0' || s[i]>'9')//判断输入数字是否在0~9之间
		{
			cout << "有非法字符或不够四位数,请重新输入" << endl;
			flag = 0;
			system("pause");
			return true;
		}
		count[s[i] - '0']++;
		if (count[s[i] - '0'] > 1)//判断有无重复数字
		{
			cout << "有重复数字,请重新输入" << endl;
			flag = 0;
			system("pause");
			return true;
		}
	}
	if (s[i] != '\0')//判断是否超出4位数(s[4]是否为'\0')
	{
		cout << "超出四位数字,请重新输入" << endl;
		flag = 0;
		system("pause");
		return true;
	}
	return false;
}
/*------------------------------------------------------------------*/

void Compare(string result, string answer)
{
	int A = 0, B = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (answer[i] == result[j])
			{
				if (i == j)A++;
				B++;
			}
		}
	}
	cout << "猜中了" << B << "个数字" << " 其中位置也准确的个数:" << A << endl;
}
void InitBord(char bord[ROW][COL], int row, int col) {//初始化数组
	int i = 0, j = 0;
	for (; i < ROW; i++) {
		for (j=0; j < COL; j++) {
			bord[i][j] = ' ';
		}
	}
}
void BordGame() {
	char ret = 0;
	char bord[ROW][COL] = { 0 };
	InitBord(bord, ROW, COL);//空格初始化
	while (1) {
		system("cls");
		DisplayBord(bord, ROW, COL);
		PlayerMove(bord);
		ret = Judge(bord);
		if (ret != 'c') break;
		ComputerMove(bord);
		DisplayBord(bord, ROW, COL);
		ret = Judge(bord);
		if (ret != 'c') break;
	}
	DisplayBord(bord, ROW, COL);
	if (ret == '*')printf("恭喜你,你赢了!");
	else if (ret == '#')printf("电脑胜利!");
	else printf("平局!");
}
void DisplayBord(char bord[ROW][COL], int row, int col) {
	system("cls");
	int i = 0, j = 0;
	for (i = 0; i < ROW; i++) {
		putchar('\n');
		for (j = 0; j < COL; j++) {
			printf(" %c ", bord[i][j]);
			if (j < COL - 1)printf("|");
		}
		putchar('\n');
		if(i<ROW-1){
			for (j = 0; j < COL; j++) {
				printf("---");
				if (j < COL - 1)printf("|");
			}
		}
	}
	putchar('\n');
}
void PlayerMove(char bord[ROW][COL]) {
	int m, n;
	while (1) {
		printf("\n请输入你要走的坐标\n范围:1~%d 1~%d:>", ROW, COL);
		scanf("%d %d", &m, &n);
		if (bord[m - 1][n - 1] == ' ') {//坐标合法测试
			bord[m - 1][n - 1] = '*';
			break;
		}
		else {
			cout << "坐标不合法请选择其他位置" << endl;
		}
	}
}
void ComputerMove(char bord[ROW][COL]) {//找没有下棋的地方随机下
	printf("电脑下棋:>");
	while (1) {
		int x = rand() % ROW;
		int y = rand() % COL;
		if (bord[x][y] == ' ') {
			bord[x][y] = '#';
			break;
		}
	}

}
char Judge(char bord[ROW][COL]) {
	int i = 0, j = 0;
	for (i = 0; i < ROW; i++) {
		if ((bord[i][0] == bord[i][1] && bord[i][1] == bord[i][2]) && bord[i][0] != ' ')return bord[i][0];
	}
	for (i = 0; i < COL; i++) {
		if (bord[0][i] == bord[1][i]&& bord[1][i] == bord[2][i] && bord[0][i] != ' ')return bord[0][i];
	}
	if (bord[0][0] == bord[1][1] && bord[1][1] == bord[2][2] && bord[1][1] != ' ')return bord[1][1];
	if (bord[2][0] == bord[1][1] && bord[1][1] == bord[2][0] && bord[1][1] != ' ')return bord[1][1];
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++)if (bord[i][j] == ' ')return 'c';
	}
	return 'e';
}

 

运行界面

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值