程序员成长之旅——C语言三子棋

简易介绍三子棋

进行了这么多天的c语言学习,今天给大家讲一下三子棋是如何用c语言实现的,当然作为新手写出来的有点挫,但是在不断的学习中还是可以进行不断的优化,发表一篇博客就是想记录一下自己水平提升的过程。

首先我们大家都玩过三子棋吧,它的规则就是在一个九宫格上三点成一线,无论是横,竖,还是对角线,只要有一方成一线就赢了。

如果大家有人没接触过这个游戏的话,也没关系,可以看一下这个
https://baijiahao.baidu.com/s?id=1628268798449120927&wfr=spider&for=pc

现在应该都了解了吧!接下来就是运用c语言编程这个游戏了。

三子棋编程过程

首先一个游戏的话它是需要一个菜单的,运用printf就可以实现

void menu()
{
 	printf("****************************\n");
 	printf("***  1.play     0.exit   ***\n");
 	printf("****************************\n");
}

而这个既然有选项,我们可以用一个函数接收它

void test()
{
 	int input = 0;
 	srand((unsigned int)(time(NULL)));
 	do
 	{
  		menu();
  		printf("请选择:> ");
  		scanf_s("%d", &input);
  		switch (input)
  		{
  		case 1:
   			game();
   			break;
  		case 0:
   			printf("退出游戏\n");
   			break;
  		default:
   			printf("选择无效,请重新选择\n");
   			break;
  		}
		} while (input);
}

这些都需要在主函数中实现

int main()
{
 	test();
 	system("pause");
 	return 0;
}

接下来就到了此游戏的重点了,可创建一个game()函数,然后一步一步的实现此游戏

void game()
{

}

程序开始阶段我们可以在头文件引入宏定义,这是方便后续修改

#define ROW 3
#define COL 3

接着在game()函数中创建数组

char board[ROW][COL]={0};

然后初始化棋盘
memset需要引入头文件

#include<string.h>
void InitBoard(char board[ROW][COL], int row, int col)
{
 	memset(board, ' ', row * col * sizeof(board[0][0]));
}

打印棋盘

void DisplayBoard(char board[ROW][COL], int row, int col)
{
 	int i = 0;
 	for (i = 0; i < row; i++)
 	{
  		int j = 0;
  		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");
  		}
 	}
}

打印出来就是这个界面
在这里插入图片描述
接下来就是玩家与电脑走的过程

void PlayerMove(char board[ROW][COL], int row, int col)
{
 	int x = 0;
 	int y = 0;
 	printf("玩家走:> \n");
 	while (1)
 	{
  		printf("玩家请输入坐标:> \n");
  		scanf_s("%d %d", &x, &y);
  	if (x >= 1 && x <= row && y >= 1 && y <= col)
  	{
   		if (board[x-1][y-1] == ' ')
   	{
    		board[x-1][y-1] = 'X';
    		break;
   	}
   	else
    		printf("坐标被占用,请重新输入!\n");
  	}
  	else
   		printf("坐标非法,请重新输入!\n");
 	}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
 	printf("电脑走:>\n");
 	while (1)
 	{
  		int x = rand() % row;
  		int y = rand() % col;
  		if (board[x][y] == ' ')
  		{
   			board[x][y] = '0';
  			break;
  		}
	}
}

电脑走的话需要生成随机数因此引入头文件

#include<time.h>

最后就是判断输赢

int IsFull(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++)
  	{
   	if (board[i][j] == ' ')
    	return 0;
  	}
 	}
 	return 1;
}
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][1] == board[i][2] && board[i][1] != ' ')
  	{
   		return board[i][0];
  	}
 	}
	for (i = 0; i < col; i++)
 	{
  		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
  	{
   	return board[0][i];
  	}
 	}
 	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 ' ';
}

而这些都需要在game()函数中包含,所以game()的扩充是

