读书人

刚学C++没多久想请问一个题目。希望

发布时间: 2012-04-16 16:20:04 作者: rapoo

刚学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函数随机生成数字,然后写一个打印输出函数,根据用户的输入进行有条件的输出。

希望能够帮到你!
[解决办法]

探讨

引用:

生成1到8的随机数:
C/C++ code
{
int x;
x=rand()%9;
cout<<x<<endl;
}


额。。应该是这个吧:

int x
x = rand()%8+1;
cout<<x<<endl;

[解决办法]
#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_NUM4
#define SWAP_TIMES20

#define TIP_1_ROW1
#define TIP_FIRST_CARD_ROW9
#define TIP_SECOND_CARD_ROW 11
#define BOX_BEGIN_ROW2

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, "|");


}
outToConsole(out, 2, MAX_VALUE_NUM + 4, "=============");
}

void outStarToConsole(HANDLE out, VALUE_ATTR v[][MAX_VALUE_NUM])
{
int x = 4;
int y = 4;
for(int i = 0; i < MAX_VALUE_NUM; i++)
{
for(int j = 0; j < MAX_VALUE_NUM; j++)
{
v[i][j].x = x + j * 3;
v[i][j].y = y + i;
outToConsole(out, v[i][j].x, v[i][j].y, "*");
}
}
}

void outDigitToConsole(HANDLE out, VALUE_ATTR v[][MAX_VALUE_NUM], int x, int y)
{
char tmp[10];
sprintf(tmp, "%d", v[x][y].value);
outToConsole(out, v[x][y].x, v[x][y].y, tmp);
}

void outStarToConsole(HANDLE out, VALUE_ATTR v[][MAX_VALUE_NUM], int x, int y)
{
outToConsole(out, v[x][y].x, v[x][y].y, "*");
}

bool is_digit(char c)
{
return (('0' <= c) && ('9' >= c));
}

bool getPosition(int& x, int& y)
{
char tmp[1024];
gets(tmp);
//scanf("%s", tmp);
int pos = 0;
char digit[20];
memset(digit, 0, 20);
int tmp_pos = 0;
while(tmp[pos])
{
if(tmp[pos] == ',')
{
pos++;
break;
}
if(tmp_pos > 10)
return false;
if(!is_digit(tmp[pos]))
return false;
digit[tmp_pos++] = tmp[pos];
pos++;
}
if(tmp_pos == 0)
return false;
digit[tmp_pos] = 0;
x = atoi(digit);
tmp_pos = 0;
while(tmp[pos])
{
if(tmp[pos] == '\n' || tmp[pos] == '\r')
break;
if(!is_digit(tmp[pos]))
return false;
if(tmp_pos > 10)
return false;
digit[tmp_pos++] = tmp[pos];
pos++;
}
if(tmp_pos == 0)
return false;
digit[tmp_pos] = 0;
y = atoi(digit);
return (!(x <= 0 || x > MAX_VALUE_NUM || y <= 0 || y > MAX_VALUE_NUM));
}

int main()
{
srand(time(NULL));

HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
setConsoleAttr(out);

VALUE_ATTR values[MAX_VALUE_NUM][MAX_VALUE_NUM];
initValue(values);

outToConsole(out, 0, TIP_1_ROW, "Find all matching pairs on board");

drawBox(out);

outStarToConsole(out, values);


outToConsole(out, 0, TIP_FIRST_CARD_ROW, "Enter an x and y position[1-4] of the first card to flip\n");
while(true)
{
while(true)
{
int x1, y1;
while(true)
{
COORD pos = {0, TIP_FIRST_CARD_ROW + 1};
::SetConsoleCursorPosition(out, pos);
if(!getPosition(x1, y1))
{
clearFrom(out, TIP_FIRST_CARD_ROW + 1);
outToConsole(out, 0, TIP_FIRST_CARD_ROW + 1, "Wrong input,please input like 1,1,Press any key to continue");
getchar();
clearFrom(out, TIP_FIRST_CARD_ROW + 1);
}
else
break;
}
outDigitToConsole(out, values, x1 - 1, y1 - 1);
outToConsole(out, 0, TIP_SECOND_CARD_ROW, "Enter an x and y position[1-4] of the second card to flip\n");
int x2, y2;
while(true)
{
COORD pos = {0, TIP_SECOND_CARD_ROW + 1};
::SetConsoleCursorPosition(out, pos);
if(!getPosition(x2, y2))
{
clearFrom(out, TIP_SECOND_CARD_ROW + 1);
outToConsole(out, 0, TIP_SECOND_CARD_ROW + 1, "Wrong input,please input like 1,1,Press any key to continue");
getchar();
clearFrom(out, TIP_SECOND_CARD_ROW + 1);
}
else
break;
}
outDigitToConsole(out, values, x2 - 1, y2 - 1);
bool ok = true;
if(values[x1 - 1][y1 - 1].value != values[x2 - 1][y2 - 1].value)
{
outToConsole(out, 0, TIP_SECOND_CARD_ROW + 2, "Wrong!");
ok = false;
}
else
{
outToConsole(out, 0, TIP_SECOND_CARD_ROW + 2, "Great!");


values[x1 - 1][y1 - 1].ok = true;
values[x2 - 1][y2 - 1].ok = true;
}
if(allOk(values))
break;
outToConsole(out, 0, TIP_SECOND_CARD_ROW + 3, "Press any key to continue");
getchar();
if(!ok)
{
outStarToConsole(out, values, x1 - 1, y1 - 1);
outStarToConsole(out, values, x2 - 1, y2 - 1);
}
clearFrom(out, TIP_FIRST_CARD_ROW + 1);
}
clearFrom(out, TIP_FIRST_CARD_ROW);
outToConsole(out, 0, TIP_FIRST_CARD_ROW, "All OK,Press any key to continue or press q to exit");
if(getchar() == 'q')
break;
initValue(values);
outStarToConsole(out, values);
}
return 0;
}
[解决办法]
14楼的实现了,重复定义的部分改改
[解决办法]
破东西搞3个多小时:

