刚学C++没多久,想请问一个题目。希望各位大大帮帮忙
刚学C++没多久,想请教一个题目。希望各位大大帮帮忙。
我刚接触C++,目前学到array,但是教授给了一个题目我感觉压力好大。废话不说了,直接进入正题了。
要求是编写一个“找一对数字”的游戏,具体的output如下图:
其他小的细节就是,如果没找到一对,那么就要重新盖住翻开的数字;比如上图的6和3,他们不是一对,那么在下一次找的时候他们都恢复到“*”的状态。
如果找到了一对,那么就让这一对数学一直在后面的游戏里面显示出来。
当全部的“对子”都找到以后,询问玩家还要不要玩,如果要的话,就再重新随机16个数字,然后继续以上的步骤。
教授提示我们说用2D array, 但是本人刚接触,真心是个菜鸟,无奈求帮忙了。谢谢了。
------解决方案--------------------
用二维数组,例如:int arr[][4]={{5,4,6,1},{1,2,3,4},{9,8,1,7},{3,6,8,1}};只不过你这里需要随机生成,使用random函数随机生成数字,然后写一个打印输出函数,根据用户的输入进行有条件的输出。
希望能够帮到你!
------解决方案--------------------
------解决方案--------------------
#include<time.h>
------解决方案--------------------
[code=C/C++][/code]
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
typedef struct
{
int value;
int x;
int y;
bool ok;
}VALUE_ATTR;
#define MAX_VALUE_NUM 4
#define SWAP_TIMES 20
#define TIP_1_ROW 1
#define TIP_FIRST_CARD_ROW 9
#define TIP_SECOND_CARD_ROW 11
#define BOX_BEGIN_ROW 2
void swap(int& x1, int &x2)
{
int x3 = x1;
x1 = x2;
x2 = x3;
}
bool allOk(VALUE_ATTR v[][MAX_VALUE_NUM])
{
for(int i = 0; i < MAX_VALUE_NUM; i++)
for(int j = 0; j < MAX_VALUE_NUM; j++)
if(!v[i][j].ok)
return false;
return true;
}
void initValue(VALUE_ATTR v[][MAX_VALUE_NUM])
{
int values[MAX_VALUE_NUM * MAX_VALUE_NUM];
for(int i = 0; i < MAX_VALUE_NUM * MAX_VALUE_NUM / 2; i++)
{
values[i] = i + 1;
values[i + MAX_VALUE_NUM * MAX_VALUE_NUM / 2] = i + 1;
}
int pos[MAX_VALUE_NUM * MAX_VALUE_NUM];
for(int i = 0; i < MAX_VALUE_NUM * MAX_VALUE_NUM; i++)
pos[i] = i;
for(int i = 0; i < SWAP_TIMES; i++)
{
int pos1 = rand() % (MAX_VALUE_NUM * MAX_VALUE_NUM);
int pos2 = rand() % (MAX_VALUE_NUM * MAX_VALUE_NUM);
swap(pos[pos1], pos[pos2]);
}
for(int i = 0; i < MAX_VALUE_NUM * MAX_VALUE_NUM; i++)
{
v[pos[i] / 4][pos[i] % 4].value = values[i];
v[pos[i] / 4][pos[i] % 4].ok = false;
}
}
void clearFrom(HANDLE out, int y)
{
CONSOLE_SCREEN_BUFFER_INFO console_info;
GetConsoleScreenBufferInfo(out, &console_info);
COORD home = {0, y};
WORD att = console_info.wAttributes;
unsigned long size = console_info.dwSize.X * (console_info.dwSize.Y - y);
DWORD x = 0;
FillConsoleOutputAttribute(out, att, size, home, &x);
FillConsoleOutputCharacter(out, ' ', size, home, &x);
}
void outToConsole(HANDLE out, int x, int y, char* s)
{
COORD pos = {x, y};
::SetConsoleCursorPosition(out, pos);
printf("%s", s);
}
void setConsoleAttr(HANDLE out)
{
WORD att = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE ;
SetConsoleTextAttribute(out, att);
clearFrom(out, 0);
}
void drawBox(HANDLE out)
{
outToConsole(out, 4, 2, "1 2 3 4");
outToConsole(out, 2, 3, "=============");
char tmp[10];
for(int i = 0; i < MAX_VALUE_NUM; i++)
{
sprintf(tmp, "%d|", i + 1);
outToConsole(out, 1, i + 4, tmp);
outToConsole(out, 14, i + 4, "|");
我刚接触C++,目前学到array,但是教授给了一个题目我感觉压力好大。废话不说了,直接进入正题了。
要求是编写一个“找一对数字”的游戏,具体的output如下图:
其他小的细节就是,如果没找到一对,那么就要重新盖住翻开的数字;比如上图的6和3,他们不是一对,那么在下一次找的时候他们都恢复到“*”的状态。
如果找到了一对,那么就让这一对数学一直在后面的游戏里面显示出来。
当全部的“对子”都找到以后,询问玩家还要不要玩,如果要的话,就再重新随机16个数字,然后继续以上的步骤。
教授提示我们说用2D array, 但是本人刚接触,真心是个菜鸟,无奈求帮忙了。谢谢了。
------解决方案--------------------
用二维数组,例如:int arr[][4]={{5,4,6,1},{1,2,3,4},{9,8,1,7},{3,6,8,1}};只不过你这里需要随机生成,使用random函数随机生成数字,然后写一个打印输出函数,根据用户的输入进行有条件的输出。
希望能够帮到你!
------解决方案--------------------
------解决方案--------------------
#include<time.h>
------解决方案--------------------
[code=C/C++][/code]
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
typedef struct
{
int value;
int x;
int y;
bool ok;
}VALUE_ATTR;
#define MAX_VALUE_NUM 4
#define SWAP_TIMES 20
#define TIP_1_ROW 1
#define TIP_FIRST_CARD_ROW 9
#define TIP_SECOND_CARD_ROW 11
#define BOX_BEGIN_ROW 2
void swap(int& x1, int &x2)
{
int x3 = x1;
x1 = x2;
x2 = x3;
}
bool allOk(VALUE_ATTR v[][MAX_VALUE_NUM])
{
for(int i = 0; i < MAX_VALUE_NUM; i++)
for(int j = 0; j < MAX_VALUE_NUM; j++)
if(!v[i][j].ok)
return false;
return true;
}
void initValue(VALUE_ATTR v[][MAX_VALUE_NUM])
{
int values[MAX_VALUE_NUM * MAX_VALUE_NUM];
for(int i = 0; i < MAX_VALUE_NUM * MAX_VALUE_NUM / 2; i++)
{
values[i] = i + 1;
values[i + MAX_VALUE_NUM * MAX_VALUE_NUM / 2] = i + 1;
}
int pos[MAX_VALUE_NUM * MAX_VALUE_NUM];
for(int i = 0; i < MAX_VALUE_NUM * MAX_VALUE_NUM; i++)
pos[i] = i;
for(int i = 0; i < SWAP_TIMES; i++)
{
int pos1 = rand() % (MAX_VALUE_NUM * MAX_VALUE_NUM);
int pos2 = rand() % (MAX_VALUE_NUM * MAX_VALUE_NUM);
swap(pos[pos1], pos[pos2]);
}
for(int i = 0; i < MAX_VALUE_NUM * MAX_VALUE_NUM; i++)
{
v[pos[i] / 4][pos[i] % 4].value = values[i];
v[pos[i] / 4][pos[i] % 4].ok = false;
}
}
void clearFrom(HANDLE out, int y)
{
CONSOLE_SCREEN_BUFFER_INFO console_info;
GetConsoleScreenBufferInfo(out, &console_info);
COORD home = {0, y};
WORD att = console_info.wAttributes;
unsigned long size = console_info.dwSize.X * (console_info.dwSize.Y - y);
DWORD x = 0;
FillConsoleOutputAttribute(out, att, size, home, &x);
FillConsoleOutputCharacter(out, ' ', size, home, &x);
}
void outToConsole(HANDLE out, int x, int y, char* s)
{
COORD pos = {x, y};
::SetConsoleCursorPosition(out, pos);
printf("%s", s);
}
void setConsoleAttr(HANDLE out)
{
WORD att = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE ;
SetConsoleTextAttribute(out, att);
clearFrom(out, 0);
}
void drawBox(HANDLE out)
{
outToConsole(out, 4, 2, "1 2 3 4");
outToConsole(out, 2, 3, "=============");
char tmp[10];
for(int i = 0; i < MAX_VALUE_NUM; i++)
{
sprintf(tmp, "%d|", i + 1);
outToConsole(out, 1, i + 4, tmp);
outToConsole(out, 14, i + 4, "|");