void game()
{
 	char board[ROW][COL] = { 0 };
 	char ret = 0;
 	InitBoard(board, ROW, COL);//初始化数组
 	DisplayBoard(board, ROW, COL);//打印数组-界面
 	while (1)
 	{
  		PlayerMove(board, ROW, COL);
  		ret=IsWin(board, ROW, COL);
  		if (ret != ' ')
  		{
   			break;
  		}
  	DisplayBoard(board, ROW, COL);
  	ComputerMove(board, ROW, COL);
  	ret=IsWin(board, ROW, COL);
  	if (ret != ' ')
  	{
   		break;
  	}
 	DisplayBoard(board, ROW, COL);
 	}
 	DisplayBoard(board, ROW, COL);
 	if (ret == 'X')
 	{
  		printf("玩家赢\n");
 	}
 	else if (ret == '0')
 	{
  		printf("电脑赢\n");
 	}
 	else if (ret == 'Q')
 	{
  		printf("平局\n");
 	}
}

三子棋代码总览

将上面的程序一结合,这个三子棋小游戏就被我们完成了,我是用了一个头文件和两个源文件实现这个小游戏的。

game.h
#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define ROW 3
#define COL 3

void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(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 IsWin(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);


#endif

game.c
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
  memset(board, ' ', row * col * sizeof(board[0][0]));
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    int j = 0;
    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");
    }
  }
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("玩家走:> \n");
 while (1)
 {
  printf("玩家请输入坐标:> \n");
  scanf_s("%d %d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
   if (board[x-1][y-1] == ' ')
   {
    board[x-1][y-1] = 'X';
    break;
   }
   else
    printf("坐标被占用,请重新输入!\n");
  }
  else
   printf("坐标非法,请重新输入!\n");
 }
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
 printf("电脑走:>\n");
 while (1)
 {
  int x = rand() % row;
  int y = rand() % col;
  if (board[x][y] == ' ')
  {
   board[x][y] = '0';
   break;
  }
 }
}
int IsFull(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++)
  {
   if (board[i][j] == ' ')
    return 0;
  }
 }
 return 1;
}
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][1] == board[i][2] && board[i][1] != ' ')
  {
   return board[i][0];
  }
 }
 for (i = 0; i < col; i++)
 {
  if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
  {
   return board[0][i];
  }
 }
 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 ' ';
}
test.c
#include"game.h"
void menu()
{
 printf("****************************\n");
 printf("***  1.play     0.exit   ***\n");
 printf("****************************\n");
}
void game()
{
 char board[ROW][COL] = { 0 };
 char ret = 0;
 InitBoard(board, ROW, COL);//初始化数组
 DisplayBoard(board, ROW, COL);//打印数组-界面
 while (1)
 {
  PlayerMove(board, ROW, COL);
  ret=IsWin(board, ROW, COL);
  if (ret != ' ')
  {
   break;
  }
  DisplayBoard(board, ROW, COL);
  ComputerMove(board, ROW, COL);
  ret=IsWin(board, ROW, COL);
  if (ret != ' ')
  {
   break;
  }
  DisplayBoard(board, ROW, COL);
 }
 DisplayBoard(board, ROW, COL);
 if (ret == 'X')
 {
  printf("玩家赢\n");
 }
 else if (ret == '0')
 {
  printf("电脑赢\n");
 }
 else if (ret == 'Q')
 {
  printf("平局\n");
 }
}
void test()
{
 int input = 0;
 srand((unsigned int)(time(NULL)));
 do
 {
  menu();
  printf("请选择:> ");
  scanf_s("%d", &input);
  switch (input)
  {
  case 1:
   game();
   break;
  case 0:
   printf("退出游戏\n");
   break;
  default:
   printf("选择无效,请重新选择\n");
   break;
  }
 } while (input);
}
int main()
{
 test();
 system("pause");
 return 0;
}

上面三子棋运行结果如下图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零出发——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值