大家好!学习了那么久的c语言,我们都希望自己能做出一些成果来,而实现一些小游戏无疑是最先想到的选择。
今天我给大家介绍一个充满趣味和挑战的井字棋小游戏——三子棋。它是一款简单而又深思熟虑的游戏,通过在棋盘上放置符号,让先连成相同符号的三个一线,战胜对手。让我们一起来看看三子棋的规则、策略和实现吧!
在此处贴出各个函数对应位置,方便各位去进行查找
目录
一、三子棋小游戏的规则
二、三子棋小游戏重要函数的实现
1.菜单打印
2.棋盘初始化
3.棋盘打印
4.玩家下棋
5.电脑下棋
6.是否获胜判断
三.全体代码并进行游戏演示:
一、三子棋小游戏的规则
三子棋,又称井字棋,是一个两人对弈的棋盘游戏。游戏棋盘是一个3x3的方格矩阵,每个玩家轮流在空白的方格中放置自己的符号(通常是"X"和"O")。先连成三个相同符号的一线(横、竖或斜线),即可获胜。
下面是一个示意图,帮助我们更好地理解三子棋的规则:
二、三子棋小游戏重要函数的实现
1.我们首先打印游戏菜单
void menu()//打印菜单的函数 { printf("*********************\n"); printf("******* 1. play *****\n"); printf("******* 0. exit *****\n"); printf("*********************\n"); }
效果如下:
2.初始化棋盘 我们可以使用一个3x3的二维数组来表示棋盘,初始值都设置为空格。可以定义一个函数来创建并初始化棋盘
void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数 { for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { arr[i][j] = ' '; } } }
3.打印棋盘 定义一个函数来打印当前的棋盘状态(该代码可随意改变棋盘大小)
void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ", arr[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); for (int k = 0; k < col; k++) { printf("---"); if (k < col - 1) { printf("|"); } } printf("\n"); } }
4.提示玩家输入位置 定义一个函数来提示玩家输入要下棋的位置 ,同时检查输入的位置是否合法 定义一个函数来检查玩家输入的位置是否合法,即行和列的值都在0到2之间,并且该位置还没有被其他玩家占据
void Player(char arr[ROW][COL], int row, int col) { while (1) { printf("玩家进行下棋,请输入棋子所处坐标 \n"); int x, y; scanf("%d %d", &x, &y); if (x >= 1 && x <= ROW && y >= 1 && y <= COL) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = 'o'; break; } printf("该位置已被占用,请输入其他坐标\n"); } else { printf("输入错误,请重新输入"); } } }
5.电脑进行下棋(因为是初学者,没怎么学过算法,暂时使用随机数,日后会去学习使用miniMax算法进行改善),同理也要进行是否已被占用的判断
void Computer(char arr[ROW][COL], int row, int col) { printf("电脑下棋\n"); while (1) { int x, y; x = rand() % row; y = rand() % col; if (arr[x][y] == ' ') { arr[x][y] = 'x'; break; } } }
6.判断是否有玩家获胜 定义一个函数来判断是否有玩家连成一条线。我们需要检查每一行、每一列以及对角线上的棋子是否相同,如果有相同的棋子,则判定该玩家获胜,o表示玩家赢,x是电脑赢,c是平局,k是继续 。返回相应的字符更为方便
char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数 { for (int i = 0; i < row; i++)//判断行 { if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ') { return arr[i][0]; } } for (int j = 0; j < col; j++)//判断列 { if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ') { return arr[0][j]; } } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ') { return arr[0][0]; } if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ') { return arr[0][2]; } if (isFull(arr,row,col)) { return 'c'; } return 'k'; }
三.全体代码并进行游戏演示:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 3 #define COL 3//定义行和列均为3 void menu()//打印菜单的函数 { printf("*********************\n"); printf("******* 1. play *****\n"); printf("******* 0. exit *****\n"); printf("*********************\n"); } void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数 { for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { arr[i][j] = ' '; } } } void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ", arr[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); for (int k = 0; k < col; k++) { printf("---"); if (k < col - 1) { printf("|"); } } printf("\n"); } } void Player(char arr[ROW][COL], int row, int col) { while (1) { printf("玩家进行下棋,请输入棋子所处坐标 \n"); int x, y; scanf("%d %d", &x, &y); if (x >= 1 && x <= ROW && y >= 1 && y <= COL) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = 'o'; break; } printf("该位置已被占用,请输入其他坐标\n"); } else { printf("输入错误,请重新输入"); } } } void Computer(char arr[ROW][COL], int row, int col) { printf("电脑下棋\n"); while (1) { int x, y; x = rand() % row; y = rand() % col; if (arr[x][y] == ' ') { arr[x][y] = 'x'; break; } } } int isFull(char arr[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (arr[i][j] == ' ') return 0; } } return 1; } char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数 { for (int i = 0; i < row; i++)//判断行 { if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ') { return arr[i][0]; } } for (int j = 0; j < col; j++)//判断列 { if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ') { return arr[0][j]; } } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ') { return arr[0][0]; } if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ') { return arr[0][2]; } if (isFull(arr,row,col)) { return 'c'; } return 'k'; } void game() { char win ; char board[ROW][COL]; //我们使用一个二维数组board来表示棋盘,每个格子可以存放一个字符,初始值为空格 initBoard(board, ROW, COL);//initBoard函数用来初始化棋盘 printBoard(board, ROW, COL);//printBoard函数用来打印棋盘 //开始下棋 while (1) { Player(board, ROW, COL);//玩家下棋 printBoard(board, ROW, COL); win=Iswin(board, ROW, COL);//o表示玩家赢,x是电脑赢,c是平局,k是继续 if (win != 'k') { break; } Computer(board, ROW, COL); //电脑下棋 printBoard(board, ROW, COL); if (win != 'k') { break; } } if (win == 'o') { printf("玩家获胜\n"); } else if (win == 'x') { printf("电脑获胜\n"); } else { printf("平局\n"); } } int main() { int a = 1; srand((unsigned int)time(NULL)); while (a) { printf("请选择:\n"); menu(); scanf("%d", &a); switch (a) { case 1: game();//开始游戏 break; case 0: printf("退出游戏\n"); break; default: printf("输入有误,请重新输入\n"); break; } } return 0; }
三子棋小游戏是一款简单而又富有挑战性的游戏,它不仅能够帮助我们放松心情,还能够锻炼我们的思维能力。通过这篇文章的介绍,我们了解了三子棋小游戏的规则和实现方法。希望大家能够尝试玩一玩这款游戏,享受其中的乐趣和挑战!
今天的分享先到这里,感谢大家!!!