时间:2021-05-20
用C语言实现简单的控制台三子棋游戏
首先,确定一局游戏的基本流程:
1、创建棋盘并初始化。(将棋盘看作一个二维数组)
2、打印显示出棋盘。
3、玩家落子(玩家通过输入行列坐标的方式来落子)。
4、判定胜负关系。(如果玩家胜出,则退出游戏。)
5、电脑落子(随机位置落子) 。
6、判定胜负关系(如果电脑胜出,退出游戏。否则,回到步骤 2 继续执行。)
第一步,此处通过构造menu()函数搭建一个简单的交互菜单和玩家交互,用来判断是否开始进行一局游戏。
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int menu() { printf("====================\n"); printf("1.开始游戏\n"); printf("0.结束游戏\n"); printf("====================\n"); printf(" 请输入您的选择: "); int choice = 0; scanf("%d", &choice); return choice;}int main() { while (1) { int choice = menu(); if (choice == 1) { //game();//此处调用了一个game函数。 } else if (choice == 0) { printf("goodbye!\n"); break; } } system("pause"); return 0;}第二步,对第一步中调用的game()函数进行构造。game()函数为核心功能函数,其主要任务是完成基本流程。
1.构建初始化init()函数。初始化一个3*3的二维数组,将它当做棋盘,并将数组元素全部初始化为0。
void init(char chessBoard[MAX_ROW][MAX_COL]) { // 把数组中的每个元素都设=初始化为“空格”。 for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { chessBoard[row][col] = ' '; } }}2.构建棋盘打印printChessBoard()函数。运用for循环打印出3*3的棋盘。
void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]) { //把棋盘打印出来。 printf("+---+---+---+\n"); for (int row = 0; row < MAX_ROW; row++) { printf("| %c | %c | %c |\n", chessBoard[row][0], chessBoard[row][1], chessBoard[row][2]); printf("+---+---+---+\n"); }}3.构建玩家落子playerMove()函数,玩家通过输入行列坐标的方式来落子。此过程中需要判断:1.玩家输入的行列坐标是否在棋盘的合理位置。2.玩家输入的行列坐标位置是否已经有棋子。
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) { // 让玩家落子. 通过控制台输入行列坐标的方式来实现。 while (1) { printf(" 请玩家输入坐标(row col): "); int row = 0; int col = 0; scanf("%d %d", &row, &col); // 校验玩家输入的坐标是否合法(是否在棋盘合理范围内)。 if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) { // 若出现非法情况,此时应该让玩家重新输入。 printf("您的坐标不在合法范围[0, 2]内 \n"); continue; } // 校验玩家落子位置是否已经有子了。 if (chessBoard[row][col] != ' ') { printf("您的坐标位置已经有子了!\n"); continue; } // 真正落子。用“X”表示玩家落子。 chessBoard[row][col] = 'x'; break; }}4.构建一个computerMove()函数来控制电脑落子。通过电脑产生一系列随机数来控制棋子落在棋盘坐标范围内。
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) { // 电脑落子,让电脑随机产生一组行列坐标。 while (1) { int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (chessBoard[row][col] != ' ') { // 需要保证随机数不能是已经有棋子的位置。 continue; } chessBoard[row][col] = 'o'; break; }}在该函数模块中,电脑落子随机位置的生成通过rand()函数控制,需要注意的是,我们需要通过设置随机种子来避免“伪随机”的出现。
srand((unsigned int)time(0));//以当前时间戳作为随机种子。5.构建isWin()函数判断是否胜利。此处人为约定该函数的返回结果的含义: ‘x' 表示玩家获胜。‘o' 表示电脑获胜。 ' ' 表示胜负未分。 ‘q' 表示和棋。
char isWin(char chessBoard[MAX_ROW][MAX_COL]) { // 判定所有的行。 for (int row = 0; row < MAX_ROW; row++) { if (chessBoard[row][0] != ' ' && chessBoard[row][0] == chessBoard[row][1] && chessBoard[row][0] == chessBoard[row][2]) { return chessBoard[row][0]; } } // 判定所有的列。 for (int col = 0; col < MAX_COL; col++) { if (chessBoard[0][col] != ' ' && chessBoard[0][col] == chessBoard[1][col] && chessBoard[0][col] == chessBoard[2][col]) { return chessBoard[0][col]; } } // 判定两个对角线。 if (chessBoard[0][0] != ' ' && chessBoard[0][0] == chessBoard[1][1] && chessBoard[0][0] == chessBoard[2][2]) { return chessBoard[0][0]; } if (chessBoard[2][0] != ' ' && chessBoard[2][0] == chessBoard[1][1] && chessBoard[2][0] == chessBoard[0][2]) { return chessBoard[2][0]; } // 判定是否和棋。看棋盘中是否有剩余空间。 //调用了isFull函数。 if (isFull(chessBoard)) { return 'q'; } return ' ';}6.构造isFull()函数用来判断棋盘中是否有剩余空间供玩家落子,以便判断是否是和棋。
int isFull(char chessBoard[MAX_ROW][MAX_COL]) { // 找”空格“. 如果找不到, 说明棋盘满了。 for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (chessBoard[row][col] == ' ') { // 如果找到“空格”说明棋盘没满。 return 0; } } } return 1;}最后,根据组合调用上面的几个功能函数,我们可以获得最终的game()函数的整体架构。
void game() { // 1. 创建棋盘并初始化 char chessBoard[MAX_ROW][MAX_COL] = { 0 }; init(chessBoard);//调用初始化函数 char winner = ' '; while (1) { // 2. 打印棋盘 printChessBoard(chessBoard); // 3. 玩家落子(玩家输入行列坐标的方式来落子) playerMove(chessBoard); // 4. 判定胜负关系 winner = isWin(chessBoard); if (winner != ' ') { break; } // 5. 电脑落子(随机位置落子) computerMove(chessBoard); // 6. 判定胜负关系 winner = isWin(chessBoard); if (winner != ' ') { break; } } printChessBoard(chessBoard); if (winner == 'x') { printf("恭喜您, 您赢了!\n"); } else if (winner == 'o') { printf("很遗憾, 您输了!再接再厉!\n"); } else { printf("您棋逢对手,这一局是平局!\n"); }}运行截图如下:
胜利啦!
失败了!
此处有棋子!
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
JavaScript经典游戏 玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下游戏介绍:使用C语言中二维数组和函数的基本知识实现一个三子棋游戏,这个游戏要实现
本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下创建文件只要弄清了二维数组的相关知识,我们就可以去实现简单的三子棋。对于初学者可
三子棋、五子棋之类的游戏,非常简单,对于初学者来说是一个不错的练手的小项目,以前用C语言写过三子棋游戏。最近在看C++,所以就想到在三子棋的基础上利用C++语言
本文实例为大家分享了C语言三子棋小游戏的具体代码,供大家参考,具体内容如下一.介绍:运用C语言的数组等相关知识:实现一个简易的三子棋小游戏:三子棋小游戏的大概内
一、问题描述用c语言实现三子棋。二、基本流程在写三子棋的代码之前,我们来看看实现这个游戏的逻辑:1.菜单界面选择开始或者退出游戏。2.创建棋盘并初始化。3.打印