C++项目实战-小游戏-连连看(CUI)
来源:互联网 发布:淘宝如何免费上传视频 编辑:程序博客网 时间:2024/05/16 09:06
简介
最近在学可视化程序设计,选定的项目是做一个小游戏——连连看,本篇主要整理下该游戏的控制台窗口实现过程。
程序框架
main.cpp//整个程序的入口gamedata.h//管理游戏数据gamedata.cppgameview.h//管理游戏界面gameview.cppgamerule.h//管理游戏规则gamerule.cpp
因为实现过程比较简单,只贴出最终代码
main.cpp
#include <cstdlib>#include <iostream>#include "gamedata.h"#include "gameview.h"#include "gamerule.h"using namespace std;int main(int argc, char *argv[]){ //生成游戏数据 GameData data; data.initData(); //循环 int x1,y1,x2,y2; while(true) { //显示游戏界面 GameView view; view.display(); //用户输入坐标 for(int j=0; j<(80-4*COL)/2; ++j) { cout<<" "; } cout<<"请输入要消除的坐标(x1 y1 x2 y2):"; cin>>x1>>y1>>x2>>y2; //判断能否消除,如果可以,消除之 GameRule rule; if( rule.canClear(x1,y1,x2,y2) ) { gameData[y1][x1] = 0; gameData[y2][x2] = 0; } } system("PAUSE"); return EXIT_SUCCESS;}
class GameView{public: /*************************************************************** *函数名:displayTitle *用 途:显示游戏标题 *参 数:无 *返回值:无 ****************************************************************/ void displayTitle(); /*************************************************************** *函数名:display *用 途:显示游戏界面 *参 数:无 *返回值:无 ****************************************************************/ void display(); };
gameview.cpp
#include "gameview.h"#include <iostream>#include "gamedata.h"using namespace std;void GameView::displayTitle(){ cout<<" ***********************************"<<endl; cout<<" * 连连看游戏 ver0.1.0 *"<<endl; cout<<" * *"<<endl; cout<<" * UI设计 :赖炜 *"<<endl; cout<<" * *"<<endl; cout<<" ***********************************"<<endl; cout<<endl; }void GameView::display(){ system("cls"); //执行系统清屏命令 displayTitle(); for(int i=0; i<ROW; ++i) { for(int j=0; j<(80-4*COL)/2; ++j) { cout<<" "; } for(int j=0; j<COL; ++j) { //如果数字为0,说明已经消除,输出空格代替 if(gameData[i][j]==0) { cout<<" "; } else { //cout<<gameData[i][j]; printf("%4d",gameData[i][j]); } } cout<<endl; }}
gamedata.h
const int ROW = 4; //游戏界面总行数 const int COL = 4; //游戏界面总列数 extern int gameData[ROW][COL];class GameData{ public: /*************************************************************** *函数名:initData *用 途:初始化游戏数据,存入数组。确保数字成对出现,顺序混乱 *参 数:无 *返回值:无 ****************************************************************/ void initData();};
#include "gamedata.h"#include <cstdlib>#include <iostream>int gameData[ROW][COL];void GameData::initData(){ //成对产生数据 int number = 0; for(int i=0; i<ROW; ++i) { for(int j=0; j<COL; ++j) { gameData[i][j] = number/2+1; ++number; } } //打乱顺序 srand(time(NULL)); //使用当前系统时间作为随机数种子 for(int i=0; i<ROW*COL/2; ++i) { //随机得到两个数的坐标 int x1 = rand()%COL; int y1 = rand()%ROW; int x2 = rand()%COL; int y2 = rand()%ROW; int temp = gameData[y1][x1]; gameData[y1][x1] = gameData[y2][x2]; gameData[y2][x2] = temp; }}
gamerule.h
class GameRule{private: /*************************************************************** *函数名:connect0 *用 途:判断给定的两个坐标处的数能否不转变连通 *参 数:int x1 - 第一个数的横坐标 * int y1 - 第一个数的纵坐标 * int x2 - 第二个数的横坐标 * int y2 - 第二个数的纵坐标 *返回值:如果可以不转变连通,返回true;否则返回false ****************************************************************/ bool connect0(int x1, int y1, int x2, int y2); /*************************************************************** *函数名:connect1 *用 途:判断给定的两个坐标处的数能否不转变连通 *参 数:int x1 - 第一个数的横坐标 * int y1 - 第一个数的纵坐标 * int x2 - 第二个数的横坐标 * int y2 - 第二个数的纵坐标 *返回值:如果可以不转变连通,返回true;否则返回false ****************************************************************/ bool connect1(int x1, int y1, int x2, int y2);public: /*************************************************************** *函数名:canClear *用 途:判断给定的两个坐标处的数能否消除 *参 数:int x1 - 第一个数的横坐标 * int y1 - 第一个数的纵坐标 * int x2 - 第二个数的横坐标 * int y2 - 第二个数的纵坐标 *返回值:如果可以消,返回true;否则返回false ****************************************************************/ bool canClear(int x1, int y1, int x2, int y2);};
gamerule.cpp
#include "gamerule.h"#include "gamedata.h"bool GameRule::canClear(int x1, int y1, int x2, int y2){ //如果两次选择的坐标相同,不能消 if( x1 == x2 && y1 == y2 ) { return false; } //如果两个数字不一样,不能消 if(gameData[y1][x1]!=gameData[y2][x2]) { return false; } //如果可以不转弯连通 if( connect0(x1,y1,x2,y2) ) { return true; } //如果可以转一次弯连通 if( connect1(x1,y1,x2,y2) ) { return true; } return false;} bool GameRule::connect0(int x1, int y1, int x2, int y2){ //如果在同一行 if(y1 == y2) { int y = y1; //循环遍历中间所有数的坐标,累加 int sum = 0; //确保x1一定小于x2 if(x1>x2) { int temp = x1; x1 = x2; x2 = temp; } for(int x=x1+1; x<x2; ++x) { sum += gameData[y][x]; } if(0==sum) //说明中间所有数都为0 { return true; } } //如果在同一列 if(x1 == x2) { int x = x1; //循环遍历中间所有数的坐标,累加 int sum = 0; //确保y1一定小于y2 if(y1>y2) { int temp = y1; y1 = y2; y2 = temp; } for(int y=y1+1; y<y2; ++y) { sum += gameData[y][x]; } if(0==sum) //说明中间所有数都为0 { return true; } } return false; }bool GameRule::connect1(int x1, int y1, int x2, int y2){ //通过x2,y1转 // (x1,y1)~(x2,y1) && (x2,y1)~(x2,y2) && (x2,y1)==0 if(connect0(x1,y1,x2,y1) && connect0(x2,y1,x2,y2) && gameData[y1][x2]==0 ) { return true; } //通过x1,y2转 if(connect0(x1,y1,x1,y2) && connect0(x1,y2,x2,y2) && gameData[y2][x1]==0) { return true; } return false;}
0 0
- C++项目实战-小游戏-连连看(CUI)
- JavaScript连连看小游戏
- 自制连连看小游戏
- 连连看小游戏
- 连连看小游戏
- 小游戏-连连看
- 连连看小游戏,递归问题
- QT PySide 连连看小游戏
- Qt小游戏开发:连连看
- MFC 小游戏之连连看
- ubuntu下的 连连看小游戏
- 连连看小游戏java源代码(1)
- 图的应用---知行合一,连连看小游戏
- 用cocos2d-x 编写连连看小游戏
- 用JAVA编写小游戏连连看
- 基于Qt的连连看小游戏
- 连连看——C++简单小游戏
- xcode8 疯狂ios讲义 连连看小游戏
- 简单的build.xml
- GPRS模块SIM9001发送短信(发送长短信),包括PDU和text两种模式
- Qt 调用外部exe的方法
- 关于字符串转换日期的问题
- 当迷茫在大学泛滥成灾
- C++项目实战-小游戏-连连看(CUI)
- t-sql中pivot用法(行列转换)
- 《登岳阳楼》 杜甫
- 能很大程度减轻很多Web前端工程师的思想负担
- Javascript 闭包与作用域
- >>关于MVC与三层架构(转自ProLiuzt以方便以后查阅)
- Qt Meta-Object System
- sql with as 用法
- 20个神奇的jQuery插件和100个多优秀的jQuery资源