文章目录

  • Prerequisite
  • 显示窗口

Prerequisite

最近在学c++,直接看书学习基础语法有点无聊,于是希望结合游戏开发来深入了解这门语言。网上搜罗了一番,决定从四子棋(connect four)着手,大概300来行代码。这个系列目前只实现了“人人对战模式”,“人机博弈”的算法有空再完善它。首先说一下编程环境:

  • 编程语言:c++
  • 游戏开发库:SDL-2.0
  • 开发环境:windows或者linux,Visual Studio或者其他IDE

完整代码已经放上github了,在这里

这里跳过SDL-2.0的环境配置了,基本就是跟c++使用第三方库是一样的,准备好必要的头文件以及库文件,让编译器知道去哪儿找它们就可以了。开始吧!

这一部分我们只是简单地显示一个指定大小的窗口5秒钟,然后退出程序

显示窗口

首先,SDL2.0要求我们做一些初始化的工作。另外,因为我们后面会使用到png图片和字体的加载,我们这里一并把这些初始化工作都作了,先写个initialize()函数:

// main.cpp#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
using namespace std;bool initialize() {if (SDL_Init(SDL_INIT_VIDEO) < 0) {printf("Failed to initialize SDL! SDL Error: %s\n", SDL_GetError());return false;}int imgFlags = IMG_INIT_PNG;if (!(IMG_Init(imgFlags) & imgFlags)){printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());return false;}if (TTF_Init() == -1) {return false;}return true;
}

我们先把会用到的三个头文件包含进来:

  • SDL.h:提供的基本的功用,如窗口程序
  • SDL_image.h:提供图片加载的函数
  • SDL_ttf.h:提供字体的加载,这个在后面会用到

分别初始化这三个模块,如果有错误则将相应错误打印出来,并且返回false;否则返回true

在windows环境下printf打印的字符串就不可见了,可以尝试一下微软提供的OutputDebugString,这样可以在调试的时候看到错误信息;linux环境下则printf可以正常打印到命令行。

如果初始化成功,我们就可以着手我们的窗口程序了。因为后面要添加许许多多的功能,我们把整个游戏逻辑都封装在一个类里:

// connect_four_0.h
#ifndef CONNECT_FOUR_0_H
#define CONNECT_FOUR_0_H#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_image.h>
#include <cstdio>
using namespace std;SDL_Window *gWindow = nullptr;
constexpr int GRID_SIZE = 50;class ConnectFour {public:ConnectFour() = default;ConnectFour(int nbWGrids, int nbHGrids) :_nbWGrids(nbWGrids),_nbHGrids(nbHGrids),_nbGrids(nbWGrids * nbHGrids){_winHeight = GRID_SIZE * nbHGrids;_winWidth = GRID_SIZE * nbWGrids;}void start() {pre_run();run();}
private:int _nbHGrids = 0;    // 竖直方向的格子数int _nbWGrids = 0;    // 水平方向的格子数int _nbGrids = 0;     // 总的格子数,就是上面两个变量的乘积int _winHeight = 0;   // 窗口的高度int _winWidth = 0;    // 窗口的宽度void pre_run() {gWindow = SDL_CreateWindow("Connect Four", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, _winWidth, _winHeight, SDL_WINDOW_SHOWN);}void run() {SDL_Delay(5000);}
};#endif

首先我们定义一个全局变量gWindow,这个指针指向我们的窗口程序。另外,我们定义一个常量GRID_SIZE,指明每个四子棋格子所占的像素个数,这里我们设定为50,那么后面我们计算窗口的大小就是:每个格子所占像素个数 x 格子个数。

ConnectFour类里有4个私有变量,它们的含义分别如上面的注释所示。注意,所有的类成员变量我都以下划线_开始了,这只是我自己的编程风格,不一定要采纳。该类里面定义了一个有参数的构造函数ConnectFour(int nbWGrids, int nbHGrids),允许用户指定格子的数目,然后也可以计算出相应的窗口宽度和高度。

ConnectFour类主要提供了一个start()接口来启动这个窗口。我们现在就只是创建一个窗口,然后等待5秒便退出:

gWindow = SDL_CreateWindow("Connect Four", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, _winWidth, _winHeight, SDL_WINDOW_SHOWN);

创建窗口函数的参数分别为:窗口名字(title)、窗口的位置x和y(这里我们不指定位置)、窗口的宽度和高度、是否显示窗口。

有了这个我们就可以回去main函数:

// main.cpp
#include "connect_four_0.h"
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
using namespace std;bool initialize(); // 前面定义了,这里不重复了int main(int, char *[]) {if (initialize()) {ConnectFour cf(10, 8);cf.start();}return 0;
}

