本文介绍关于C语言的猜数字和井字棋的小游戏,以及它们的实现思路
猜数字:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
void main()
{
int answer;
srand((unsigned int)time(NULL));
int riddle = rand() % 100 + 1;
int count = 1;
bool flag = true;
printf("请输入一个1~100的数字:\n");
scanf("%d", &answer);
while (flag)
{
if (answer > riddle)
{
printf("姐姐,你猜的数字太大了,再来一次!\n");
scanf("%d", &answer);
count++;
}
else if (answer < riddle)
{
printf("姐姐,你猜的数字太小了,再来一次!\n");
scanf("%d", &answer);
count++;
}
else
{
printf("姐姐,恭喜你,猜对了!\n");
printf("你一共花了%d次猜对", count);
flag = false;
}
}
return;
}
井字棋:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 3
/**
* 打印游戏板
*
* @param board 一个二维字符数组,表示游戏板的状态
*
* 此函数通过遍历二维数组来打印游戏板的每个位置的状态
* 使用竖线 '|' 和横线 '-' 来划分游戏板的各个位置,以视觉上区分不同的游戏区域
*/
void printBoard(char board[SIZE][SIZE]) {
// 遍历游戏板的每一行
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");
}
}
int checkWin(char board[SIZE][SIZE], char player) {
for (int i = 0; i < SIZE; i++) {
// 检查每一行是否有三个相同的玩家标记
if (board[i][0] == player && board[i][1] == player && board[i][2] == player) return 1;
// 检查每一列是否有三个相同的玩家标记
if (board[0][i] == player && board[1][i] == player && board[2][i] == player) return 1;
}
// 检查对角线是否有三个相同的玩家标记
if (board[0][0] == player && board[1][1] == player && board[2][2] == player) return 1;
if (board[0][2] == player && board[1][1] == player && board[2][0] == player) return 1;
return 0;
}
/**
* 检查游戏板是否已满。
*
* @param board 游戏板,一个二维字符数组。
* @return 如果游戏板已满(即没有空位),返回1;否则返回0。
*
* 此函数通过遍历游戏板上的每个位置来确定游戏板是否已满。
* 如果找到任何一个位置为空(' '),则表明游戏板未满,返回0。
* 如果所有位置都已被占用,返回1,表示游戏板已满。
*/
int isFull(char board[SIZE][SIZE]) {
// 遍历游戏板的每一行和每一列
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
// 检查当前位置是否为空
if (board[i][j] == ' ') return 0;
}
}
// 如果没有找到空位,返回1
return 1;
}
int main() {
// 初始化空的井字棋盘
char board[SIZE][SIZE] = { {' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '} };
// 当前玩家,游戏开始时为玩家X
char currentPlayer = 'X';
// 用于存储玩家输入的行和列
int row, col;
// 游戏开始打印信息
printf("井字棋游戏\n");
printf("玩家1: X\n玩家2: O\n");
// 游戏主循环
while (1) {
// 打印当前棋盘状态
printBoard(board);
// 提示当前玩家输入移动
printf("玩家 %c, 请输入您的移动 (行和列, 1-3): ", currentPlayer);
// 接收玩家输入
if (scanf("%d %d", &row, &col) != 2) {
printf("读取输入错误。请重试。\n");
continue;
}
// 验证玩家输入是否有效
if (row < 1 || row > SIZE || col < 1 || col > SIZE || board[row-1][col-1] != ' ') {
printf("无效的移动。请重试。\n");
continue;
}
// 在棋盘上标记玩家的移动
board[row-1][col-1] = currentPlayer;
// 检查是否有玩家获胜
if (checkWin(board, currentPlayer)) {
printBoard(board);
printf("玩家 %c 获胜!\n", currentPlayer);
break;
}
// 检查棋盘是否已满,即平局情况
if (isFull(board)) {
printBoard(board);
printf("游戏平局!\n");
break;
}
// 切换下一个玩家
currentPlayer = (currentPlayer == 'X') ? 'O' : 'X';
}
return 0;
}