今天小周末打算编写一个简单的三子棋游戏程序,与电脑来一场pk。
一、首先我们需要棋盘和棋子才能进行游戏。
1,在这里我们用二维数组来表示棋盘(一个简单的3*3棋盘)。
2,“ x ” “ o ” “ ”(空),三个字符来表示棋子。
二、核心流程
a、初始化棋盘
b、打印棋盘
c、让玩家落子(采用输入坐标的方式)
d、检查是否结束
e、电脑落子(随机下)
f、检查是否结束
g、循环进行b
A:创建一个新函数将棋盘初始化
//初始化棋盘
void Init(char board[Max_Row][Max_Col]){
for (int row = 0; row < Max_Row; ++row){
for (int col = 0; col < Max_Col; ++col){
board[row][col] = ' ';
}
}
}
B打印一个3*3棋盘
void print(char board[Max_Row][Max_Col]){
printf("|---|---|---|\n");
for (int row = 0; row < Max_Row; ++row){
printf("| %c | %c | %c |\n", board[row][0], board[row][1], board[row][2]);
printf("|---|---|---|\n");
}
}
效果图如下:
C让玩家落子(采用输入坐标的方式)
这里也采用函数的方法
void PlayerMove(char board[Max_Row][Max_Col]){
while (1){
printf("请输入坐标,(row col)\n");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
//需进行判定
if (row < 0 || row >= Max_Row || col < 0 || col >= Max_Col){
printf("您的输入有误,请重新输入\n");
continue;
}
if (board[row][col] != ' '){
printf("该位置有子了,请重新输入\n");
continue;
}
board[row][col] = 'x';//玩家落子为x
break;
}
}
D判断最终的结果
分为4种情况游戏结束
- 每一行的符号相等
- 每一列的符号相等
- 对角线的符号相等(又分为左右两对角线)
- 棋盘满了,却无123,即为和棋
因此创建两个函数,Isfull函数判断棋盘是否下满了棋子
//棋盘满了返回1,没有满返回0
int Isfull(char board[Max_Row][Max_Col]){
for (int row = 0; row < Max_Row; ++row){
for (int col = 0; col < Max_Col; ++col){
if (board[row][col] == ' '){
return 0;
}
}
}
return 1;
}
//返回值的类型是char
//1,玩家胜利 x
//2,电脑胜利 o
//3,和棋 =
//4,未分胜负‘ ’
char Iswin(char board[Max_Row][Max_Col]){
//行
for (int row = 0; row < Max_Row; ++row){
if (board[row][0] == board[row][1] && board[row][0] == board[row][2] && board[row][0] != ' '){
return board[row][0];
}
}
//列
for (int col = 0; col < Max_Col; ++col){
if (board[0][col] == board[1][col] && board[0][col] == board[2][col] && board[0][col] != ' '){
return board[0][col];
}
}
//对角线
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' '){
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][0] == board[2][0] && board[0][2] != ' '){
return board[0][2];
}
//棋盘是否下满棋子
if (Isfull(board)){
return '=';
}
else{
//胜负未分
return ' ';
}
}
E电脑落子(随机下)
void ComputerMove(char board[Max_Row][Max_Col]){
//随机落子
while (1){
int row = rand() % Max_Row;
int col = rand() % Max_Col;
if (board[row][col] != ' '){
continue;
}
board[row][col] = 'o';
break;
}
}
主函数
int main(){
char chess_board[Max_Row][Max_Col];
char result = ' ';
//1 初始化棋盘
Init(chess_board);
while (1){
//2 打印棋盘
print(chess_board);
//3 玩家落子
PlayerMove(chess_board);
//4 判定游戏是否结束
result = Iswin(chess_board);
if (result != ' '){
break;
}
//5电脑落子
ComputerMove(chess_board);
//6判断游戏是否结束
result = Iswin(chess_board);
if (result != ' '){
break;
}
}
print(chess_board);
if (result == 'x'){
printf("您赢了\n");
}
else if (result == 'o'){
printf("您输了\n");
}
else if(result== '='){
printf("和棋\n");
}
system("pause");
return 0;
}
总代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Max_Row 3
#define Max_Col 3
void Init(char board[Max_Row][Max_Col]){
for (int row = 0; row < Max_Row; ++row){
for (int col = 0; col < Max_Col; ++col){
board[row][col] = ' ';
}
}
srand(time(0));
}
void print(char board[Max_Row][Max_Col]){
printf("|---|---|---|\n");
for (int row = 0; row < Max_Row; ++row){
printf("| %c | %c | %c |\n", board[row][0], board[row][1], board[row][2]);
printf("|---|---|---|\n");
}
}
void PlayerMove(char board[Max_Row][Max_Col]){
while (1){
printf("请输入坐标,(row col)\n");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
if (row < 0 || row >= Max_Row || col < 0 || col >= Max_Col){
printf("您的输入有误,请重新输入\n");
continue;
}
if (board[row][col] != ' '){
printf("该位置有子了,请重新输入\n");
continue;
}
board[row][col] = 'x';
break;
}
}
//满了返回1,没有满返回0
int Isfull(char board[Max_Row][Max_Col]){
for (int row = 0; row < Max_Row; ++row){
for (int col = 0; col < Max_Col; ++col){
if (board[row][col] == ' '){
return 0;
}
}
}
return 1;
}
//返回值的类型是char
//1,玩家胜利 x
//2,电脑胜利 o
//3,和棋 =
//4,未分胜负‘ ’
char Iswin(char board[Max_Row][Max_Col]){
//行
for (int row = 0; row < Max_Row; ++row){
if (board[row][0] == board[row][1] && board[row][0] == board[row][2] && board[row][0] != ' '){
return board[row][0];
}
}
//列
for (int col = 0; col < Max_Col; ++col){
if (board[0][col] == board[1][col] && board[0][col] == board[2][col] && board[0][col] != ' '){
return board[0][col];
}
}
//对角线
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' '){
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][0] == board[2][0] && board[0][2] != ' '){
return board[0][2];
}
if (Isfull(board)){
return '=';
}
else{
//胜负未分
return ' ';
}
}
void ComputerMove(char board[Max_Row][Max_Col]){
//随机落子
while (1){
int row = rand() % Max_Row;
int col = rand() % Max_Col;
if (board[row][col] != ' '){
continue;
}
board[row][col] = 'o';
break;
}
}
int main(){
char chess_board[Max_Row][Max_Col];
char result = ' ';
//1 初始化棋盘
Init(chess_board);
while (1){
//2 打印棋盘
print(chess_board);
//3 玩家落子
PlayerMove(chess_board);
//4 判定游戏是否结束
result = Iswin(chess_board);
if (result != ' '){
break;
}
//5电脑落子
ComputerMove(chess_board);
//6判断游戏是否结束
result = Iswin(chess_board);
if (result != ' '){
break;
}
}
print(chess_board);
if (result == 'x'){
printf("您赢了\n");
}
else if (result == 'o'){
printf("您输了\n");
}
else if(result== '='){
printf("和棋\n");
}
system("pause");
return 0;
}