五子棋(基本+扩展)

这篇博客介绍了使用C++编程实现五子棋游戏的过程,包括类定义、对象使用、构造函数、结构体、数组、键盘输入、随机数生成等知识点。游戏功能包括打印棋盘、玩家出棋判断、坐标合法性判断、获胜判断等。此外,还增加了选择菜单功能,如重置棋盘、放弃落子、悔棋和结束游戏。代码中包含了悔棋功能的实现及其效果展示,博主欢迎读者指出可能存在的问题。
摘要由CSDN通过智能技术生成

最近的作业“五子棋”;尝试了一下增加扩展功能。

**游戏中用到的C++知识点:**类的定义、对象的定义和使用、构造函数的使用、结构体的设置和使用、数组的使用、键盘键值获取、获取随机数、for、while、if等语句、静态变量

游戏功能的实现:

  1. 函数void FiveChess::PrintChessBoard(),该函数实现打印输出10*10的棋盘。主要是通过for语句试验循环打印
    在这里插入图片描述
  2. 函数void FiveChess::PlayChess(Position& pos, int player, char flag),该函数实现玩家出棋;需循循环判断玩家输入的坐标位置是否为有效合法位置,若有效则在该位置放入对应的标志。在这里插入图片描述
  3. 函数int FiveChess::JudgeValue(const Position& pos),该函数功能是判断坐标位置的合法性。在这里插入图片描述
  4. 函数int FiveChess::JudgeVictory(Position pos, char flag),判断是否有玩家获胜。也可以修改该函数,将各个获胜规则独立成各自的函数。
  5. 选取模式后,玩家抽签决定哪一方先落子。运用随机数,随机生成0-7,数字大者先下棋在这里插入图片描述
  6. 当玩家输入坐标(0,0)时,进入《选择菜单》主要功能有1.重置棋盘,2.放弃落子,3.悔棋,4.结束游戏;通过switch语句输入数字1,2,3,4实现功能在这里插入图片描述
  7. 允许任何一方放弃落子权。当玩家对电脑时,玩家按下坐标(0,0)选择菜单后按2就是放弃落子; 当玩家对玩家时,任何一方按下坐标(0,0)并选择2,则允许弃权,即该方玩家不需落子,直接让另一方落子。在这里插入图片描述
  8. 允许任何一方悔棋。先建立动态数组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)在这里插入图片描述
  9. 记录落子总次数。用静态变量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))
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值