本文主要是介绍三子棋+迷宫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
又水了一篇,嘿嘿不废话了,正文开始
文章目录
- 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)。第一个在横线、竖线或对角线上形成一条线的玩家获胜。
游戏流程解析
- 初始化棋盘:调用
initBoard()
函数,使用双重循环将棋盘的每个格子初始化为空格' '
。 - 打印棋盘:
printBoard()
函数展示棋盘当前状态,以图形方式显示,包括格子和分隔线。 - 玩家移动:
playerMove()
函数询问玩家输入行和列数字,将相应位置标记为玩家的符号(X或O)。输入验证确保所选位置未被占用且在棋盘范围内。 - 检查胜利条件:
checkWin()
函数检查是否有连成一线的情况,包括横线、竖线和两个对角线。 - 游戏结束判断:在
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.控制台迷宫
此游戏不仅包括生成迷宫和玩家导航,还引入了动态障碍和时间限制来增加挑战性噢,嘿嘿,一起来看看吧。
游戏逻辑和功能解释
这段代码组织了迷宫游戏的所有核心功能,并且通过以下各部分实现了游戏的完整流程:
-
初始化迷宫 (
initMaze
函数):创建一个MAZE_SIZE x MAZE_SIZE
的迷宫,其中边界由#
字符组成,中间为空格,标记了玩家的初始位置P
和出口位置E
。 -
初始化和移动障碍物 (
initObstacles
和moveObstacles
函数):障碍物在迷宫中随机生成,并且每次玩家输入后随机移动。障碍物移动时会检查目标位置是否为空,如果不是,它们会反弹到相反方向。 -
玩家移动 (
movePlayer
函数):玩家通过输入w
,s
,a
,d
来控制上下左右移动。该函数检查目标位置是否可行(即是否为空格或出口)并相应更新玩家位置。 -
时间限制 (
setTimer
和alarmHandler
函数):使用UNIX信号和alarm
函数设置一个实时计时器,当时间耗尽时,触发alarmHandler
函数,该函数会输出消息并终止程序。 -
游戏循环和清屏:游戏在一个持续的循环中运行,每次循环都会清屏并重新打印迷宫和剩余时间,直到玩家到达出口或时间耗尽。
迷宫游戏设计
- 迷宫生成:使用递归分割法(Recursive Division Method)生成迷宫。
- 玩家导航:允许用户通过键盘输入上(W)、下(S)、左(A)、右(D)来控制角色移动。
- 动态障碍:障碍物会在迷宫内移动,玩家需要避免接触障碍物。
- 时间限制:玩家需要在限定时间内到达终点。
核心代码实现
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;
}
如果有对你有帮助!那真的!泰酷辣
这篇关于三子棋+迷宫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!