1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 九宫格拼图C++源码(以面向对象的思想实现 可以输入8及8以下的任意行列数的九宫格拼

九宫格拼图C++源码(以面向对象的思想实现 可以输入8及8以下的任意行列数的九宫格拼

时间:2023-05-16 07:51:13

相关推荐

九宫格拼图C++源码(以面向对象的思想实现 可以输入8及8以下的任意行列数的九宫格拼

先来说一下本程序的亮点哈!

①不只是九宫格,可以是四宫格,也可以是16宫格,有心的小伙伴很容易发现,date数组是一个包含64个int类型的数组,所以它最多可以实现8*8的地图;

②本程序采用了一维数组去打印地图;

③取从1~8的随机数方法巧妙;(这个是浏览一些其他博客学到的一个相对简单巧妙的方法)

④包含对不成立的情况进行判断的代码,所以生成的情况都是成立的(这是采用了逆序数的一个判定条件,即从前往后看成一组数,逆序数为奇数的情况不成立,逆序数为偶数的情况都成立)

话不多说,先来看看源代码,哈哈!!

// An highlighted block#include<iostream>#include<ctime>#include<iomanip>#include<conio.h>using namespace std;class Game {private:int m_N;int date[64];public:friend int ifhave(const Game& a);//判断情况是否有解void setdate(int N);//设置初始地图void showdate();//打印地图void OnKeyboard();//通过w,s,a,d移动拼图;bool gameover();//判断游戏是否达到结束条件};void Game::setdate(int N) {m_N = N;for (int i = 0; i < m_N*m_N; i++) {date[i] = 0;}//将所有数据设置为0;int number;srand(time(0));for (int i = 1; i < N * N; i++) {number = rand() % (N * N-1);if (date[number] == 0){date[number] = i;}else{for (int j = number+1;; j++){if (j == N * N-1){j = 0;}if (date[j] == 0){date[j] = i;break;}}}}}void Game::showdate() {for (int j = 0; j < m_N; j++) {cout << "----";}cout << endl;cout << "|";for (int i = 1; i <= m_N*m_N; i++) {if (date[i-1] == 0) {cout << setw(3) << " " << "|";}else {cout << setw(3) << date[i-1] << "|";}if (i % m_N == 0) {cout << endl;for (int j = 0; j < m_N; j++) {cout << "----";}cout << endl;if (i <= m_N * m_N - 1)cout << "|";}}}void Game::OnKeyboard() {char c;int i, j;c = _getch();switch (c){case 'a'://左 case 'A':for (i = 0; i < m_N*m_N; i++){if (date[i] == 0 && i % m_N != m_N - 1){date[i] = date[i + 1];date[i + 1] = 0;break;}}break;case 'w'://上 case 'W':for (i = 0; i < m_N*m_N - m_N; i++){if (date[i] == 0){date[i] = date[i + m_N];date[i + m_N] = 0;break;}}break;case 's'://下 case 'S':for (i = m_N; i < m_N*m_N; i++){if (date[i] == 0){date[i] = date[i - m_N];date[i - m_N] = 0;break;}}break;case 'd'://右 case 'D':for (i = 0; i < m_N*m_N; i++){if (date[i] == 0 && i % m_N != 0){date[i] = date[i - 1];date[i - 1] = 0;break;}}break;}}int ifhave(const Game& a)//判断随机生成的地图是否有解 {int reverse = 0;//逆序数为奇数时无解,为偶数时有解 int i, j;for (i = 0; i < a.m_N * a.m_N - 1; i++) {if (a.date[i] == 0)continue;for (j = i + 1; j < a.m_N * a.m_N; j++){if (a.date[j] == 0)continue;if (a.date[i] != 0 && a.date[i] > a.date[j])//不是最大的数且又比后面的数字大,逆序数加1 {reverse++;}}}if (reverse % 2 == 0) //逆序数为偶数,拼图有解 {return 1;}else{return 0;}}bool Game::gameover() {int i;for (i = 0; i < m_N*m_N - 2; i++){if (date[i] > date[i + 1]){return 0;}if (date[m_N * m_N - 1] != 0) {return 0;}}return 1;}int main() {Game play;cout << "请输入您要玩的九宫格拼图长度:";int N;cin >> N;while (1) {play.setdate(N);if (ifhave(play)) {break;}}play.showdate();while (1) {play.OnKeyboard();system("CLS");play.showdate();if (play.gameover()) {cout << "恭喜您,您成功了" << endl;break;}}system("pause");return 0;}

可以先复制代码运行看一下结果,然后再详细看一下实现过程思路就比较清晰了。

大体就是这样,如果有用就留个赞,哈哈!

九宫格拼图C++源码(以面向对象的思想实现 可以输入8及8以下的任意行列数的九宫格拼图游戏)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。