三子棋+迷宫

2024-04-12 22:04
文章标签 三子 迷宫

本文主要是介绍三子棋+迷宫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

又水了一篇,嘿嘿不废话了,正文开始
在这里插入图片描述

文章目录

  • 1.三子棋(Tic-Tac-Toe)
    • 游戏流程解析
    • 游戏设计
    • 游戏代码实现
      • 1. 包含头文件和定义全局变量
      • 2. 初始化游戏板
      • 3. 打印游戏板
      • 4. 玩家行动
      • 5. 检查胜利条件
      • 6. 主函数
      • 下面是完整的C语言代码
  • 2.控制台迷宫
    • 游戏逻辑和功能解释
    • 迷宫游戏设计
    • 核心代码实现
      • 1. 包含头文件和定义全局变量
      • 2. 初始化迷宫
      • 3. 玩家移动
      • 4. 游戏循环和输入处理
      • 5. 迷宫打印
      • 动态障碍物
      • 6. 初始化和移动障碍物
      • 时间限制
      • 7. 添加时间限制
      • 游戏主函数
      • 完整代码

1.三子棋(Tic-Tac-Toe)

三子棋是一个双人游戏,玩家轮流在3x3的网格中放置自己的符号(通常是X和O)。第一个在横线、竖线或对角线上形成一条线的玩家获胜。

游戏流程解析

  1. 初始化棋盘:调用initBoard()函数,使用双重循环将棋盘的每个格子初始化为空格' '
  2. 打印棋盘printBoard()函数展示棋盘当前状态,以图形方式显示,包括格子和分隔线。
  3. 玩家移动playerMove()函数询问玩家输入行和列数字,将相应位置标记为玩家的符号(X或O)。输入验证确保所选位置未被占用且在棋盘范围内。
  4. 检查胜利条件checkWin()函数检查是否有连成一线的情况,包括横线、竖线和两个对角线。
  5. 游戏结束判断:在main()函数的循环中,每次玩家操作后都会检查是否有玩家胜出或所有格子都已填满(即平局)。

游戏设计

三子棋的游戏板是一个3x3的矩阵,我们将使用一个二维数组来表示。玩家将通过选择行和列来放置他们的标记。

游戏代码实现

1. 包含头文件和定义全局变量

#include <stdio.h>
#include <stdlib.h>#define SIZE 3char board[SIZE][SIZE];  // 游戏板

2. 初始化游戏板

void initBoard() 
{for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {board[i][j] = ' ';}}
}

3. 打印游戏板

void printBoard() {for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++) {printf(" %c ", board[i][j]);if (j < SIZE - 1) {printf("|");}}printf("\n");if (i < SIZE - 1){printf("---+---+---\n");}}
}

4. 玩家行动

