我已经看了几个小时这段代码,卡在了算法的实现上。虽然不想把整个代码都贴出来,但为了让你更好地理解,我觉得有必要这样做。我完全不知道该如何检查胜者。我曾尝试用递归的方法来实现,但和一些人交流后得知这并不是最好的方式。我完全被难住了,不知道该怎么解决这个问题。
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <iostream>
/**
* @brief Check if a winner exists
*
* @param pBoard The board
* @param colSize The column size
* @param rowSize The row size
*
* @return The character of the winner, 0 for no winner, and 't' for a tie
*/
char checkWinner(char** pBoard, int colSize, int rowSize, int winSize) {
// TODO
**This is where the algorithm needs to go.**
return 0;
}
/**
* @brief Place a piece onto the board
*
* @param pBoard The game board
* @param colSize The column size
* @param rowSize the row size
* @param columnSelection The column selection
* @param player The players characterS
*
* @return True if the piece was placed, else false
*/
bool placePiece(char** pBoard, int colSize, int rowSize, int columnSelection, char player)
{
// TODO
int row = rowSize-1;
while (pBoard[row][columnSelection]!= ' ' && row > 0){
row--;
}
std::cout << row << std::endl;
if (pBoard[row][columnSelection] == ' ') {
pBoard[row][columnSelection] = player;
return true;
} else{
std::cout << "The space is full." << std::endl;
return false;
}
}
/**
* @brief Print out the game board
*
* @param pBoard The game board
* @param colSize The column size
* @param rowSize The row size
*/
void printBoard(char** pBoard, int colSize, int rowSize) {
for (int i = 0; i <= rowSize; ++i){
std::cout << "|" << i;
}
std:: cout << "|" << std::endl;
for (int i = 0; i < rowSize; ++i){
std::cout << "|";
for (int j = 0; j < colSize; ++j){
std::cout << pBoard[i][j] << "|";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
int main()
{
bool running = true;
printf("Welcome to connect four!\n");
srand (time(NULL));
int32_t connectedPiecesToWin = 0;
int32_t rowSize = 0;
int32_t colSize = 0;
// setup game
std::cout << "How many connected pieces does it take to win?" << std::endl;
std::cin >> connectedPiecesToWin;
rowSize = connectedPiecesToWin + 2;
colSize = connectedPiecesToWin + 3;
std::cout << "You have selected " << connectedPiecesToWin << " in a row with a game board of " << colSize
<< " x " << rowSize << std::endl;
// setup board
char** pBoard = NULL; // TODO create the game board
// initialize board
pBoard = new char*[rowSize];
for (int i = 0; i < rowSize; ++i){
pBoard[i] = new char[colSize];
}
for(int i = 0; i < rowSize; ++i){
for(int j = 0; j < colSize; ++j){
pBoard[i][j]= ' ';
}
}
// play
char winner = 0;
char player = 'p';
do
{
int columnChoice = 0;
do
{
if (player == 'p')
{
printBoard(pBoard, colSize, rowSize);
std::cout << "Player's column: ";
std::cin >> columnChoice;
}
else
{
// computers turn
columnChoice = rand() % colSize;
}
} while (!placePiece(pBoard, colSize, rowSize, columnChoice, player));
winner = checkWinner(pBoard, colSize, rowSize, connectedPiecesToWin);
player = (player == 'c') ? 'p' : 'c';
} while (running && winner == 0);
printBoard(pBoard, colSize, rowSize);
if (winner == 't')
{
std::cout << "Too bad, the game was a tie!" << std::endl;
}
else if (winner == 'c')
{
std::cout << "Oh man, you lost to a computer that randomly places pieces!" << std::endl;
}
else
{
std::cout << "Congrats! You won!" << std::endl;
}
// cleanup
// TODO cleanup the board
for (int i = 0; i < rowSize; ++i){
delete[] pBoard[i];
}
delete[] pBoard;
return 0;
}
new char*[rowSize]
- 避免使用new
,不要使用数组new
。改用vector
。话虽如此,你肯定可以缩小示例,从而停止成为“那个人”,例如根本不需要任何输入或输出。只需设置一个硬编码的棋盘,然后是检查获胜者的代码。 - Ulrich Eckhardt