本文介绍关于C语言的猜数字和井字棋的小游戏,以及它们的实现思路
猜数字:
(1) 生成随机数
-
使用
srand((unsigned int)time(NULL));
初始化随机数种子,确保每次运行程序时生成的随机数不同。 -
使用
rand() % 100 + 1
生成一个1到100之间的随机数,并将其赋值给变量riddle
。
(2) 用户输入
-
使用
scanf("%d", &answer);
获取用户输入的数字,并将其存储在变量answer
中。
(3) 判断逻辑
-
使用
while
循环不断检查用户输入的数字是否与随机数riddle
相等:-
如果
answer > riddle
,提示用户“猜的数字太大了”,并让用户重新输入。 -
如果
answer < riddle
,提示用户“猜的数字太小了”,并让用户重新输入。 -
如果
answer == riddle
,提示用户“猜对了”,并输出用户猜的次数,同时结束循环。
-
(4) 统计次数
-
使用变量
count
记录用户猜的次数,每次用户输入后count++
。
(5) 结束条件
-
使用布尔变量
flag
控制循环是否继续。当用户猜对时,将flag
设置为false
,结束循环。
#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;
}
井字棋:
(1) 棋盘表示
-
使用一个
3x3
的二维字符数组board
表示棋盘。 -
初始化时,棋盘上的每个位置都是空格
' '
。
(2) 初始化棋盘
-
函数
initializeBoard
遍历棋盘,将所有位置设置为空格。
(3) 打印棋盘
-
函数
printBoard
打印当前棋盘状态。 -
使用
---
和|
绘制棋盘的分隔线,使棋盘更直观。
(4) 检查获胜条件
-
函数
checkWin
检查当前玩家是否获胜:-
检查所有行、列和两条对角线,是否有连续的三个相同棋子。
-
如果有,返回
1
(表示获胜);否则返回0
。
-
(5) 检查棋盘是否已满
-
函数
checkFull
检查棋盘是否已满(即没有空格):-
如果有空格,返回
0
;否则返回1
(表示平局)。
-
(6) 游戏主循环
-
在
main
函数中,使用while(1)
实现游戏主循环:-
打印当前棋盘。
-
提示当前玩家输入行和列。
-
检查输入是否合法(范围是否在 1~3 内,且目标位置是否为空)。
-
如果输入合法,放置当前玩家的棋子。
-
检查当前玩家是否获胜:
-
如果获胜,打印棋盘并宣布获胜者,结束游戏。
-
-
检查是否平局:
-
如果平局,打印棋盘并宣布平局,结束游戏。
-
-
切换玩家(
X
和O
交替)。
-
#include <stdio.h>
#include <stdlib.h>// 定义棋盘大小
#define SIZE 3// 初始化棋盘
void initializeBoard(char board[SIZE][SIZE])
{for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++){board[i][j] = ' ';}}
}// 打印棋盘
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("|");}if (i < SIZE - 1)printf("\n---+---+---\n");}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;
}// 检查棋盘是否已满
int checkFull(char board[SIZE][SIZE])
{// 遍历棋盘,检查是否有空格for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++){if (board[i][j] == ' ')return 0;}}return 1;
}int main()
{char board[SIZE][SIZE];char player = 'X';int row, col;// 初始化棋盘initializeBoard(board);// 游戏循环while (1){// 打印棋盘printBoard(board);// 玩家输入printf("玩家 %c,请输入行和列(1 3):", player);scanf("%d %d", &row, &col);// 检查输入是否合法if (row < 1 || row > 3 || col < 1 || col > 3 || board[row - 1][col - 1] != ' '){printf("无效输入,请重新输入。\n");continue;}// 放置棋子board[row - 1][col - 1] = player;// 检查是否获胜if (checkWin(board, player)){printBoard(board);printf("玩家 %c 获胜!\n", player);break;}// 检查是否平局if (checkFull(board)){printBoard(board);printf("平局!\n");break;}// 切换玩家player = (player == 'X') ? 'O' : 'X';}return 0;
}