IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 五子棋游戏 -> 正文阅读

[游戏开发]五子棋游戏

功能说明:

黑棋与白棋进行博弈,先连满5个与自己颜色相同的棋子获胜。

函数要求:

1.棋子能够正常输入到棋盘中

2.能够正确判断棋子成功嬴棋:

(1)横向连满5个与自己颜色相同的棋子为获胜

(2)纵向连满5个与自己颜色相同的棋子为获胜

(3)正斜向连满5个与自己颜色相同的棋子为获胜

(4)负斜向连满5个与自己颜色相同的棋子为获胜

3.嬴棋了还可以再开一局

4.双方都输了(棋盘满了)可以再开一局

函数声明:

void initchessboard(PBoard pboard);//初始化

void start(PBoard pboarrd);//开始下棋

bool success(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//判断赢局

//cur_xpos是x坐标,cur_ypos是y坐标, chess_type是当前棋子颜色

bool success_hx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//横向位置判断赢局

bool success_zx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//纵向位置判断赢局

bool success_zxx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//左斜向位置判断赢局

bool success_yxx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//右斜向位置判断赢局

bool isfull(PBoard pboard);//判断期盼是否为满

void show_board(PBoard pboard);//展示棋盘

代码实现

chess.h(头文件)

#pragma once
#include<stdio.h>
#define ROW 5//行
#define COLUMN 5//列
#define N 5//设置5个旗子连着为赢
?
typedef struct ChessBoard {
? ? const char* chess_board[ROW][COLUMN];
? ? int size;//记录当前棋盘有效棋子个数
}ChessBoard, * PBoard;
?
//功能函数
void initchessboard(PBoard pboard);//初始化
void start(PBoard pboarrd);//开始下棋
bool success(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//判断赢局:横纵对角
//cur_xpos是x坐标,cur_ypos是y坐标, chess_type是当前棋子颜色
bool success_hx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//横向位置
bool success_zx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//纵向位置
bool success_zxx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//左斜向位置
bool success_yxx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type);//右斜向位置
bool isfull(PBoard pboard);//判断下满
void show_board(PBoard pboard);//展示棋盘


.cpp


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include"chess.h"
#include<string.h>
void initchessboard(PBoard pboard)//初始化
{
? ? pboard->size = 0;
? ? for (int i = 0; i < ROW; i++)
? ? {
? ? ? ? for (int j = 0; j < COLUMN; j++)
? ? ? ? {
? ? ? ? ? ? pboard->chess_board[i][j] = { "+" };
? ? ? ? }
? ? }
}
bool success(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type)//判断赢局:横纵对角
{
? ? return(success_hx_position(pboarrd, cur_xpos, cur_ypos, chess_type)
? ? ? ? || success_zx_position(pboarrd, cur_xpos, cur_ypos, chess_type)
? ? ? ? || success_zxx_position(pboarrd, cur_xpos, cur_ypos, chess_type)
? ? ? ? || success_yxx_position(pboarrd, cur_xpos, cur_ypos, chess_type));
}
?
bool success_hx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type)//横向位置
{
? ? //当前棋子的左边位置和右边位置遍历查找
? ? int count = 0;//记录与当前棋子相同颜色的棋子个数
? ? int i = cur_xpos;
? ? for (int j = cur_ypos-1; j >= 0; j--)//左边
? ? {
? ? ? ? if (pboarrd->chess_board[i][j] == chess_type)
? ? ? ? ? ? count++;
? ? ? ? else
? ? ? ? ? ? break;
? ? }
? ? //上面的for函数可以简化成
? ? //for (int j = cur_ypos - 1&& pboarrd->chess_board[i][j] == chess_type; j >= 0; j--)//左边
? ? //{
? ? // ? ? ? ?count++;
? ? //}
? ? for (int j = cur_ypos ; j < COLUMN; j++)//右边
? ? {
? ? ? ? if (pboarrd->chess_board[i][j] == chess_type)
? ? ? ? ? ? count++;
? ? ? ? else
? ? ? ? ? ? break;
? ? }
? ? if (count >= N)
? ? {
? ? ? ? printf("%s赢了!\n", chess_type);
? ? ? ? return true;
? ? }
? ? else
? ? ? ? return false;
}
bool success_zx_position(PBoard pboarrd, int cur_xpos, int cur_ypos,const char* chess_type)//纵向位置
{
? ? //当前棋子的上边位置和下边位置遍历查找
? ? int count = 0;//记录与当前棋子相同颜色的棋子个数
? ? int j = cur_ypos;
? ? for (int i = cur_xpos - 1; i >= 0; i--)//上边
? ? {
? ? ? ? if (pboarrd->chess_board[i][j] == chess_type)
? ? ? ? ? ? count++;
? ? ? ? else
? ? ? ? ? ? break;
? ? }
? ? for (int i = cur_xpos; i < ROW; i++)//下边
? ? {
? ? ? ? if (pboarrd->chess_board[i][j] == chess_type)
? ? ? ? ? ? count++;
? ? ? ? else
? ? ? ? ? ? break;
? ? }
? ? if (count >= N)
? ? {
? ? ? ? printf("%s赢了!\n", chess_type);
? ? ? ? return true;
? ? }
? ? else
? ? ? ? return false;
}
bool success_zxx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type)//左斜向位置
{
? ? //当前棋子的左上位置和左下位置遍历查找
? ? int count = 0;//记录与当前棋子相同颜色的棋子个数
? ? int j = cur_ypos;
? ? int i = cur_xpos;
? ? //
? ? for (; i >= 0 && j >=0 && pboarrd->chess_board[i][j] == chess_type; i--,j--)//左上
? ? { ?count++;
? ? }
?
? ? for (j = cur_ypos+1,i = cur_xpos+1; i <ROW ?&& j <COLUMN && pboarrd->chess_board[i][j] == chess_type; i++, j++)//左下
? ? { count++;
? ? }
? ? if (count >= N)
? ? {
? ? ? ? printf("%s赢了!\n", chess_type);
? ? ? ? return true;
? ? }
? ? else
? ? ? ? return false;
}
bool success_yxx_position(PBoard pboarrd, int cur_xpos, int cur_ypos, const char* chess_type)//右斜向位置
{
? ? ? ? //当前棋子的右上位置和右下位置遍历查找
? ? ? ? int count = 0;//记录与当前棋子相同颜色的棋子个数
? ? ? ? int j = cur_ypos;
? ? ? ? int i = cur_xpos;
? ? ? ? for (; i >=0 && j < COLUMN && pboarrd->chess_board[i][j] == chess_type; i--, j++)//右上
? ? ? ? {
? ? ? ? ? ? count++;
? ? ? ? }
? ? ? ? for (i = cur_xpos+1, j = cur_ypos -1; i < ROW && j >=0 && pboarrd->chess_board[i][j] == chess_type; i++, j--)//左下
? ? ? ? {
? ? ? ? ? ? count++;
? ? ? ? }
? ? ? ? if (count >= N)
? ? ? ? {
? ? ? ? ? ? printf("%s赢了!\n", chess_type);
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? else
? ? ? ? ? ? return false;
}
void show_board(PBoard pboard)//展示棋盘
{
? ? for (int i = 0; i < ROW; i++)
? ? {
? ? ? ? for (int j = 0; j < COLUMN; j++)
? ? ? ? ? ? printf("%s",pboard->chess_board[i][j]);
? ? ? ? printf("\n");
? ? }
}
?
bool isfull(PBoard pboard)//判断满
{
? ? return pboard->size == ROW * COLUMN ? true: false;
}
?
void start(PBoard pboard) //开始下棋
{
? ??
? ? int choice;
? ? const char* chess_type;
? ? int xpos, ypos;
? ? printf("五子棋游戏开始了!\n");
? ? while(true){
? ? ? ? initchessboard(pboard);//初始化棋盘
? ? ? ? ?printf("请选择输入的棋子类型:\n1.白棋□,2.黑棋●,3.退出游戏\n");
? ? ? ? ?scanf("%d", &choice);
? ? ? ? ?if (choice == 3)
? ? ? ? ?{
? ? ? ? ? ? ?printf("游戏结束\n");
? ? ? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? ? ? //if(choice==1)
? ? ? ? ? ? ? // ?chess_type = "□";
? ? ? ? ? // ?else
? ? ? ? ? ? ?// ? chess_type = "●";
? ? ? ? ?chess_type = choice == 1 ? "□" : "●";
? ? ? ? ?while (true)
? ? ? ? {
? ? ? ? ? ? show_board(pboard);
? ? ? ? ? ? printf("请输入%s棋子的坐标(空格符间隔):\n", chess_type);
? ? ? ? ? ? scanf("%d%d", &xpos, &ypos);
? ? ? ? ? ? //对当前位置进行判断,若有棋子在就不能再下
? ? ? ? ? ? //1.棋盘满 ?2,棋盘未满但该位置有棋子
? ? ? ? ? ? //while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (pboard->chess_board[xpos][ypos] == "+")
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? pboard->chess_board[xpos][ypos] = chess_type;
? ? ? ? ? ? ? ? ? ? pboard->size++;
? ? ? ? ? ? ? ? ? ? //break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? //判满
? ? ? ? ? ? ? ? ? ? if (isfull(pboard))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? printf("棋盘已满\n是否需要重开一局,y or n?\n");
? ? ? ? ? ? ? ? ? ? ? ? char num;
? ? ? ? ? ? ? ? ? ? ? ? getchar();
? ? ? ? ? ? ? ? ? ? ? ? scanf("%c", &num);
? ? ? ? ? ? ? ? ? ? ? ? getchar();
? ? ? ? ? ? ? ? ? ? ? ? //printf("%c", num);
? ? ? ? ? ? ? ? ? ? ? ? if (num == 'y')
? ? ? ? ? ? ? ? ? ? ? ? ? ? break;//跳出一层循环
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? printf("游戏结束\n");
? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? printf("该位置已有棋子,请重新输入:\n");
? ? ? ? ? ? ? ? ? ? ? ? scanf("%d%d", &xpos, &ypos);
? ? ? ? ? ? ? ? ? ? ? ? pboard->size++;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? pboard->chess_board[xpos][ypos] = chess_type;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //判断该棋子是否为赢剧
? ? ? ? ? ? if (success(pboard, xpos, ypos, chess_type))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? show_board(pboard);
? ? ? ? ? ? ? ? printf("%s棋子获胜\n是否需要重开一局,y or n?\n", chess_type);
? ? ? ? ? ? ? ? char num;
? ? ? ? ? ? ? ? getchar();
? ? ? ? ? ? ? ? scanf("%c",&num);
? ? ? ? ? ? ? ? getchar();
? ? ? ? ? ? ? ? //printf("%c", num);
? ? ? ? ? ? ? ? if (num == 'y')
? ? ? ? ? ? ? ? ? ? break;//跳出一层循环
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? printf("游戏结束\n");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? ? ? chess_type = chess_type == "●"?"□":"●";
?
? ? ? ? ? }
? ? ? }
}

test.cpp(测试文件)

//主程序
#include"chess.h"
int main()
{
? ? ChessBoard chessboard;
? ? start(&chessboard);
? ? return 0;
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:44:41  更:2022-04-01 23:48:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/31 19:25:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码