//主程序
#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';
}
运行界面