2023.06-2023.07:课程“面向对象综合实践课”实训报告
目录
一、实验目的
(1)简介:
五子棋是一种两人对弈的棋类游戏,旨在在一个棋盘上先形成一行、一列或一条对角线上连续的五颗棋子。本实验中,我们将使用C++编程语言实现一个基于控制台的五子棋游戏,其中包括棋盘的显示、玩家的输入和游戏规则的判断。
本实验报告将详细介绍五子棋游戏的设计思路、关键算法和程序实现。
(2)目的:
本实验旨在使用C++编程语言实现经典的五子棋游戏。通过该实验,我们可以深入理解面向对象编程的概念和C++语言的基本特性,并将其应用于游戏的设计和实现中。
二、设计思路
(1)棋盘设计:
使用二维数组表示棋盘,每个元素代表一个交叉点的状态。
利用ASCII字符绘制棋盘的外观,并在合适的位置显示棋子。
(2)游戏流程:
初始化棋盘和游戏状态。
交替进行玩家输入,根据输入的坐标在棋盘上放置棋子。
每次落子后,判断是否形成连续的五颗棋子,若有则游戏结束,否则继续进行下一轮。
在每轮结束后判断是否出现平局。
根据游戏结果显示胜利方或平局信息,并询问是否再次进行游戏。
(3)算法设计:
判断胜利:通过遍历棋盘中的每个点,检查其水平、垂直和对角线方向上是否有连续的五颗相同颜色的棋子。
输入合法性检查:检查玩家输入的坐标是否在棋盘范围内,且该位置是否为空。
三、关键算法和实现细节
(1)棋盘的表示:
使用二维数组board来表示棋盘,其中每个元素可以取三个值:0表示空位,1表示玩家1的棋子,2表示玩家2的棋子。
(2)判断胜利:
编写isWin函数,遍历棋盘中的每个点,检查其水平、垂直和对角线方向上是否有连续的五颗相同颜色的棋子。
(3)玩家输入:
利用cin获取玩家输入的坐标,检查输入的合法性。
(4)棋盘显示:
利用ASCII字符绘制棋盘的外观,并在合适的位置显示棋子。
(5)游戏结束和重新开始:
判断胜利方或平局后,显示游戏结果,并询问玩家是否重新开始游戏。
四、程序实现
(1)类设计:
Chessboard类:封装棋盘相关的属性和方法,如棋盘状态、棋盘显示、判断胜利等。
Game类:封装游戏相关的属性和方法,如游戏流程、玩家输入、游戏结果判断等。
(2)主函数:
创建Game对象,启动游戏。
五、实验代码
#include <iostream>
using namespace std;
const int BOARD_SIZE = 15;
const char EMPTY = ' ';
const char PLAYER1 = 'X';
const char PLAYER2 = 'O';
class Chessboard {
private:
char board[BOARD_SIZE][BOARD_SIZE];
public:
Chessboard() {
// 初始化棋盘
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY;
}
}
}
void displayBoard() {
// 显示棋盘
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
cout << board[i][j] << " ";
}
cout << endl;
}
}
bool makeMove(int row, int col, char player) {
// 下棋
if (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE || board[row][col] != EMPTY) {
return false;
}
board[row][col] = player;
return true;
}
bool isWin(char player) {
// 判断胜利
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == player) {
// 水平方向
if (j + 4 < BOARD_SIZE &&
board[i][j + 1] == player &&
board[i][j + 2] == player &&
board[i][j + 3] == player &&
board[i][j + 4] == player) {
return true;
}
// 垂直方向
if (i + 4 < BOARD_SIZE &&
board[i + 1][j] == player &&
board[i + 2][j] == player &&
board[i + 3][j] == player &&
board[i + 4][j] == player) {
return true;
}
// 对角线方向
if (i + 4 < BOARD_SIZE && j + 4 < BOARD_SIZE &&
board[i + 1][j + 1] == player &&
board[i + 2][j + 2] == player &&
board[i + 3][j + 3] == player &&
board[i + 4][j + 4] == player) {
return true;
}
// 反对角线方向
if (i + 4 < BOARD_SIZE && j - 4 >= 0 &&
board[i + 1][j - 1] == player &&
board[i + 2][j - 2] == player &&
board[i + 3][j - 3] == player &&
board[i + 4][j - 4] == player) {
return true;
}
}
}
}
return false;
}
bool isBoardFull() {
// 判断棋盘是否已满
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == EMPTY) {
return false;
}
}
}
return true;
}
};
class Game {
private:
Chessboard board;
char currentPlayer;
public:
Game() {
currentPlayer = PLAYER1;
}
void startGame() {
cout << "Welcome to the Five in a Row Game!" << endl;
cout << "Player 1: " << PLAYER1 << endl;
cout << "Player 2: " << PLAYER2 << endl;
cout << "Let's begin!" << endl;
while (true) {
board.displayBoard();
int row, col;
cout << "Player " << currentPlayer << ", enter your move (row col): ";
cin >> row >> col;
if (board.makeMove(row, col, currentPlayer)) {
if (board.isWin(currentPlayer)) {
cout << "Player " << currentPlayer << " wins!" << endl;
break;
} else if (board.isBoardFull()) {
cout << "It's a tie!" << endl;
break;
} else {
currentPlayer = (currentPlayer == PLAYER1) ? PLAYER2 : PLAYER1;
}
} else {
cout << "Invalid move. Try again." << endl;
}
}
cout << "Thanks for playing!" << endl;
}
};
int main() {
Game game;
game.startGame();
return 0;
}
六、实验总结
通过编译和运行程序,我们可以在控制台上看到五子棋游戏的界面,并能够进行玩家输入、判断胜负和重新开始游戏。
通过本次实验,我成功实现了五子棋游戏的C++版本,掌握了面向对象编程的基本概念和C++语言的基本特性。在实现过程中,我们深入理解了棋盘的表示和算法设计,并通过合适的类的设计和方法的封装,使得程序结构清晰、可读性高。通过实验,我们进一步熟悉了C++编程语言的应用,并提升了问题分析和解决的能力。