最近的作业“五子棋”;尝试了一下增加扩展功能。
**游戏中用到的C++知识点:**类的定义、对象的定义和使用、构造函数的使用、结构体的设置和使用、数组的使用、键盘键值获取、获取随机数、for、while、if等语句、静态变量
游戏功能的实现:
- 函数void FiveChess::PrintChessBoard(),该函数实现打印输出10*10的棋盘。主要是通过for语句试验循环打印
- 函数void FiveChess::PlayChess(Position& pos, int player, char flag),该函数实现玩家出棋;需循循环判断玩家输入的坐标位置是否为有效合法位置,若有效则在该位置放入对应的标志。
- 函数int FiveChess::JudgeValue(const Position& pos),该函数功能是判断坐标位置的合法性。
- 函数int FiveChess::JudgeVictory(Position pos, char flag),判断是否有玩家获胜。也可以修改该函数,将各个获胜规则独立成各自的函数。
- 选取模式后,玩家抽签决定哪一方先落子。运用随机数,随机生成0-7,数字大者先下棋
- 当玩家输入坐标(0,0)时,进入《选择菜单》主要功能有1.重置棋盘,2.放弃落子,3.悔棋,4.结束游戏;通过switch语句输入数字1,2,3,4实现功能
- 允许任何一方放弃落子权。当玩家对电脑时,玩家按下坐标(0,0)选择菜单后按2就是放弃落子; 当玩家对玩家时,任何一方按下坐标(0,0)并选择2,则允许弃权,即该方玩家不需落子,直接让另一方落子。
- 允许任何一方悔棋。先建立动态数组x,y用来记录输入下棋的坐标,如果玩家选择悔棋后,记录输入的上一回合坐标,即己方[x[bb - 2]][y[bb - 2]],对方[x[bb - 1]][y[bb - 1]]都要变成空白。当玩家对玩家时,任何一方按下 坐标(0,0)选择3,允许悔棋,即将上一轮落子位置上的棋子取消,允许重新在新位置落子。
记录上一位玩家的下棋坐标; 10. 通过操作某个键盘键按坐标(0,0)按1实现重置,即初始化棋盘;同时玩家的下棋次数也要清0;关闭功能操作某个键盘键按坐标(0,0)按4,直接返回1,调用函数exit(1) - 记录落子总次数。用静态变量p1count玩家1的下棋次数,静态变量p2count玩家2的下棋次数,静态变量ccount电脑的下棋次数,记录若有获胜方,记录获胜方所落子总次数;若‘和局’,记录玩家落子次数。
完整代码如下:
#pragma once
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
const int N = 10; //10*10的棋盘
const char ChessBoard0 = ' '; //棋盘标志
const char flag1 = ' o'; //玩家1或电脑标志
const char flag2 = ' x'; //玩家2标志
typedef struct Position { //坐标
int row; //行
int col; //列
}Position;
class FiveChess
{
public:
FiveChess();
void Play();
void drow(); //抽签
void choose(int player); //选择菜单功能
void regret(int player); //悔棋
void stop(int player); //放弃落子
void again(); //是否再来一次
protected:
void InitChessBoard();//初始化棋盘
int ChoiceMode(); //选择模式
void PrintChessBoard(); //打印棋盘
void ComputerChess(Position& pos, char flag); //电脑出棋
void PlayChess(Position& pos, int player, char flag); //玩家出棋
int JudgeValue(const Position& pos); //判断坐标的合法性
int JudgeVictory(Position pos, char flag);//判断是否有玩家获胜(底层判断)
bool GetVictory(Position& pos, int player, char flag); //判断具体哪位玩家赢
private:
char ChessBoard[N + 1][N + 1]; //棋盘
static int p1count; //玩家1下棋次数
static int p2count; //玩家2下棋次数
static int ccount; //电脑下棋次数
int offensive; //先手
int defensive; //后手
int mmode; //模式
int* x = new int[50];
int* y=new int[50];
static int bb;
};
#include <iostream>
using namespace std;
#include "FiveChess.h"
#include <time.h>
using namespace std;
int FiveChess::p1count = 0;
int FiveChess::p2count = 0;
int FiveChess::ccount = 0;
int FiveChess::bb = 0;
Position Play1; //玩家1或电脑
Position Play2; //玩家2
FiveChess::FiveChess() {
InitChessBoard(); //初始化棋盘
}
void FiveChess::Play() {
//下棋
//Position Play1; //玩家1或电脑
//Position Play2; //玩家2
while (1) {
int mode = ChoiceMode();
drow(); //抽签
if (mode == 1) {
cout << "\n电脑抽签为:" << offensive << endl;
cout << "玩家2抽签为:" << defensive << endl;
}
else {
cout << "\n玩家1抽签为:" << offensive << endl;
cout << "玩家2抽签为:" << defensive << endl;
}
cout << endl;
if (offensive > defensive) {
//电脑/玩家1先下棋
while (1) {
if (mode == 1) {
//电脑VS玩家
ComputerChess(Play1, flag1); //电脑走
if (GetVictory(Play1, 0, flag1)) {
//0代表电脑,为真则表示电脑获胜
break;
}
PlayChess(Play2, 2, flag2); //玩家2走
if (GetVictory(Play2, 2, flag2)) {
//2代表玩家2
break;
}
}
else {
//玩家1VS玩家2
PlayChess(Play1, 1, flag1); //玩家1走
if (GetVictory(Play1, 1, flag1)) {
//玩家1赢
break;
}
PlayChess(Play2, 2, flag2); //玩家2走
cout << "玩家1落子总次数为:" << p1count << endl;
if (GetVictory(Play2, 2, flag2)) {
//玩家2赢
break;
}
}
}
}
else {
//玩家2先下棋
while (1) {
if (mode == 1) {
//电脑VS玩家
PlayChess(Play2, 2, flag2); //玩家2走
if (GetVictory(Play2, 2, flag2)) {
//2代表玩家2
break;
}
ComputerChess(Play1, flag1); //电脑走
if (GetVictory(Play1, 0, flag1)) {
//0代表电脑,为真则表示电脑获胜
break;
}
}
else {
//玩家1VS玩家2
PlayChess(Play2, 2, flag2); //玩家2走
cout << "玩家1落子总次数为:" << p1count << endl;
if (GetVictory(Play2, 2, flag2)) {
//玩家2赢
break;
}
PlayChess(Play1, 1, flag1); //玩家1走
if (GetVictory(Play1, 1, flag1))