目录
- 前言
三子棋是一款经典的棋盘游戏,玩家与电脑在3×3的棋盘上交替放置棋子,直到某一方连成一行(横、竖、斜)或棋盘被填满。本文将带你一步步使用C语言来实现这一小游戏
一、游戏规则
- 三子棋棋盘为3×3的矩阵 。
- 玩家使用字符 ‘ * ’ ,电脑使用字符 ‘ # ’ 。
- 如果某一方连成一行,游戏胜利 ;如果棋盘填满,则为平局 。
二、设计思路:
1.游戏流程
- 选择是否玩游戏。
- 显示棋盘。
- 选择玩家\电脑谁先下。
- 下棋。
- 检查是否玩家\电脑获胜,是否平局。
- 如果游戏未结束,回到第四步。
2.实现代码
2.1 代码结构
- 使用二维数组char board[3][3]表示棋盘
- 主要函数:
- void init_board( ) —— 初始化棋盘
- void print_board( ) —— 打印棋盘
- void player_move( ) —— 玩家落子
- void computer_move( ) —— 电脑落子
- char is_win( ) —— 判断输赢
2.2 定义游戏界面
首先,我们写一个测试函数,打印游戏界面并选择是否玩游戏
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误,请重新输入\n");
break;
}
} while (input);
}
menu()函数
void menu()
{
printf("***********************\n");
printf("*******1.play**********\n");
printf("*******0.exit**********\n");
printf("***********************\n");
}
2.3游戏代码设计
game()函数
void game()
{
char board[3][3];
char ret = '\0';
//初始化棋盘
init_board(board, 3, 3);
//打印棋盘
print_board(board, 3, 3);
//更新选择玩家和电脑谁先下
do
{
first_play();
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
while (1)
{
player_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
computer_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
}
goto flag;
case 2:
while (1)
{
computer_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
player_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
}
goto flag;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (1);
flag:
if (ret == '#')
{
printf("电脑获胜\n");
}
else if (ret == '*')
{
printf("玩家获胜\n");
}
else
{
printf("平局\n");
}
}
2.4初始化棋盘
void init_board(char board[3][3], 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] = ' ';
}
}
}
2.5打印棋盘
void print_board(char board[3][3], 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");
}
}
2.6玩家落子
void player_move(char board[3][3])
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("此坐标已被占用,请重新输入\n");
}
}
else
{
printf("输入有误\n");
}
}
}
2.7电脑落子
void computer_move(char board[3][3])
{
int x = 0;
int y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
2.8判断输赢
char is_win(char board[3][3], int row, int col)
{
//行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//列
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[0][0] != ' ')
{
return board[0][0];
}
//反对角线
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
//平局
int ret = is_full(board,row,col);
if (ret == 1)
{
return 'Q';
}
else
{
return 'C';
}
}
2.9判断棋盘满不满
棋盘不满继续游戏,棋盘满为平局。
char is_full(char board[3][3], 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;
}
3.头文件 game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void init_board(char board[3][3], int row, int col);
void print_board(char board[3][3], int row, int col);
void player_move(char board[3][3]);
void computer_move(char board[3][3]);
char is_win(char board[3][3], int row, int col);
4.源文件game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(char board[3][3], 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 print_board(char board[3][3], 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");
}
}
void player_move(char board[3][3])
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("此坐标已被占用,请重新输入\n");
}
}
else
{
printf("输入有误\n");
}
}
}
void computer_move(char board[3][3])
{
int x = 0;
int y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
char is_full(char board[3][3], 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 is_win(char board[3][3], int row, int col)
{
//行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//列
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[0][0] != ' ')
{
return board[0][0];
}
//反对角线
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
//平局
int ret = is_full(board,row,col);
if (ret == 1)
{
return 'Q';
}
else
{
return 'C';
}
}
5.源文件test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("***********************\n");
printf("*******1.play**********\n");
printf("*******0.exit**********\n");
printf("***********************\n");
}
//更新内容
void first_play()
{
printf("***********************\n");
printf("*******1.玩家先下******\n");
printf("*******2.电脑先下******\n");
printf("***********************\n");
}
void game()
{
char board[3][3];
char ret = '\0';
//初始化棋盘
init_board(board, 3, 3);
//打印棋盘
print_board(board, 3, 3);
//更新选择玩家和电脑谁先下
do
{
first_play();
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
while (1)
{
player_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
computer_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
}
goto flag;
case 2:
while (1)
{
computer_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
player_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
}
goto flag;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (1);
flag:
//默认玩家先下
/*while (1)
{
player_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
computer_move(board);
print_board(board, 3, 3);
ret = is_win(board, 3, 3);
if (ret != 'C')
{
break;
}
}*/
if (ret == '#')
{
printf("电脑获胜\n");
}
else if (ret == '*')
{
printf("玩家获胜\n");
}
else
{
printf("平局\n");
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
6.代码实现示例:
总结
本博客介绍了如何使用C语言编写一个简易的三子棋游戏,包括 游戏规则、设计思路、完整实现代码、及运行效果。