目录
1.认识三子棋小游戏
2.三子棋的main函数以及菜单页面
2.1 menu()函数的实现
3.游戏实现
3.1 初始化二维数组
3.2 棋盘的实现
3.3 玩家下棋
3.4 电脑下棋
3.5 判断输赢函数
4.源代码+效果展示
1.认识三子棋小游戏:
《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
2.三子棋的main函数
对于这里的main函数,我们主要是想做一个游戏的菜单页面,因此我们运用do while函数来不断打印出菜单。
int main()
{
int input = 0;
do {
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
printf("三子棋游戏开始!\n");
PlayGame();
break;
default:
printf("你的输入有误,请重新输入!\n");
break;
}
} while (input != 0);
return 0;
}
2.1 menu()函数的实现
我们采用四次打印输出来实现menu函数,运行结果如下图所示。
void menu()
{
printf(" **********************\n");
printf(" ****** 1.PLAY ********\n");
printf(" ****** 0.EXIT ********\n");
printf(" **********************\n");
}
3.游戏实现
我们输入“1”,进入到PlayGame()函数,然后需要一个二维数组来存储缩放棋子的位置,因此我们首先需要先初始化这个二维数组。
3.1初始化二维数组
我们用“*”和“#”分别代表玩家下的棋和电脑下的棋,因此需要用一个字符类型的二维数组并进行初始化,我们先把二维数组初始化成空格。
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
3.2 棋盘的实现
棋盘的实现我个人认为稍微有点难想,直接上代码,就不解释了。
void BoardDisplay(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
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");
}
}
3.3 玩家下棋
玩家下棋我们需要判断输入的坐标是否已经被占领。
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("请输入要下的坐标:");
while (1) {
scanf("%d %d", &x, &y);
if (board[x - 1][y - 1] == ' ') {
board[x-1][y-1] = '*';
BoardDisplay(board, ROW, COL);
break;
}
else {
printf("此处已经被占领,请重新输入!\n");
}
}
}
3.4 电脑下棋
电脑下棋我们需要运用到随机函数,随机函数的运用就不过多赘述了,可以参考如下链接:rand - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1) {
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ') {
board[x][y] = '#';
BoardDisplay(board, ROW, COL);
break;
}
}
}
3.5 判断输赢函数
判断输赢函数要判断三行和三列,连个对角线是否为相同的元素并且都不为空。除此之外还要判断棋盘是否满了,因此还要再加一个判断棋盘是否是满了的函数。
判断行和列是否是同一个元素我们只需要用两个for函数即可。
至于判断棋盘是否为满,我们需要遍历整个数组,如果满了就返回1,不满就返回0。
代码如下:
是否为满函数:
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
判断胜负函数:
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (board[i][1] == board[i][2] && board[i][2] == board[i][0] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断是否为满
int full = 0;
full = IsFull(board, ROW, COL);
if (full == 1) {
return 'F';
}
}
4. 源代码+效果展示
源代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf(" **********************\n");
printf(" ****** 1.PLAY ********\n");
printf(" ****** 0.EXIT ********\n");
printf(" **********************\n");
}
void PlayGame()
{
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);
BoardDisplay(board, ROW, COL);
while (1) {
char ch;
PlayerMove(board, ROW, COL);
ch = IsWin(board, ROW, COL);
if (ch == '*') {
printf("玩家胜利!\n");
break;
}
else if (ch == '#') {
printf("电脑胜利!\n");
break;
}
else if (ch == 'F') {
printf("平局!\n");
break;
}
ComputerMove(board, ROW, COL);
ch = IsWin(board, ROW, COL);
if (ch == '*') {
printf("玩家胜利!\n");
break;
}
else if (ch == '#') {
printf("电脑胜利!\n");
break;
}
else if (ch == 'F') {
printf("平局!\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
printf("三子棋游戏开始!\n");
PlayGame();
break;
default:
printf("你的输入有误,请重新输入!\n");
break;
}
} while (input != 0);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
void BoardDisplay(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
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)
{
int x = 0;
int y = 0;
printf("请输入要下的坐标:");
while (1) {
scanf("%d %d", &x, &y);
if (board[x - 1][y - 1] == ' ') {
board[x-1][y-1] = '*';
BoardDisplay(board, ROW, COL);
break;
}
else {
printf("此处已经被占领,请重新输入!\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1) {
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ') {
board[x][y] = '#';
BoardDisplay(board, ROW, COL);
break;
}
}
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (board[i][1] == board[i][2] && board[i][2] == board[i][0] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断是否为满
int full = 0;
full = IsFull(board, ROW, COL);
if (full == 1) {
return 'F';
}
}
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void BoardDisplay(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);
char IsWin(char board[ROW][COL], int row, int col);
效果展示
OK,以上就是三子棋小游戏的实现。