首先三字棋的玩法大家应该都比较熟悉,其实就是与五子棋的玩法差不多,只是五子成线为赢变成了三子成线为赢。
1.先上代码效果:
2.然后说一下实现的逻辑:
2.1首先肯定是建立一个进入退出游戏的环节,如果选择进入则开始游戏,选择退出则程序结束,并且如果玩家玩完一局后还可进行选择是否继续游戏。
2.2第一步有两个分支,如果选择退出游戏则程序结束,如果选择开始游戏则要进入游戏。所以我们下一步是实现游戏的环节。
2.3游戏的实现要分为许多步骤,首先要先建立一个空的棋盘,然后玩家和电脑交替下棋,并且每下一步都要有一个判断机制去判断这一步的结果是什么,是玩家赢了?是电脑赢了?还是平局?又或是继续?如果玩家赢了则输出玩家赢,如果电脑赢了则输出电脑赢了,如果平局则输出平局,如果都不是则继续下棋。
3.代码实现:
3.1首先建立进入退出游戏的环节:
void menu(void)
{
printf("**********************************\n");
printf("****** 0.退出游戏 *******\n");
printf("****** 1.进入游戏 *******\n");
printf("**********************************\n");
}
int main(void)
{
int input;
//此代码为后面产生随机数做铺垫的,具体请了解rand函数产生 随机数的用法
srand((unsigned int)time(NULL));
do
{
menu(); //打印选项
printf("请输入您的选项");
scanf("%d", &input); //输入你是否想玩
switch (input)
{
case 1: // 想玩则进入game
game();
break;
case 0: //不想玩则退出进入游戏的循环
break;
default: //输入错误则重新输入
printf("输入错误请重新输入\n");
break;
}
} while (input);
return 0;
}
3.2 游戏主要逻辑函数game()的实现
void game(void)
{
//创建棋盘
char judge;//用于保存判断结果
char a[ROW][COL];
//初始化棋盘为空
init_chb(a, ROW, COL);
//打印棋盘
print_chb(a, ROW, COL);
while (1)
{
//玩家下棋
player_move(a, ROW, COL);
//玩家下完棋就进行判断,看是否出现胜负或平局
judge = judge_win(a, ROW, COL);
if (judge != '1') break;
//电脑下棋
comput_move(a, ROW, COL);
//电脑下完棋就进行判断,看是否出现胜负或平局
judge = judge_win(a, ROW, COL);
//每下一回合就输出一次棋盘
print_chb(a, ROW, COL);
if (judge != '1') break;
}
//下面根据judge保存的返回值输出游戏结果
if (judge == '#')
{
printf("玩家赢\n");
}
else if (judge == '*')
{
printf("电脑赢\n");
}
else
printf("平局\n");
print_chb(a, ROW, COL);
}
3.3游戏具体用到的函数的实现:
初始化棋盘的函数:
void init_chb(char a[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
a[i][j] = ' ';
}
}
}
输出棋盘的函数:
void print_chb(char a[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
printf(" | | \n"); //先输出一行
for (int j = 0; j < col; j++)
{
if (j == col - 1) //最后一次循环不打印 |
{
printf(" %c ", a[i][j]);
}
else
{
printf(" %c |", a[i][j]);
}
}
printf("\n");
if (i != row - 1)//最后一行下面不打印下划线
{
for (int k = 0; k < 3 * col + col - 1; k++)
{
printf("-");
}
}
printf("\n");
}
}
玩家下棋函数:
void player_move(char a[][COL], int row, int col)
{
int x, y;
while (1)
{
printf("请输入您想走的坐标");
scanf("%d%d", &x, &y);
if (a[x - 1][y - 1] == ' ')
{
a[x - 1][y - 1] = '#';
break;
}
}
}
判断输赢的函数:
char judge_win(char a[][COL], int row, int col)
{
int i, j, count = 0;
for (i = 0; i < col; i++)
{
//行三个相同为赢
if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][1]!= ' ')
{
return a[i][1];//返回其中一个元素
}
//列三个相同为赢
else if (a[0][i] == a[1][i] && a[1][i] == a[2][i] && a[1][i] != ' ')
{
return a[1][i];//返回其中一个元素
}
//主对角线三个相同为赢
else if (a[0][0] == a[2][2] && a[2][2] == a[1][1] && a[0][0] != ' ')
{
return a[0][0];//返回其中一个元素
}
//副对角线三个相同为赢
else if (a[0][2] == a[1][1] && a[2][0] == a[1][1] && a[0][2] != ' ')
{
return a[1][1];//返回其中一个元素
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (a[i][j] == ' ') count++; //下满了则平局
}
}
if (count == 0) return '0'; //平局返回'0'
return '1'; //否则返回'1'继续游戏
}
电脑下棋的函数:
void comput_move(char a[][COL], int row, int col)
{
int x, y;
while (1)
{
x = rand() % 3 + 1; //产生一个1 - 3的随机数作为横坐标
y = rand() % 3 + 1; //产生一个1 - 3的随机数作为纵坐标
if (a[x - 1][y - 1] == ' ') //如果此位置没有被下棋那么就下到此位置
{
a[x - 1][y - 1] = '*';
break;
}
}
}
到这里这个简单版的三字棋就算是基本完成了,这里我只写了主要的代码,如果你能看懂我上面所说的,那么基本就能写出这样的小游戏了。如果想运行起来还需要函数的声明,头文件,还有宏定义,这些我统一放在了一个名为game.h的头文件里:
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void game(void);
void print_chb(char a[][COL], int row, int col);
char judge_win(char a[][COL], int row, int col);
void player_move(char a[][COL], int row, int col);
void comput_move(char a[][COL], int row, int col);
在其他文件里使用只需要包含这个头文件就行了。