注意这个main函数感觉怪怪的,但SDL2.0好像一定要求要这种形式的,这里因为我们不需要用到这些参数,所以我把名字省略掉了。在后续过程中,这个main.cpp文件都不再需要改变了(#include “connect_four_0.h"可能还是要改成相应的文件)。

Connect Four四子棋c++程序 - 显示窗口(0)相关推荐

  1. 【原创】【程序小游戏】平面四子棋 C++

    平面四子棋 事先声明: 代码是我自个儿写的,规则不是我发明的~~~~. 我觉得我真是太不务正业了! 规则 在一个7*12的棋盘里,下四子棋.只不过,这个棋盘是竖立着的,它的棋子是从上往下掉的. 比如说 ...

  2. 基于LC3模拟器的简单游戏设计:简易四子棋

    一.实验目的 分析和理解指定的需解决问题. 利用LC-3的汇编代码设计实现相关程序. 通过LC-3仿真器调试和运行相关程序并得到正确的结果. 二.实验内容 四子棋是一款普遍流行的简易型桌面游戏,据说, ...

  3. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  4. 深圳大学计系汇编语言实验--四子棋游戏

    题面 四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线.垂直线或者是对角线. 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通 ...

  5. 深圳大学 计系1实验四—四子棋实验

    实验要求 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成. 游戏规则如下: 两位选手依次轮流落子: 选手不能悔棋: 有子的地方不能继续 ...

  6. 人机对战初体验:Python基于Pygame实现四子棋游戏

    人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...

  7. 【华为OD】社招算法真题:四子棋连,下棋后,棋子会落到最底部,实现一行、一列或者一条对角线 上有四个相同颜色的棋子,获胜

    四子棋 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个m行n列的垂直悬挂的 网格中,如下所示. 这个游戏的目的是在对手实现一行.一列或者一条对角线 上有四个 ...

  8. 四子棋 freepython

    四子棋,是黑白棋的一种.是一种益智的棋类游戏.黑白两方(也有其它颜色的棋子)在8*8的格子内依次落子.黑方为先手,白方为后手.落子规则为,每一列必须从最底下的一格开始.依此可向上一格落子.一方落子后另 ...

  9. 四子棋 java_java智能四子棋人机大战游戏设计(附项目,以及原创PSD,设计文档)...

    本项目是使用java技术+自创"假设下子"算法开发的人机大战四子棋游戏客户端. 具体项目,以及原创PSD,设计文档,在文件末尾的百度云连接. 一. 小组说明: 组名:CST 组长: ...

  10. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏

    继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...

最新文章

  1. OpenCvSharp用掩膜来实现圆形的ROI区域
  2. 数据结构和算法分析:第一章 引论
  3. F5 BIG-IP 远程代码执行漏洞 CVE-2021-22986 虚拟机上复现
  4. 杭电1728bfs逃离迷宫java实现
  5. im4java profile_GraphicsMagick+im4java
  6. webrtc agc matlab,c++ WebRTC AGC(自动增益控制)
  7. 【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)
  8. java反射技术_java反射技术,逆向开发必备技能
  9. P1502 窗口的星星(扫描线入门第一题)
  10. idea之springboot端口被占用/跳转到login
  11. 微信小程序 View:flex 布局
  12. Android嵌套滑动冲突
  13. 动手动脑(Java)
  14. java删除文件内容_java 删除文件中的数据
  15. Django框架基础知识(面试题)
  16. qq邮箱绑定重庆大学邮箱服务器,电子邮箱常见问题
  17. 这位成功转型机器学习的老炮,想把他多年的经验分享给你
  18. ajax成功后没有执行函数,ajax请求成功但不执行success-function回调函数的问题
  19. 网站浏览器可以打开,在微信中打不开,排查问题的过程
  20. autojs读取文件夹所有文件_Auto JS 文件类操作

热门文章

  1. 利用计算机实现排列组合公式,计算机算法基础 ——数学(排列组合函数)
  2. android图片花,Android中使用Canvas绘制南丁格尔玫瑰图(Nightingale rose diagram)
  3. ns手柄pc驱动_颜值、功能、手感同步在线 北通宙斯机械游戏手柄体验
  4. c语言编程基础 王森,《C语言编程基础第2版》王森版 习题答案
  5. 使用pygame实现双人五子棋游戏
  6. 遇到网站被黑,怎么解决?
  7. 生日在java中怎么写_怎样用java做个生日提醒?如果同一天有多个人过生日怎么做?...
  8. 转转品牌升级,不只换了个LOGO
  9. Oracle RAC命令
  10. c语言小熊时钟报告,C语言——小熊时钟.doc