【发布时间】:2018-05-09 15:57:27
【问题描述】:
所以,我基本上记录了我所做的所有测试用例。幸运的是,它们中的大多数都有效(特别是对于垂直获胜检查),但有时即使没有四个连接的部分,它也会说有一个获胜者。
(这是我为个人项目所做的,而不是学校作业。)
#include <cstdio>
#include <cstring>
#include <cstdlib>
const int stSize = 6;
const int width = 7;
class myStack // class for myStack. Each column is a stack.
{
private:
int boardArr[width][stSize];
int inUseA;
int inUseB;
int inUseC;
int inUseD;
int inUseE;
int inUseF;
int inUseG;
int moveNumber;
int slotsLeft;
//char player;
public:
myStack ()
{
for(int p = 0; p<width;p++) {
for(int c = 0; c<stSize;c++){
boardArr[p][c] = 'O';
}
}
inUseA = -1;
inUseB = -1;
inUseC = -1;
inUseD = -1;
inUseE = -1;
inUseF = -1;
inUseG = -1;
moveNumber = 0;
slotsLeft = 42;
}
int getstSize() {
return stSize;
}
int getMoveNumber() {
return moveNumber;
}
int getSlotsLeft() {
return slotsLeft;
}
void showBoard() {
printf(" =============================\n");
printf("1:| %c | %c | %c | %c | %c | %c | %c |\n",boardArr[0][5],boardArr[1][5],boardArr[2][5],boardArr[3][5], boardArr[4][5],boardArr[5][5],boardArr[6][5]);
printf("2:| %c | %c | %c | %c | %c | %c | %c |\n",boardArr[0][4],boardArr[1][4],boardArr[2][4],boardArr[3][4], boardArr[4][4],boardArr[5][4],boardArr[6][4]);
printf("3:| %c | %c | %c | %c | %c | %c | %c |\n",boardArr[0][3],boardArr[1][3],boardArr[2][3],boardArr[3][3], boardArr[4][3],boardArr[5][3],boardArr[6][3]);
printf("4:| %c | %c | %c | %c | %c | %c | %c |\n",boardArr[0][2],boardArr[1][2],boardArr[2][2],boardArr[3][2], boardArr[4][2],boardArr[5][2],boardArr[6][2]);
printf("5:| %c | %c | %c | %c | %c | %c | %c |\n",boardArr[0][1],boardArr[1][1],boardArr[2][1],boardArr[3][1], boardArr[4][1],boardArr[5][1],boardArr[6][1]);
printf("6:| %c | %c | %c | %c | %c | %c | %c |\n",boardArr[0][0],boardArr[1][0],boardArr[2][0],boardArr[3][0], boardArr[4][0],boardArr[5][0],boardArr[6][0]);
printf(" =============================\n"); // FORMAT: ([WIDTH][HEIGHT])
printf(" A B C D E F G \n");
}
void pushA() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseA == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseA = inUseA +1;
boardArr[0][inUseA] = data;
slotsLeft--;
moveNumber++;
}
}
void pushB() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseB == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseB = inUseB +1;
boardArr[1][inUseB] = data;
slotsLeft--;
moveNumber++;
}
}
void pushC() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseC == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseC = inUseC +1;
boardArr[2][inUseC] = data;
slotsLeft--;
moveNumber++;
}
}
void pushD() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseD == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseD = inUseD +1;
boardArr[3][inUseD] = data;
slotsLeft--;
moveNumber++;
}
}
void pushE() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseE == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseE = inUseE +1;
boardArr[4][inUseE] = data;
slotsLeft--;
moveNumber++;
}
}
void pushF() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseF == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseF = inUseF +1;
boardArr[5][inUseF] = data;
slotsLeft--;
moveNumber++;
}
}
void pushG() {
char data;
if (moveNumber % 2 != 0) {
data = '@';
}
else {
data = '#';
}
if (inUseG == stSize-1) {
printf("Error. Stack's full.\n");
return;
}
else {
inUseG = inUseG +1;
boardArr[6][inUseG] = data;
slotsLeft--;
moveNumber++;
}
}
int HorizontalWin() {
int horizCounter1 = 0;
int horizCounter2 = 0;
for(int n = 0; n<stSize;n++) {
for(int m = 0; m<width;m++) {
if(boardArr[n][m] == '@') {
horizCounter1++;
horizCounter2 = 0;
}
else if(boardArr[n][m] == '#') {
horizCounter2++;
horizCounter1 = 0;
}
}
if(horizCounter1 == 5 || horizCounter2 == 5) {
printf("Winner!\n");
return 1;
}
}
return 0;
}
int VerticalWin () {
int vertCounter1 = 0;
int vertCounter2 = 0;
for(int x = 0; x<width;x++) {
for(int y = 0; y<stSize;y++) {
if(boardArr[x][y] == '@') {
vertCounter1++;
vertCounter2 = 0;
}
else if(boardArr[x][y] == '#') {
vertCounter2++;
vertCounter1 = 0;
}
}
if(vertCounter1 == 4 || vertCounter2 == 4) {
printf("Winner!\n");
return 1;
}
}
return 0;
}
int diagonalWin() { // Don't mind this, i haven't started making this yet
return 0;
}
void processCommandLoop (FILE* inFile)
{
char buffer[300];
char* input;
input = fgets ( buffer, 300, inFile ); // get a line of input
// loop until all lines are read from the input
while (input != NULL)
{
// process each line of input using the strtok functions
char* command;
command = strtok (input , " \n\t");
printf ("*%s*\n", command);
if ( command == NULL ) {
printf ("Blank Line\n");
}
else if ( strcmp (command, "q") == 0){
exit(1);
}
else if ( strcmp (command, "?") == 0){
showCommands();
}
else if ( strcmp (command, "a") == 0){
pushA();
showBoard();
if (VerticalWin() == 1 || HorizontalWin() == 1) {
break;
}
}
else if ( strcmp (command, "b") == 0){
pushB();
showBoard();
if (VerticalWin() == 1 || HorizontalWin() == 1) {
break;
}
}
else if ( strcmp (command, "c") == 0){
pushC();
showBoard();
if (VerticalWin() == 1|| HorizontalWin() == 1) {
break;
}
}
else if ( strcmp (command, "d") == 0){
pushD();
showBoard();
if (VerticalWin() == 1|| HorizontalWin() == 1) {
break;
}
}
else if ( strcmp (command, "e") == 0){
pushE();
showBoard();
if (VerticalWin() == 1|| HorizontalWin() == 1) {
break;
}
}
else if ( strcmp (command, "f") == 0){
pushF();
showBoard();
if (VerticalWin() == 1|| HorizontalWin() == 1) {
break;
}
}
else if ( strcmp (command, "g") == 0){
pushG();
showBoard();
if (VerticalWin() == 1|| HorizontalWin() == 1) {
break;
}
}
else {
printf ("Invalid input: %s\n", command);
}
input = fgets ( buffer, 300, inFile ); // get the next line of input
}
}
void showCommands()
{
printf ("The commands for this game:\n");
printf("At any point, you may quit the game by entering 'q'");
printf (" q \n");
printf (" ? \n");
printf (" a \n");
printf (" b \n");
printf (" c \n");
printf (" d \n");
printf (" e \n");
printf (" f \n");
printf (" g \n");
printf("Options a-g mean that you can push a piece into the indicated stack\n");
}
};
int main()
{
FILE* inFile = stdin;
myStack test;
test.showCommands();
test.showBoard();
test.processCommandLoop(inFile);
printf("Quitting..\n");
return 1;
}
所以,是的,我知道我没有高效地编写程序(特别是考虑到我有这么多推送函数 xD,但我主要关心的是我的算法来确定谁赢了。我的垂直案例大部分都有效,但我的水平的几乎没有。
要了解我的意思,请查看我的测试用例:
=============================
1:| O | O | O | O | O | O | O |
2:| # | O | O | O | O | O | O |
3:| # | @ | O | O | O | O | O |
4:| # | @ | O | O | O | O | O |
5:| # | @ | O | O | O | O | O |
6:| @ | # | O | O | O | O | O |
=============================
A B C D E F G
Winner!
--
=============================
1:| @ | O | O | O | O | O | O |
2:| @ | O | O | O | O | O | O |
3:| @ | O | O | O | O | O | O |
4:| @ | @ | # | O | O | O | O |
5:| # | # | # | O | O | O | O |
6:| @ | # | # | O | O | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| # | O | O | O | O | O | O |
4:| # | O | O | O | O | O | O |
5:| # | O | @ | O | O | O | O |
6:| # | @ | @ | O | O | O | O |
=============================
A B C D E F G
Winner!
---------------------------------A
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | @ | O | O | O | O | O |
4:| O | @ | O | O | O | O | O |
5:| # | @ | # | O | O | O | O |
6:| # | @ | # | O | O | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | # | O | O | O | O | O |
3:| O | # | O | O | O | O | O |
4:| @ | # | O | O | O | O | O |
5:| @ | # | O | O | O | O | O |
6:| # | @ | @ | O | O | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| @ | # | O | O | O | O | O |
2:| @ | # | O | O | O | O | O |
3:| @ | # | O | O | O | O | O |
4:| # | # | @ | O | O | O | O |
5:| # | @ | @ | O | O | O | O |
6:| # | @ | # | O | O | O | O |
=============================
A B C D E F G
赢家! ------------------------------------B
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | @ | O | O | O | O |
4:| O | O | @ | O | O | O | O |
5:| O | O | @ | O | # | O | O |
6:| # | O | @ | O | # | O | # |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | # | O | O | O | O |
3:| O | O | # | O | O | O | O |
4:| O | O | # | O | O | O | O |
5:| @ | O | # | @ | O | O | O |
6:| @ | O | @ | # | O | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | @ | O | O | O | O |
2:| O | O | @ | O | O | O | O |
3:| O | O | @ | # | O | O | O |
4:| O | O | @ | # | O | O | O |
5:| O | O | # | # | O | O | O |
6:| O | O | # | @ | O | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | O | O | O | O |
4:| O | O | @ | O | O | O | O |
5:| # | O | @ | O | O | O | O |
6:| # | O | @ | @ | O | # | # |
=============================
A B C D E F G
Winner!^^ shouldnt be the case.. this implies that even adjacent pieces are counted for win status.
------------------------------------C
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | # | O | O | O |
4:| O | O | @ | # | O | O | O |
5:| O | O | @ | # | O | O | O |
6:| O | O | @ | # | O | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | @ | O | O | O |
2:| O | O | O | @ | O | O | O |
3:| O | O | O | @ | O | O | O |
4:| O | O | O | @ | O | O | O |
5:| # | O | @ | # | O | O | O |
6:| # | # | @ | # | O | O | # |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | @ | O | O | O |
3:| O | O | O | @ | O | O | O |
4:| # | O | O | @ | O | O | O |
5:| # | O | O | @ | O | O | O |
6:| # | O | O | # | O | O | O |
=============================
A B C D E F G
Winner!
------------------------------------D
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | O | # | O | O |
4:| O | O | O | O | # | O | O |
5:| @ | O | O | O | # | O | O |
6:| @ | O | O | O | # | O | @ |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | @ | O | O |
3:| O | O | O | O | @ | O | O |
4:| # | O | O | O | @ | O | O |
5:| # | O | O | O | @ | O | O |
6:| # | O | O | O | # | O | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | @ | O | O |
2:| O | O | O | O | @ | O | O |
3:| O | O | O | O | @ | O | O |
4:| O | O | O | O | @ | O | O |
5:| # | O | O | # | # | O | O |
6:| @ | # | O | @ | # | O | # |
=============================
A B C D E F G
Winner!
------------------------------------E
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | O | O | # | O |
4:| O | O | O | O | O | # | O |
5:| @ | O | O | O | O | # | O |
6:| @ | @ | O | O | O | # | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | @ | O |
3:| O | O | O | O | O | @ | O |
4:| O | O | O | O | O | @ | O |
5:| # | O | O | O | O | @ | O |
6:| # | # | O | O | O | # | O |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | @ | O |
2:| O | O | O | O | O | @ | O |
3:| O | O | O | O | O | @ | O |
4:| O | O | O | O | O | @ | O |
5:| O | O | O | O | O | # | O |
6:| @ | # | # | # | O | # | O |
=============================
A B C D E F G
Winner!
------------------------------------F
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | O | O | O | # |
4:| O | O | O | O | O | O | # |
5:| @ | O | O | O | O | O | # |
6:| @ | O | @ | O | O | O | # |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | @ |
2:| O | O | O | O | O | O | @ |
3:| O | O | O | O | O | O | @ |
4:| # | O | # | O | O | O | @ |
5:| @ | O | # | O | O | O | # |
6:| @ | # | @ | O | # | O | # |
=============================
A B C D E F G
Winner!
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | # |
3:| O | O | O | O | O | O | # |
4:| @ | O | O | O | O | O | # |
5:| @ | O | O | O | @ | O | # |
6:| # | @ | O | O | # | O | @ |
=============================
A B C D E F G
Winner!
>>>pay special attention to this error
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | O | O | O | @ |
4:| # | O | O | O | O | O | @ |
5:| # | O | O | O | O | O | @ |
6:| # | O | # | @ | O | O | # |
=============================
A B C D E F G
Winner! < shouldnt be the case
------------------------------------G
horizontal error:
=============================
1:| O | O | O | O | O | O | O |
2:| O | O | O | O | O | O | O |
3:| O | O | O | O | O | O | O |
4:| O | O | O | O | O | O | O |
5:| O | O | O | O | @ | O | O |
6:| # | # | # | O | @ | O | O |
=============================
A B C D E F G
Winner!< shouldnt be the case
如您所见,大多数垂直案例确实有效,但我在这里和那里看到了一些错误。
另外,我的水平检查也很难工作。
那么,各位 CS 人,你们认为我需要在哪里调整算法? 当 vertcounter2 递增时,我设置 verticalCounter1=0 的原因是,如果蓝色块位于 X 列上红色块的顶部,那么这会影响红色块的计数器,因此红色块必须再次达到 4。
我尝试在所有这些情况下手动调试它,但我不确定如何在这种情况下使用 GDB。我知道如何使用它来解决分段错误和内存泄漏,但我是 CPP 的新手,所以如果我在这里搞砸了,我深表歉意。我尽力了。
【问题讨论】:
-
顶这个帖子..
标签: c++ debugging multidimensional-array stack 2d-games