栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

简单的小游戏,C语言六步实现三字棋

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简单的小游戏,C语言六步实现三字棋

文章目录
  • 一、三子棋
  • 二、步骤
    • 1.创建初始界面
    • 2.创建棋盘并初始化
    • 3.打印棋盘
    • 4.玩家下棋
    • 5.电脑下棋
    • 6.判断胜负
    • 7、代码实现
      • 试玩一局


一、三子棋

三子棋是一款经典小游戏,用C语言实现它也是一个很奇妙的过程,下面就开始详细讲解具体步骤.。

  1. 创建初始界面
  2. 创建棋盘并初始化
  3. 打印棋盘
  4. 玩家下棋
  5. 电脑下棋
  6. 判断输赢

我们需要有三个文件如下:

  1. test.c —— 测试游戏
  2. game.h —— 游戏函数的声明
  3. game.c —— 游戏函数的实现

’

二、步骤 1.创建初始界面

开始界面输入1进入游戏,而输入则退出游戏

代码如下(示例):

void initprint() {
	printf("--------------------------n");
	printf("                          n");
	printf("         1.start          n");
	printf("         0.exit           n");
	printf("                          n");
	printf("--------------------------n");
	printf("n");
	printf("n");
}

那么我们该如何实现这操作呢?
我们应该在主函数里面实现,通过do……while和switch简单实现。

int main() {
	int input=0;
	do {
		initprint();//调用初始化界面
		printf("请选择:> ");
	    scanf("%d", &input);//输入数据
		switch (input)
		{
		case 1:
			game();//进入游戏
			break;
		case 0:
			printf("退出n");
			break;
		default:
			printf("选择错误,重新选择n");	
	**加粗样式**		break;
		}
	} while (input);
}

2.创建棋盘并初始化

三子棋想必大家都听过,棋盘为3x3的格子,那么我们就用一个char board【3】【3】的二维数组来实现。

代码如下(示例):

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

这里我采用宏定义:

#define ROW 3
#define COL 3

使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

如果在打印棋盘前未对数组进行初始化就会打印空字符(null),这就会对棋盘的美观程度造成影响。

所以我们在打印棋盘前首先要对数组进行初始化,在数组存入一个字符。存什么才不会影响呢,只有把空格存进去才行。

代码如下(示例):

void initboard(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++)
		board[i][j] = ' ';
	}
}

3.打印棋盘

在完成棋盘的初始化操作后,我们需要将初始化后的棋盘展现出来,以便玩家知道棋盘上的棋子落点。

代码如下(示例):

void displayboard(char board[ROW][COL], int row, int col) {
	printf("+---+---+---+n");
	for (int i = 0; i < row; i++) {
		printf("| %c | %c | %c |n", board[i][0], board[i][1], board[i][2]);
		printf("+---+---+---+n");
	}


4.玩家下棋

玩家下棋需要注意几点:
1.玩家不知道数组下标从零开始,所以要实现坐标减一操作
2.要判断数组是否有越界
3.要判段是否有坐标已被占用

代码如下(示例):

void player_move(char board[ROW][COL], int row, int col) {
	int x=0, y=0;
	while (1) {
		printf("玩家下棋,请输入你想要下的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断数组是否有越界
		 {
			if (board[x - 1][y - 1]==' ') //判段是否有坐标已被占用
			{
				board[x - 1][y - 1] = 'O';
				break;
			}
			else {
				printf("输入坐标有误,该坐标已被占用n");
			}
		}
		else 
			printf("输入坐标有误n");
	}
}


5.电脑下棋

由于水平有限,电脑下棋是通过随机数来实现的。

srand((unsigned int)time(NULL));//随机种子,放在主函数里就行了

代码如下(示例):

void ai_move(char board[ROW][COL], int row, int col) {
	while (1) {
		int x = rand() % row;//%3-> 0~2的数字
		int y = rand() % col;
		if (board[x ][y ]==' ') {
			board[x ][y ] = 'X';//电脑实现下棋
			break;
		}
	}
}

6.判断胜负

1.判定玩家胜利
(1)一行中有三个棋子
(2)一列中有三个棋子
(3)对角线有三个棋子

2.判断是否平局
(1)‘x’ 表示玩家获胜
(2)‘o’ 表示电脑获胜
(3)’ C’ 表示胜负未分
(4) ‘Q’ 表示和棋

这个用static修饰,代表不可修改

static int is_full(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;
			}
	}
	return 1;
}

char is_win(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		if (board[i][1] == board[i][2] && board[i][0] == board[i][1] && board[i][0] != ' ') //判定所有的行
		{
			return board[i][0];
		}	
	}
	for (int 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[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 (is_full(board, ROW, COL) == 1) {
		return 'Q';
	}
	else return'C';
}
7、代码实现
//game.h头文件
#pragma once
#include
#include 
#include 
#include 
#include

#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 player_move(char board[ROW][COL], int row, int col);//玩家下棋
void ai_move(char board[ROW][COL], int row, int col);//电脑下棋
char is_win(char board[ROW][COL], int row, int col);//判断输赢

//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void initboard(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++)
			board[i][j] = ' ';
	}
}


void displayboard(char board[ROW][COL], int row, int col) {
	printf("+---+---+---+n");
	for (int i = 0; i < row; i++) {
		printf("| %c | %c | %c |n", board[i][0], board[i][1], board[i][2]);
		printf("+---+---+---+n");
	}
}

void player_move(char board[ROW][COL], int row, int col) {
	int x=0, y=0;
	while (1) {
		printf("玩家下棋,请输入你想要下的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col) {
			if (board[x - 1][y - 1]==' ') {
				board[x - 1][y - 1] = 'O';
				break;
			}
			else {
				printf("输入坐标有误,该坐标已被占用n");
			}
		}
		else 
			printf("输入坐标有误n");

	}

}
void ai_move(char board[ROW][COL], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (board[x ][y ]==' ') {
			board[x ][y ] = 'X';
			break;
		}
	}
}
static int is_full(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;
			}
	}
	return 1;
}


char is_win(char board[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		if (board[i][1] == board[i][2] && board[i][0] == board[i][1] && board[i][0] != ' ') {
			return board[i][0];
		}	
	}
	for (int 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[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 (is_full(board, ROW, COL) == 1) {
		return 'Q';
	}
	else return'C';
}

//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include
void initprint() {
	printf("--------------------------n");
	printf("                          n");
	printf("         1.start          n");
	printf("         0.exit           n");
	printf("                          n");
	printf("--------------------------n");
	printf("n");
	printf("n");
}

void game() {
	int ret;
	char board[ROW][COL] = { 0 };
	initboard(board,ROW, COL);
	displayboard(board, ROW, COL);
	while (1) {
		player_move(board, ROW, COL);
	
		ret = is_win(board, ROW, COL);
		if (ret != 'C')break;
		Sleep(100);
		system("cls");//清空屏幕
		ai_move(board, ROW, COL);
		displayboard(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')break;
		
	}

	Sleep(500);
	system("cls");
	if (ret == 'O')
	{
		printf("玩家赢n");
	}
	else if (ret == 'X')
	{
		printf("电脑赢n");
	}
	else if (ret == 'Q')
	{
		printf("平局n");
	}
	displayboard(board, ROW, COL);


}

int main() {
	int input=0;
	
	srand((unsigned int)time(NULL));
	do {
		initprint();
		printf("请选择:> ");
	    scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出n");
			break;
		default:
			printf("选择错误,重新选择n");	
			break;
		}
	} while (input);
}
//
试玩一局

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号