C/C++ code
#include <iostream>#include <cstdlib>#include <ctime>using namespace std;//将数组中所有元素初始化为0void IniArr(int arr[][4]){    for(int i=0; i<4; i++)    {        for(int j=0; j<4; j++)        {            arr[i][j] = 0;        }    }        }//check数组是否还有0值bool CheckFull(int arr[][4]){    bool flag = false;    for(int i=0; i<4; i++)    {        for(int j=0; j<4; j++)        {            if( arr[i][j] == 0 )            {                flag = true;                break;            }        }    }        return flag;}//显示数组,元素为0则显示*号,否则显示元素void ShowArr(int arr[][4]){    cout<<"     1   2   3   4"<<endl;    cout<<"  -----------------"<<endl;    for(int i=0; i<4; i++)    {        cout<<i+1<<"|";        for(int j=0; j<4; j++)        {            if(arr[i][j] == 0)            {                cout<<"   *";            }            else            {                cout<<"   "<<arr[i][j];            }                    }        cout<<" |"<<endl;    }        cout<<"  -----------------"<<endl;}//将1~8各填2个到数组里的随机位置void InsertArr(int arr[][4]){    int num = 1;    int i=0, j=0;        while( CheckFull(arr) )    {        for(int k=0; k<2; k++)        {            i = rand()%4;            j = rand()%4;            if(arr[i][j] == 0)            {                arr[i][j] = num;                        }            else            {                k--;            }        }        num++;    }}//查看两个位置的数字是否一样,并显示void FindPair(int arrTest[][4], int arrContainer[][4], int m1, int n1, int m2, int n2){    int tmp[][4] = {{0,0,0,0},                    {0,0,0,0},                    {0,0,0,0},                    {0,0,0,0} };    if(arrTest[m1][n1] == arrTest[m2][n2])    {        arrContainer[m1][n1] = arrTest[m1][n1];        arrContainer[m2][n2] = arrTest[m2][n2];        ShowArr(arrContainer);    }    else    {        tmp[m1][n1] = arrTest[m1][n1];        tmp[m2][n2] = arrTest[m2][n2];        ShowArr(tmp);        cout<<"===牌===面===结===果==="<<endl;        ShowArr(arrContainer);    }}int main(){    srand(time(NULL));    int a[][4] = {    {0,0,0,0},                    {0,0,0,0},                    {0,0,0,0},                    {0,0,0,0} };    InsertArr(a);    ShowArr(a);    int b[][4] = {    {0,0,0,0},                    {0,0,0,0},                    {0,0,0,0},                    {0,0,0,0} };    ShowArr(b);    int m1,n1,m2,n2;    while( CheckFull(b))    {        cout<<"请输入第一个数字的横坐标和纵坐标(以空格分开):"<<endl;        cin>>m1>>n1;        cout<<"请输入第二个数字的横坐标和纵坐标(以空格分开):"<<endl;        cin>>m2>>n2;        FindPair(a, b, m1-1, n1-1, m2-1, n2-1);            cout<<"\n\n";    }        system("pause");    return 0;} 

读书人网 >C++

热点推荐