数组应用————三子棋
测试代码
放进test.c之中,用于代码的测试和运行。
基本方法
1.开始游戏前玩家进入菜单输入数字表示参加与否,1表示参加游戏,0表示结束游戏,通过循环使游戏可以多次进行。
2.玩家参加游戏,则进入游戏代码。
代码实现
int main( ){
srand((unsigned int)time(NULL));
int input = 0;
do{
meun( );
printf("please choose:>");//请选择
scanf("%d",&input);
switch(input){
case 1:
game( );//三子棋游戏
break;
case 0:
printf("quit a game\n");//退出游戏
break;
default:
printf("please input again\n");//重新输入
break;
}
}
while(input);
return 0;
}
输出结果
游戏初始化准备
基本实现方式
通过菜单meun函数准备,直接用printf即可实现
void meun( ){
printf("**************************\n");
printf("********* 1. play ********\n");
printf("********* 0. exit ********\n");
printf("**************************\n");
}
棋盘的创建和打印
基本实现目的
1.创建一个较为美观的棋盘便于玩家观看
2.将棋盘各个位置置空,即空格
实现方法
主要通过循环打印出3行棋盘,每个棋盘之间有分割线,再通过双重循环使二维数组元素为空格
代码实现
//清空棋盘
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 displayboard(char board[ROW][COL],int row,int col){
int i = 0,j = 0;
printf("+---+---+---+\n");
for(i = 0;i < row;i++){
//打印数据
for(j = 0;j < col;j++){
printf("| %c ",board[i][j]);
}
printf("|\n");
//打印分割行
printf("+---+---+---+\n");
}
}
输出结果
玩家和电脑的棋子输入
目的
通过玩家和电脑的交替输出坐标,使对应棋盘上打印出棋子布局情况
注意事项
1.玩家实际上写的是从1开始的3*3坐标盘,但是在数组实现时数组起始下标为0,所以要在对应输入坐标中-1,才为数组下标。
2.电脑置棋子为随机,所以要用#include<stdlib.h>和#include<time.h>头文件,以及在主函数使用srand((unsigned int)time(NULL));然后将电脑的x,y分别取余3即可获得0到3的随机值
代码实现
void playmove(char board[ROW][COL],int row,int col){
int x = 0,y = 0;
printf("the player input:>\n");
while(1){
printf("please input coordinates:>");//输入坐标
scanf("%d%d",&x,&y);
if(x >= 1 && x <= row && y >= 1 && y <= col){
if(board[x-1][y-1] != ' '){
printf("this position is occupied,please input again\n");//已被占用,需重新输入
continue;
}
else{
board[x-1][y-1] = '*';
break;
}
}
else
printf("the input is illegal,please input again\n");//输入不合法,重新输入
}
}
void computemove(char board[ROW][COL],int row,int col){
printf("the computer:>\n");
while(1){
int x = rand() % row;//取得范围在0到3的随机值
int y = rand() % col;
if(board[x][y] == ' '){
board[x][y] = '#';
break;
}
}
}
输出结果
输赢结果的判断
目的
通过对于当前棋盘的局势判断本局结果,采用IsWin函数的返回值来判断结果,’*‘为玩家赢,’#'为电脑赢,'C’为继续,'Q’为平局
注意事项
1.一方赢的情况可分为横三,竖三或者对角线三种情况,要全部包含
2.平局只有在棋盘满了的情况下出现,可另写一个函数判断是否是平局
代码实现
//判断棋盘是否已满
int isfull(char board[ROW][COL],int row,int col){
for(int i = 0;i < row;i++){
for(int j = 0;j < col;j++){
if(board[i][j] != ' '){
return 0;
break;
}
}
}
return 1;
}
//判断输赢关系,赢了返回相应字符,平局返回'Q',继续返回'C'
char IsWin(char board[ROW][COL],int row,int col)
{
int i,j;
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(j = 0;j < col;j++){
if(board[0][j]==board[1][j] && board[1][j]==board[2][j] && board[1][j]!=' '){
return board[0][j];
}
}
if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ')
{
return board[1][1];
}
if(board[0][2]==board[1][1] && board[1][1]==board[2][0]&& board[1][1]!=' '){
return board[1][1];
}
if(isfull(board,row,col)){
return 'Q';
}
return 'C';
}
结果
game代码的实现
要在每一次输入后判断结果,以求接下的步骤
代码:
void game( ){
char board[ROW][COL];//初始化为空格
initboard(board,ROW,COL);
displayboard(board,ROW,COL);
while(1){
//玩家下棋
playmove(board,ROW,COL);
displayboard(board,ROW,COL);
if(IsWin(board,ROW,COL) != 'C'){
break;
}
//电脑下棋
computemove(board,ROW,COL);//随机下棋
displayboard(board,ROW,COL);
if(IsWin(board,ROW,COL) != 'C'){
break;
}
}
if(IsWin(board,ROW,COL) == '*'){
printf("the player win\n");
displayboard(board,ROW,COL);
}
if(IsWin(board,ROW,COL) == '#'){
printf("the computer win\n");
displayboard(board,ROW,COL);
}
if(IsWin(board,ROW,COL) == 'Q'){
printf("dogfall\n");//平局
displayboard(board,ROW,COL);
}
}
最终完整代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//清空棋盘
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 displayboard(char board[ROW][COL],int row,int col){
int i = 0,j = 0;
printf("+---+---+---+\n");
for(i = 0;i < row;i++){
//打印数据
for(j = 0;j < col;j++){
printf("| %c ",board[i][j]);
}
printf("|\n");
//打印分割行
printf("+---+---+---+\n");
}
}
void playmove(char board[ROW][COL],int row,int col){
int x = 0,y = 0;
printf("the player input:>\n");
while(1){
printf("please input coordinates:>");//输入坐标
scanf("%d%d",&x,&y);
if(x >= 1 && x <= row && y >= 1 && y <= col){
if(board[x-1][y-1] != ' '){
printf("this position is occupied,please input again\n");//已被占用,需重新输入
continue;
}
else{
board[x-1][y-1] = '*';
break;
}
}
else
printf("the input is illegal,please input again\n");//输入不合法,重新输入
}
}
void computemove(char board[ROW][COL],int row,int col){
printf("the computer:>\n");
while(1){
int x = rand() % row;//取得范围在0到3的随机值
int y = rand() % col;
if(board[x][y] == ' '){
board[x][y] = '#';
break;
}
}
}
//判断棋盘是否已满
int isfull(char board[ROW][COL],int row,int col){
for(int i = 0;i < row;i++){
for(int j = 0;j < col;j++){
if(board[i][j] != ' '){
return 0;
break;
}
}
}
return 1;
}
//判断输赢关系,赢了返回相应字符,平局返回'Q',继续返回'C'
char IsWin(char board[ROW][COL],int row,int col)
{
int i,j;
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(j = 0;j < col;j++){
if(board[0][j]==board[1][j] && board[1][j]==board[2][j] && board[1][j]!=' '){
return board[0][j];
}
}
if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ')
{
return board[1][1];
}
if(board[0][2]==board[1][1] && board[1][1]==board[2][0]&& board[1][1]!=' '){
return board[1][1];
}
if(isfull(board,row,col)){
return 'Q';
}
return 'C';
}
void meun( ){
printf("**************************\n");
printf("********* 1. play ********\n");
printf("********* 0. exit ********\n");
printf("**************************\n");
}
void game( ){
char board[ROW][COL];//初始化为空格
initboard(board,ROW,COL);
displayboard(board,ROW,COL);
while(1){
//玩家下棋
playmove(board,ROW,COL);
displayboard(board,ROW,COL);
if(IsWin(board,ROW,COL) != 'C'){
break;
}
//电脑下棋
computemove(board,ROW,COL);//随机下棋
displayboard(board,ROW,COL);
if(IsWin(board,ROW,COL) != 'C'){
break;
}
}
if(IsWin(board,ROW,COL) == '*'){
printf("the player win\n");
displayboard(board,ROW,COL);
}
if(IsWin(board,ROW,COL) == '#'){
printf("the computer win\n");
displayboard(board,ROW,COL);
}
if(IsWin(board,ROW,COL) == 'Q'){
printf("dogfall\n");//平局
displayboard(board,ROW,COL);
}
}
int main( ){
srand((unsigned int)time(NULL));
int input = 0;
do{
meun( );
printf("please choose:>");//请选择
scanf("%d",&input);
switch(input){
case 1:
game( );//三子棋游戏
break;
case 0:
printf("quit a game\n");//退出游戏
break;
default:
printf("please input again\n");//重新输入
break;
}
}
while(input);
return 0;
}
输出
更多情况请自行尝试