C语言最基础练习:《三子棋》小游戏;
这个是昨天刚听过的一道题,觉得挺有意思的,就先把最基础的功能用C语言实现了一遍,还有扩展功能后续再敲,先把这个基础款传上来
扩展:由玩家确定“数字*数字”的棋盘,确定几个棋子连起来才能赢,比如五子棋,七子棋等
1.首先看一下我们要做出什么样子的三子棋。
2.一共九个格子,然后玩家输入要走的格子的坐标,接着电脑走一步,直到棋盘有某一方下的棋子连接成三个,那么这一方就胜利了。
下面是详细分析:
1.如图所示,9个格子先用如中的符号分隔开,1、3、5行由“-%c-|-%c-|-%c-”组成,2、4、6行由“__ | __| __”组成,如此我们的3*3棋盘就形成了。接下来就是玩家跟电脑下棋了,假设玩家下的是“X”,电脑下的棋是“0”,直到某一方三个子连在一起或者棋盘下满平局。
2.下面就是敲代码用函数去实现它。`
3.第一步创建一个单独的源文件放入main主函数,先写一个test子函数用来初始化游戏界面。(menu函数为游戏界面)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include "game2.h"
int main()
{
test();
system("pause");
return 0;
}
4、第二步 ,编写test子函数具体内容:
void test()
{
int input = 0;
do
{
menu();
printf("请选择开始游戏或者退出:>>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
printf("游戏开始!\n");
game();
break;
default:
break;
}
} while (input);
}
void menu()
{
printf("**************************\n");
printf("**********1.play**********\n");
printf("**********0.exit**********\n");
printf("**************************\n");
}
5、第三步,当玩家输入1之后就进入游戏了,(输入0则通过switch退出当前游戏)游戏部分由子函数game()来实现。
void game()
{
char board[Row][Col] = { 0 };
Initboard(board, Row, Col);
Displayboard(board, Row, Col);
while (1)
{
Player(board, Row, Col);//人走
Displayboard(board, Row, Col);//展示
char ret = Iswin(board,Row,Col);
if (ret == 'X')
{
printf("玩家赢!\n");
break;
}
else if (ret == '0')
{
printf("电脑赢了,你输了!\n");
}
else if (ret == 'Q')
{
printf("厉害了,平局!\n");
}
Computer(board, Row, Col);//机走
Displayboard(board, Row, Col);//展示
}
//ret = Iswin();//判断人是否赢了;
}
game函数,定义一个3*3的字符数组用来存放电脑跟玩家将要下的“棋”,用两个子函数Initboard()、Displayboard()来初始化棋盘跟打印棋盘(某一方下完棋后显示出来下在哪里了)。
6、子函数Initboard()、Displayboard():
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 Displayboard(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");
}
}
7、接下来再新建两个子函数Player()、Computer(),分别用来表示玩家下的棋跟电脑下的棋,每次下完后都必须打印一次棋盘:
void Player(char board[Row][Col],int row,int col)
{
//int t = 0;
int x = 0, y = 0;
while (1)
{
printf("玩家走>>\n");
printf("请输入要走的坐标:");
scanf("%d%d", &x, &y);
if (board[x-1][y-1] == ' ')
{
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("该坐标已经使用,请重新输入坐标:\n");
}
}
}
void Computer(char board[Row][Col], int row, int col)
{
int x = 0, y = 0;
printf("电脑走>>\n");
srand((unsigned)time(NULL));
while (1)
{
x = (rand() % row);
y = (rand() % col);
if (board[x][y] == ' ')
{
board[x][y] = '0';
break;
}
}
}
简单解释一下这两段代码,玩家:输入坐标,如果对应坐标为空,那么填入字符“X”,如过不为空那么提示该空已经填了,请重新输入。电脑:利用rand()函数随机返回一个数,由于棋盘只有9格子,所以随机返回的数字不能超出格子的范围,对行数跟列数分别取余就行,随机的性质不变,需要的头文件<string.h><time.h>等。
8、接下来我们已经可以跟电脑下棋了,但是还缺,算是两个子函数吧。一个用来判断输赢,一个用来判断棋盘是否满了,如果满了还没有分出胜负那就是平局这个子函数放在判断输赢的函数里。
char Iswin(char board[Row][Col], int row, int col)
{
int i = 0;
for ( i = 0; i < row; i++)
{
if (board[i][0]==board[i][1]&&board[i][0]==board[i][2]&&board[i][0]=='X')
{
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]=='X')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2]&&board[0][0]=='X')
{
return board[0][0];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] == 'X')
{
return board[2][0];
}
int let = Isfull(board, Row, Col);
if (let == 1)
{
return 'Q';
}
}
int Isfull(char board[Row][Col], int row, int col)
{
int i = 0, j = 0,count = 0;
for ( i = 0; i < row; i++)
{
for ( j = 0; j < col; j++)
{
if (board[i][j]==' ')
{
count++;
}
}
}
if (count == 0)
{
return 1;
}
}
如果game()函数里ret接收到的返回值是字符‘X’,那么代表玩家赢了;如果是字符‘0’,那么代表电脑赢了,玩家输了;如果返回字符‘Q’,那么代表平局,棋盘满了也分不出胜负。
下图是运行效果: