又水了一篇,嘿嘿不废话了,正文开始
文章目录
- 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 3
char 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代表O
int 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 3
char 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 columns
for (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 diagonals
if ((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 board
if (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 5
char 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, 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;
}
}
}
时间限制
为了增加游戏的紧迫感,我们可以设置一个时间限制。如果玩家在规定时间内未能到达出口,则游戏失败。
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 5
char 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下使用cls
printM
aze();
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 exit
if (playerPosition[0] == exitPosition[0] && playerPosition[1] == exitPosition[1])
{
printf("Congratulations, you've reached the exit!\n");
gameRunning = false;
}
}
return 0;
}
如果有对你有帮助!那真的!泰酷辣