C语言版,八数码小游戏实现,简单好玩

news/2025/1/8 22:04:41/

 目录

一、问题描述

二、迟来的代码

三、简单分析

一、问题描述

  1. 3*3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空。
  2. 要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态(图左)到目标状态(图右)。

二、迟来的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>#define N 3		// 阶数int src[N][N];	// 初始状态
int dest[N][N] = {1, 2, 3, 8, 0, 4, 7, 6, 5};	// 目标状态// 初始化棋盘
void init()
{int i, j, k;int a[N*N] = {1, 2, 3, 8, 0, 4, 7, 6, 5};int flag[N*N] = {0};	// 用来标记0~8中哪个数字已经出现过srand(time(0));for(i = 0; i < N; i++){for(j = 0; j < N; j++){// 尝试生成一个0~8间的数字k = rand()%(N*N);while(1){// 如果该数字未出现if(flag[k] == 0)	{flag[k] = 1;	// 修改标志位src[i][j] = a[k]; // 初始化对应src的位置break;}// 重新生成数字k = rand()%(N*N);}}	}
}// 打印棋盘状态
void display()
{int i, j;for(i = 0; i < N; i++){for(j = 0; j < N; j++){// 把0当做空格输出if(src[i][j]){printf("%d ", src[i][j]);}else{printf("  ");}}printf("\n");}
}// 寻找出棋盘中的空格键
void findSpace(int *x, int *y)
{int i, j;for(i = 0; i < N; i++){for(j = 0; j < N; j++){if(src[i][j] == 0)	// 找到空格{*x = i;*y = j;}}}
}// 空格左移
void left()
{int x, y;findSpace(&x, &y);	// 寻找空格坐标// 空格必须是处于第2列或者第3列,才能左移if(y >= 1){src[x][y] = src[x][y-1];src[x][y-1] = 0;}
}// 空格右移
void right()
{int x, y;findSpace(&x, &y);	// 寻找空格坐标// 空格必须是处于第1列或者第2列,才能右移if(y <= 1){src[x][y] = src[x][y+1];src[x][y+1] = 0;}
}// 空格上移
void up()
{int x, y;findSpace(&x, &y);	// 寻找空格坐标// 空格必须是处于第2行或者第3行,才能上移if(x >= 1){src[x][y] = src[x-1][y];src[x-1][y] = 0;}
}// 空格下移
void down()
{int x, y;findSpace(&x, &y);	// 寻找空格坐标// 空格必须是处于第1行或者第2行,才能下移if(x <= 1){src[x][y] = src[x+1][y];src[x+1][y] = 0;}
}// 检查当前棋盘状态是否为目标状态
int checkWin()
{int i, j;for(i = 0; i < N; i++){for(j = 0; j < N; j++){// 检测到有不同的就立马返回,节省时间if(src[i][j] != dest[i][j]){return 0;}	}}return 1;
}int main()
{char ch;init();printf("下面开始八数码小游戏\n");while(1){display();ch = getch();switch(ch){case 72:up();break;case 80:down();break;case 75:left();break;case 77:right();break;}system("cls");if(ch == 27){printf("你已退出\n");break;}if(checkWin()){printf("你赢了\n");break;}}return 0;
}

        运行截图:(其他例子自己举)

 

 

 

三、简单分析

        如果认真且仔细看完代码的程序猿同学,根据注释的讲解,可以说基本上可以看懂了,如果想看如果求解的可以在我的博客里找,里面包含了,广度优先搜索,深度优先搜索,等代价搜索,启发式搜索等解法,记得收藏^_^

        此外生成的初始状态可能无解,例如上述的例子,所以需要注意,这也是最刺激的地方^_^

    


http://www.ppmy.cn/news/381272.html

相关文章

【C语言】实现三字棋小游戏

文章目录 game.hgame.ctest.c 创建三个文件&#xff1a; game.h实现函数的声明 game.c实现游戏逻辑 test.c实现游戏框架 game.h #pragma once#define ROW 3 #define COL 3 #include <stdio.h> #include <stdlib.h> #include <time.h>//初始化 void InitBo…

【c苑杂坛之小游戏系列】 三子棋游戏

【c苑杂坛之边学边玩】 三子棋游戏带你初识C语言 1.游戏说明2.效果展示3.游戏代码 1.游戏说明 三子棋游戏相信大家都知道&#xff0c;在这里不去讲述游戏背景&#xff0c;对本代码实现的三子棋游戏进行一定的说明。 博友们可以复制一下代码运行游戏&#xff01; 注意文件创建哦…

【娱乐大闯关】C语言实现猜数字小游戏

文章目录 1、打印菜单2、选择器3、猜数字——核心生成随机数 4、头文件5、主函数6、执行结果 猜数字游戏规则&#xff1a; 让电脑随机生成一个数字&#xff0c;然后玩家输入所猜的数&#xff0c;再让电脑进行比较&#xff0c;若比随机数大&#xff0c;则提示&#xff1a;猜大了…

三子棋小游戏——C语言版

三子棋—c语言版本 一、问题描述二、基本思路三、操作步骤1.打印菜单2.初始化棋盘3.打印棋盘4.玩家下棋5.电脑下棋5.判断胜负 四、全部代码1.game.h2.game.c3.test.c 一、问题描述 本次三子棋小游戏代码全部由C语言实现&#xff0c;运用了C语言的二维数组&#xff0c;循环&…

C语言 三子棋小游戏

因为代码有些多&#xff0c;所以使用了头文件来方便理解。 void initial(char arr[ROW][COL],int row,int col) //初始化棋盘函数 { for(row0;row<ROW;row) {for(col0;col<COL;col){arr[row][col] ;printf("%c",arr[row][col]);if(col<COL -1)printf(&qu…

C语言初级小游戏——三子棋

目录 前言 一、游戏的设计思路 1.游戏模式 2.设计模块 二、分层说明 1.game.h文件 1.1 在此文件中&#xff0c;我们对其它需要在此游戏中实现的功能所对应的函数库进行了包含 1.2 进行符号定义 1.3 函数声明 2.game.c文件 2.1 对二维字符数组进行初始化 2.2 展示棋盘…

【C语言】三字棋小游戏详解

前言&#xff1a;今天我们来用C语言写一个三子棋小游戏&#xff0c;三子棋&#xff0c;是黑白棋的一种。三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉、一条龙、井字棋等。这里我们写的是玩家与电脑对战的一个代码&#xff0c;如果想跟朋友一起玩也可以自己稍作修…

【C语言】三子棋小游戏设计

设计思路大致如下&#xff1a; 将游戏函数与主函数分块&#xff0c;主函数需要调用另一个源文件里的游戏函数&#xff0c;则在自定的头文件里要做好声明&#xff0c;头文件如下 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #inclu…