今天我给大家带来三子棋的游戏代码。
同样,我们需要先有一个大致的思路,三子棋大致是什么样的、它的游戏规则是什么,知道了这些之后我们就可以初步知道我们写代码的思路是什么了。
由于三子棋的游戏代码相对来说比较大,我们创建1个项目写代码的话会很麻烦,代码的可识度很低,所以我们在这个游戏代码中要用到3个项目——1个头文件、2个源文件。在头文件中写声明,在2个源文件中写游戏的主代码,这样写出的代码可识度就会大大提示,这也是写大型代码的基本方法。
1.首先,还是主函数,里面包含一个test()函数,然后我们再定义test()函数。在test()函数里放上菜单 ,并加上可供选择的代码。这个内容较简单,我就直接附上代码。
void menu()
{
printf("****************************\n");
printf("********* 1.PLAY *********\n");
printf("********* 0.EXIT *********\n");
printf("****************************\n");
}
void test()
{
int input;
do
{
menu();
srand((unsigned int)time(NULL));
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case 0:
{
printf("退出游戏\n");
break;
}
case 1:
{
printf("进入游戏\n");
game();
break;
}
default:
{
printf("输入错误,请重新选择\n");
break;
}
}
} while (input);
}
int main()
{
test();//测试函数
return 0;
}
2.在test()函数里我们有一个game()函数,这是游戏的主函数,我们在它里面再引入其它的函数。
- 用二维数组创建一个3*3的棋盘。
- 初始化棋盘的内容,就是初始化数组内的元素,将它们都定义为‘ ’,即空格,后面game.c文件会详细说明。
- 打印棋盘。我们可以有不同的棋盘,但不同的棋盘就有不同的代码,这个没有影响。
- 创建可以让玩家和电脑走棋的函数,并在每一次玩家或电脑走完之后再打印一次棋盘,这样我们就可以看到每一步的情况,并作出相应的判断。
- 我们还要定义一个可以判断输赢的函数,让它在每一次玩家或电脑走之后都判断一次输赢,并返回一个值。在本代码里,我们规定字符@为“没赢,继续走”、*为“玩家赢”、#为“电脑赢”、!为“棋盘满了,平局”。
- 代码如下,在此代码里的所有函数都定义在game.c里,并在game.h中进行声明。所以我们只需要在开头输入#define "game.h"进行调用。
void game()
{
char ret = 0;
char board[ROW][COL]={0};//创建棋盘
initboard( board, ROW, COL);//初始化棋盘内容
printboard(board, ROW, COL);//打印棋盘
while (1)
{
playermove(board, ROW, COL);//玩家走
printboard(board, ROW, COL);//打印棋盘
ret=whetherwin(board, ROW, COL);//判断输赢
if (ret != '@')
break;
computermove(board, ROW, COL);//电脑走
printboard(board, ROW, COL);//打印棋盘
ret=whetherwin(board, ROW, COL);//判断输赢
if (ret != '@')
break;
}
if (ret == '*')
printf("玩家赢\n");
else if (ret == '#')
printf("电脑赢\n");
else
printf("平局\n");
}
3.下面是game.c中的所有代码 ,我就不一一解释了,多看几遍就能看懂,没有特别复杂的代码。
#include "game.h"
void initboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void printboard(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
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");
}
}
}
int whetherfull(char board[ROW][COL], int row, int col)
{
int i, j;
int flag = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
flag = 1;
break;
}
}
}
return flag;
}
void playermove(char board[ROW][COL], int row, int col)
{
int b, c;
printf("请输入坐标\n");
while (1)
{
scanf("%d%d", &b, &c);
if (board[b-1][c-1] == ' ')
{
printf("你输入的坐标是(%d,%d)\n", b, c);
board[b - 1][c - 1] = '*';
break;
}
else if (b > 3 || c > 3)
{
printf("坐标输入错误,请重新输入\n");
}
else
{
printf("输入的坐标已被占用,请重新输入\n");
}
}
}
void computermove(char board[ROW][COL], int row, int col)
{
int b, c;
while (1)
{
b = rand() % row;
c = rand() % col;
if (board[b][c] == ' ')
{
printf("电脑输入的坐标是(%d,%d)\n", b+1, c+1);
board[b][c] = '#';
break;
}
}
}
char whetherwin(char board[ROW][COL], int row, int col)
{
int i;
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];
if (whetherfull(board,row,col) == 1)
return '@';
return '!';
}
4.这是game.h头文件里的代码。
#define ROW 3
#define COL 3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void initboard(char board[ROW][COL], int row, int col);
void printboard(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 whetherwin(char board[ROW][COL], int row, int col);
5. 1和2里面的所有代码就是test.c里的代码了,对了别忘了加#define "game.h"调用头文件。