void playerMove(char symbol){int x, y;do{printf("Enter row and column for %c: ", symbol);scanf("%d%d", &x, &y);x--; y--;  // 将用户输入调整为基于0的索引} while (x < 0 || x >= SIZE || y < 0 || y >= SIZE || board[x][y] != ' ');board[x][y] = symbol;
}

5. 检查胜利条件

int checkWin() 
{for (int i = 0; i < SIZE; i++) {// 检查行if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {return 1;}// 检查列if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {return 1;}}// 检查对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {return 1;}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){return 1;}return 0;
}

6. 主函数

int main() 
{initBoard();int turn = 0;  // 0代表X, 1代表Oint won = 0;while (!won) {printBoard();playerMove(turn % 2 == 0 ? 'X' : 'O');won = checkWin();turn++;if (turn == SIZE * SIZE && !won) {printf("The game is a draw.\n");break;}}printBoard();if (won) {printf("Congratulations! Player %c wins!\n", turn % 2 == 1 ? 'X' : 'O');} else {printf("The game is a draw.\n");}return 0;
}

下面是完整的C语言代码

#include <stdio.h>#define SIZE 3char board[SIZE][SIZE];void initBoard() 
{for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {board[i][j] = ' ';}}
}void printBoard() 
{for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++) {printf(" %c ", board[i][j]);if (j < SIZE - 1){printf("|");}}printf("\n");if (i < SIZE - 1) {printf("---+---+---\n");}}
}void playerMove(char symbol) 
{int x, y;do{printf("Enter row and column for %c (e.g., 1 1 for top-left): ", symbol);scanf("%d%d", &x, &y);x--; y--;  // 将用户输入调整为基于0的索引} while (x < 0 || x >= SIZE || y < 0 || y >= SIZE || board[x][y] != ' ');board[x][y] = symbol;
}int checkWin() 
{// Check rows and columnsfor (int i = 0; i < SIZE; i++) {if ((board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') ||(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')) {return 1;  // There's a win}}// Check diagonalsif ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') ||(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')) {return 1;  // There's a win}return 0;  // No win yet
}int main() 
{initBoard();int turn = 0;int won = 0;while (!won && turn < SIZE * SIZE) {printBoard();playerMove(turn % 2 == 0 ? 'X' : 'O');won = checkWin();turn++;}printBoard(); // Print the final state of the boardif (won) {printf("Congratulations! Player %c wins!\n", turn % 2 == 1 ? 'X' : 'O');}else{printf("The game is a draw.\n");}return 0;
}

2.控制台迷宫

此游戏不仅包括生成迷宫和玩家导航,还引入了动态障碍和时间限制来增加挑战性噢,嘿嘿,一起来看看吧。

游戏逻辑和功能解释

这段代码组织了迷宫游戏的所有核心功能,并且通过以下各部分实现了游戏的完整流程:

  1. 初始化迷宫 (initMaze函数):创建一个MAZE_SIZE x MAZE_SIZE的迷宫,其中边界由#字符组成,中间为空格,标记了玩家的初始位置P和出口位置E

  2. 初始化和移动障碍物 (initObstaclesmoveObstacles函数):障碍物在迷宫中随机生成,并且每次玩家输入后随机移动。障碍物移动时会检查目标位置是否为空,如果不是,它们会反弹到相反方向。

  3. 玩家移动 (movePlayer函数):玩家通过输入w, s, a, d来控制上下左右移动。该函数检查目标位置是否可行(即是否为空格或出口)并相应更新玩家位置。

  4. 时间限制 (setTimeralarmHandler函数):使用UNIX信号和alarm函数设置一个实时计时器,当时间耗尽时,触发alarmHandler函数,该函数会输出消息并终止程序。

  5. 游戏循环和清屏:游戏在一个持续的循环中运行,每次循环都会清屏并重新打印迷宫和剩余时间,直到玩家到达出口或时间耗尽。

迷宫游戏设计

  1. 迷宫生成:使用递归分割法(Recursive Division Method)生成迷宫。
  2. 玩家导航:允许用户通过键盘输入上(W)、下(S)、左(A)、右(D)来控制角色移动。
  3. 动态障碍:障碍物会在迷宫内移动,玩家需要避免接触障碍物。
  4. 时间限制:玩家需要在限定时间内到达终点。

核心代码实现

1. 包含头文件和定义全局变量

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <unistd.h>#define MAZE_SIZE 20
#define OBSTACLE_COUNT 5char maze[MAZE_SIZE][MAZE_SIZE];
int playerPosition[2] = {1, 1}; // [y, x]
int exitPosition[2] = {MAZE_SIZE - 2, MAZE_SIZE - 2}; // [y, x]

2. 初始化迷宫

void initMaze(){for (int y = 0; y < MAZE_SIZE; y++) {for (int x = 0; x < MAZE_SIZE; x++) {if (y == 0 || y == MAZE_SIZE - 1 || x == 0 || x == MAZE_SIZE - 1) {maze[y][x] = '#'; // 边界} else {maze[y][x] = ' '; // 可走路径}}}maze[playerPosition[0]][playerPosition[1]] = 'P'; // 玩家位置maze[exitPosition[0]][exitPosition[1]] = 'E'; // 出口位置
}

3. 玩家移动

void movePlayer(char direction)
{int dx = 0, dy = 0;switch (direction) {case 'W': case 'w': dy = -1; break;case 'S': case 's': dy = 1; break;case 'A': case 'a': dx = -1; break;case 'D': case 'd': dx = 1; break;}int newY = playerPosition[0] + dy;int newX = playerPosition[1] + dx;if (maze[newY][newX] == ' ' || maze[newY][newX] == 'E'){maze[playerPosition[0]][playerPosition[1]] = ' ';playerPosition[0] = newY;playerPosition[1] = newX;maze[playerPosition[0]][playerPosition[1]] = 'P';}
}

4. 游戏循环和输入处理

void gameLoop() 
{char input;bool gameRunning = true;while (gameRunning) {system("clear"); // 清屏printMaze();scanf(" %c", &input); // 获取玩家输入movePlayer(input);// 检查是否到达出口if (playerPosition[0] == exitPosition[0] && playerPosition[1] == exitPosition[1]) {printf("Congratulations, you've reached the exit!\n");gameRunning = false;}}
}

5. 迷宫打印

void printMaze(){for(int y = 0; y < MAZE_SIZE; y++) {for (int x = 0; x < MAZE_SIZE; x++) {printf("%c ", maze[y][x]);}printf("\n");}
}

动态障碍物

为了增加游戏的挑战性,我们将在迷宫中添加动态障碍物,这些障碍物会在每个时间步随机移动,如果玩家与障碍物相遇,则游戏结束。

6. 初始化和移动障碍物

typedef struct{int y, x;int dy, dx;
}Obstacle;Obstacle obstacles[OBSTACLE_COUNT];void initObstacles(){srand(time(NULL)); // 为随机数生成初始化种子for (int i = 0; i < OBSTACLE_COUNT; i++){obstacles[i].x = 2 + rand() % (MAZE_SIZE - 4);obstacles[i].y = 2 + rand() % (MAZE_SIZE - 4);obstacles[i].dx = (rand() % 3) - 1; // 随机方向 -1, 0, 1obstacles[i].dy = (rand() % 3) - 1;maze[obstacles[i].y][obstacles[i].x] = 'O'; // 在迷宫中标记障碍物位置}
}void moveObstacles() 
{for (int i = 0; i < OBSTACLE_COUNT; i++){int newY = obstacles[i].y + obstacles[i].dy;int newX = obstacles[i].x + obstacles[i].dx;if (newY > 0 && newY < MAZE_SIZE - 1 && newX > 0 && newX < MAZE_SIZE - 1 && maze[newY][newX] == ' ') {maze[obstacles[i].y][obstacles[i].x] = ' '; // 清除旧位置obstacles[i].y = newY;obstacles[i].x = newX;maze[obstacles[i].y][obstacles[i].x] = 'O'; // 标记新位置} else{ // 如果障碍物撞墙,则改变方向obstacles[i].dx = -obstacles[i].dx;obstacles[i].dy = -obstacles[i].dy;}}
}

时间限制

为了增加游戏的紧迫感,我们可以设置一个时间限制。如果玩家在规定时间内未能到达出口,则游戏失败。

7. 添加时间限制

#include <signal.h>
#include <unistd.h>int timeLimit = 30; // 时间限制30秒void alarmHandler(int sig){printf("Time's up! You didn't make it to the exit.\n");exit(0); // 直接退出程序
}void setTimer(
) {signal(SIGALRM, alarmHandler);alarm(timeLimit); // 设置定时器
}

游戏主函数

将所有的功能整合到主函数中,开始游戏循环。

int main() {initMaze();initObstacles();setTimer();gameLoop();return 0;
}

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <unistd.h>
#include <signal.h>#define MAZE_SIZE 20
#define OBSTACLE_COUNT 5char maze[MAZE_SIZE][MAZE_SIZE];
int playerPosition[2] = {1, 1}; // [y, x]
int exitPosition[2] = {MAZE_SIZE - 2, MAZE_SIZE - 2}; // [y, x]
int timeLimit = 30; // 时间限制30秒typedef struct{int y, x;int dy, dx;
} Obstacle;Obstacle obstacles[OBSTACLE_COUNT];void printMaze() 
{for (int y = 0; y < MAZE_SIZE; y++) {for (int x = 0; x < MAZE_SIZE; x++){printf("%c ", maze[y][x]);}printf("\n");}printf("\n");
}void initMaze() 
{for (int y = 0; y < MAZE_SIZE; y++) {for (int x = 0; x < MAZE_SIZE; x++) {maze[y][x] = (y == 0 || y == MAZE_SIZE - 1 || x == 0 || x == MAZE_SIZE - 1) ? '#' : ' ';}}maze[playerPosition[0]][playerPosition[1]] = 'P';maze[exitPosition[0]][exitPosition[1]] = 'E';
}void initObstacles() 
{srand(time(NULL));for (int i = 0; i < OBSTACLE_COUNT; i++) {obstacles[i].x = 2 + rand() % (MAZE_SIZE - 4);obstacles[i].y = 2 + rand() % (MAZE_SIZE - 4);obstacles[i].dx = (rand() % 3) - 1;obstacles[i].dy = (rand() % 3) - 1;maze[obstacles[i].y][obstacles[i].x] = 'O';}
}void moveObstacles() 
{for (int i = 0; i < OBSTACLE_COUNT; i++){int newY = obstacles[i].y + obstacles[i].dy;int newX = obstacles[i].x + obstacles[i].dx;if (newY > 0 && newY < MAZE_SIZE - 1 && newX > 0 && newX < MAZE_SIZE - 1 && maze[newY][newX] == ' '){maze[obstacles[i].y][obstacles[i].x] = ' ';obstacles[i].y = newY;obstacles[i].x = newX;maze[obstacles[i].y][obstacles[i].x] = 'O';} else {obstacles[i].dx = -obstacles[i].dx;obstacles[i].dy = -obstacles[i].dy;}}
}void movePlayer(char direction){int dx = 0, dy = 0;switch (direction) {case 'w': dy = -1; break;case 's': dy = 1; break;case 'a': dx = -1; break;case 'd': dx = 1; break;}int newY = playerPosition[0] + dy;int newX = playerPosition[1] + dx;if (maze[newY][newX] == ' ' || maze[newY][newX] == 'E') {maze[playerPosition[0]][playerPosition[1]] = ' ';playerPosition[0] = newY;playerPosition[1] = newX;maze[newY][newX] = 'P';}
}void alarmHandler(int sig){printf("Time's up! You didn't make it to the exit.\n");exit(0);
}void setTimer() 
{signal(SIGALRM, alarmHandler);alarm(timeLimit);
}int main() 
{initMaze();initObstacles();setTimer();char input;bool gameRunning = true;while (gameRunning) {system("clear"); // 在Windows下使用clsprintMaze();printf("Use 'w', 's', 'a', 'd' to move. You have %d seconds left.\n", timeLimit);scanf(" %c", &input);movePlayer(input);moveObstacles();// Check if player reached the exitif (playerPosition[0] == exitPosition[0] && playerPosition[1] == exitPosition[1]) {printf("Congratulations, you've reached the exit!\n");gameRunning = false;}}return 0;
}

在这里插入图片描述
如果有对你有帮助!那真的!泰酷辣

这篇关于三子棋+迷宫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898365

相关文章

nyoj306(走迷宫)

走迷宫 时间限制: 1000 ms  |  内存限制: 65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。 这个迷宫可以向上走,向

《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

 示例:基于抽象工厂的迷宫   实现:     如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类

走迷宫变体【拼多多1面0905】

题目大致描述: 有一个N*M的迷宫,主角被放在随机的位置上,给你一个函数,控制主角逃离迷宫。 可以使用的函数:int move(String direction) (//direction代表上下左右四个方向,分别是“U"、“D"、“L"、“R"//返回值有3种,包括-1、0、1;-1表示前面是陷阱或墙,主角不能往前走,会留在原地;0表示迷宫出口,恭喜成功逃离;1表示前面可以走,主角前进一格)

FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)

解题报告 http://blog.csdn.net/juncoder/article/details/38146041 题目传送门 题意 求最短路和最短路的路数。 思路: BFS+DFS,先求出最短路。在DFS搜等于最短路的条数。 不加优化SDUTOJ过了,数据就是水。 确定了最短路的长度,加上奇偶剪枝FOJ也过了。 #include <queue>#include <c

A*算法解决迷宫寻路问题

A*算法解决迷宫寻路问题 问题描述 下图是一个迷宫,试为机器人找一条从Start到End的最短路径设计一搜索算法 设计思路 a)状态空间的表示 首先将迷宫图转换为列表形式呈现,每个格子用 (横坐标,纵坐标,上通路状态,下通路状态,左通路状态,右通路状态)来表示,通路状态用1或0表示,可通过为1,不可通过为0。比如起点(1,1),假定不能从起点出去,所以(1,1)可以走下或走右,所以第一格

两种迷宫生成算法

这里要介绍两种迷宫生成的算法,Recursive Backtracking和Eller’s Algorithm。它们都生成的是Perfect maze,也就是说每个区域都连通,并且没有环的迷宫。 我们现在说Recursive backtracking: 迷宫的初始状态是墙壁都存在。选择一个开始区域。 随机得选择一个没有访问过的邻接区域,并打通与它之间的墙壁。此邻接区域称为当前区域。

深度优先遍历之迷宫生成算法

1、图的深度优先遍历简介     例如,要遍历上面这个图  采取深度优先算法(从1开始)  准备一个Stack s,预定义三种状态:A未被访问 B正准备访问 C已经访问  一、访问1,把它标记为已经访问,然后将于它相邻的并且标记为未被访问的点压入s 中并标记为正准备访问  此时系统状态:  已经被访问的点:1  还没有被访问的点:3 4

HDU1269 迷宫城堡 (强连通图判定)

题意:判定给出的有向图是不是强连通图 Tarjan算法模板题目 #include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue

【并查集】 HDU 1272 小希的迷宫

HDU 1272 小希的迷宫 需要判断是否是连通图。 #include <iostream>#include <string>#include <algorithm>#include <math.h>#include <stdio.h>#include <cstring>#include <stdlib.h>using namespace std;int father[100

[BFS广度优先搜索] 迷宫

描述 给定一个仅由数字 0 与 1 组成的 n 行 m 列的迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的任意一格 1 上;同样地,若你位于一格 1 上, 那么你可以移动到相邻 4 格中的任意一格 0 上。 现在,有 q 次询问。每次询问从给定的某一格 (第 x 行,第 y 列,均从 0 开始标号) 开始,在规则内任意移动。这样,有一些格子是可能到达的,而其余格子是无法到达的