C语言实现三子棋小游戏

网友投稿 601 2022-05-28

游戏介绍:

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。

那我们如何实现这个游戏呢?

我们首先要捋清楚我们要实现什么:

1、先初始化棋盘,把未打印的数字置为空格。

void InitBoard(char board[ROW][COL], int row, int col);

2、打印棋盘。

void DisplayBoard(char board[ROW][COL], int row, int col)

3、实现玩家下棋过程。

void PlayerMove(char board[ROW][COL], int row, int col);

4、实现电脑下棋过程。

void ComputerMove(char board[ROW][COL], int row, int col);

5、判断输赢

char IsWin(char board[ROW][COL], int row, int col);

在这里用返回值来确定输赢。

判断游戏输赢

要返回四种不同的状态

玩家赢 – ‘*’

电脑赢 – ‘#’

平局 – ‘Q’

继续 – ‘C’

主要过程分析:

打印棋盘:

棋盘拆成每一行:###|###|### 和—|---|— (#代表空格)

只要在最后一列中不打印‘|’就可以。在可以通过if判断语句来实现if(j

在第0列和第一列打印。

void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { //打印数据 int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) //控制最后一列不打印‘|’ { printf("|"); } } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) //控制最后一列不打印‘|’ { printf("|"); } } } printf("\n"); } } 打印效果: | | ---|---|--- | | ---|---|--- | |

实现玩家下棋:

1、在这里通过x-1、y-1就可以以常规识别坐标的方式来选择坐标。

2、if (board[x - 1][y - 1] == ' ')

判断在棋盘内可以落子的地方条件。只要选择的位置为空,就说明这个地方没有被占用,可以下在这个地方。

3、if (x >= 1 && x <= row && y >= 1 && y <= col)

判断选择的范围是否在棋盘内。

void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家走:>\n"); int x = 0; int y = 0; while (1) { printf("请输入坐标:>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) //判断可以落子在棋盘内的条件 { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } }

实现电脑下棋:

C语言实现三子棋小游戏

x = rand() % row; //随机产生0~2的数字 y = rand() % col; //随机产生0~2的数字

首先让电脑随机产生随机值,由于row和col都是3,那么产生的数字%3就可以得到0~2的随机数。

void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; //随机产生0~2的数字 y = rand() % col; //随机产生0~2的数字 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }

下棋过程:

分析这块代码逻辑:

PlayerMove(board, ROW, COL); //实现玩家下棋 DisplayBoard(board, ROW, COL); //打印棋盘,方便看到每次下棋后的结果 ret = IsWin(board, ROW, COL); //每次下完棋后要分析接下来能否继续下棋 if (ret != 'C') { break; } ComputerMove(board, ROW, COL); //实现电脑下棋 DisplayBoard(board, ROW, COL); //打印棋盘,方便看到每次下棋后的结果 ret = IsWin(board, ROW, COL); // //每次下完棋后要分析接下来能否继续下棋 if (ret != 'C') { break; } char ret = 0; while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else { printf("平局\n"); } }

主函数控制过程:

srand( (unsigned int)time(NULL) ); //和之前的rand函数搭配使用,生成时间戳。要在循环外使用,防止时间戳被不停地改变, 之后形成的数字将不在随机。 int main() { int input = 0; srand( (unsigned int)time(NULL) ); do { menu(); //菜单的打印,方便选择 printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("选择错误"); break; } } while (input); return 0; }

game.h

#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include #include #include #define ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col); //电脑下棋 void ComputerMove(char board[ROW][COL], int row, int col); //判断游戏输赢 //要返回四种不同的状态 //玩家赢 -- '*' //电脑赢 -- '#' //平局 -- 'Q' //继续 -- 'C' char IsWin(char board[ROW][COL], int row, int col);

game.c

#include "game.h" void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } } void DisplayBoard(char board[ROW][COL], int row, int col) { //int i = 0; //for (i = 0; i < row; i++) //{ // int j = 0; // for (j = 0; j < col; j++) // { // printf("%c", board[i][j]); // } // printf("\n"); //} //int i = 0; //for (i = 0;i < row; i++) //{ // //打印数据 // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[2]); //} 打印分割行 //if (i < row - 1) //{ // printf("---|---|---\n"); //} int i = 0; for (i = 0; i < row; i++) { //打印数据 int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } } printf("\n"); } } void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家走:>\n"); int x = 0; int y = 0; while (1) { printf("请输入坐标:>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; //随机产生0~2的数字 y = rand() % col; //随机产生0~2的数字 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } char IsWin(char board[ROW][COL], int row, int col) { int flag = 1; int i = 0; int j = 0; //1、判断输赢 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == '*' || board[0][j] == '*' && board[1][j] == '*' && board[2][j] == '*' || board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*' || board[0][2] == '*' && board[1][1] == '*' && board[2][0] == '*') { return '*'; } else if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == '#' || board[0][j] == '#' && board[1][j] == '#' && board[2][j] == '#' || board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#' || board[0][2] == '#' && board[1][1] == '#' && board[2][0] == '#') { return '#'; } else if (board[i][j] == ' ') { flag = 0; } } } //2、判断平局 if (flag == 1) { return 'Q'; } //3、游戏继续 else { return 'C'; } }

test.c

#include "game.h" void menu() { printf("***************************************\n"); printf("*********** 1. play *************\n"); printf("*********** 2. exit *************\n"); printf("***************************************\n"); } void game() { //三子棋的过程 char board[ROW][COL]; //棋盘数组 //初始化棋盘 - board的元素都给成空格 InitBoard(board, ROW, COL); //打印棋盘 DisplayBoard(board, ROW, COL); //下棋 char ret = 0; while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else { printf("平局\n"); } } int main() { int input = 0; srand( (unsigned int)time(NULL) ); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("选择错误"); break; } } while (input); return 0; }

来看看实现后的结果~

5G游戏 C 语言

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《企业级容器云架构开发指南》—1.2.2 存储虚拟化
下一篇:Taurus2.0垃圾回收compactor优化方案
相关文章