经典三子棋小游戏(C语言版)

三子棋简介

是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

具体思路

玩家和电脑各自执棋,首先在屏幕上显示棋盘状况(规定玩家的棋子为’x‘,电脑的棋子为’0‘),玩家通过输入坐标选择下一步落子的位置,代码判断局势情况,若没有分出胜负且棋盘未满则电脑落子,电脑以生成随机数的方式走,在每一次玩家或者电脑落子后都要判断当前情况,若棋盘满则为和棋。

代码实现

这个小游戏我采用的是多文件编程,所有的头文件整合在game.h中,game.c为所有的游戏模块函数,main函数为主体部分。多文件

头文件game.h

#ifndef _GAME_H_
#define _GAME_H_

#include<stdio.h>
#include<time.h>
#include<windows.h>

#define ROW 3
#define COL 3

#define P_COLOR 'X'
#define C_COLOR 'O'

void Menu();                                                  //菜单显示函数
void DrawBoard(char board[][COL], int row, int col);          //棋盘显示函数
void PlayMove(char board[][COL], int row, int col);           //玩家落子函数
void ComputerMove(char board[][COL], int row, int col);       //电脑落子函数	
char Judge(char board[][COL], int row, int col);              //判断哪一方胜出函数
void Game();                                                  //主游戏函数

#pragma warning(disable:4996)

#endif

在头文件中定义棋盘的大小,3行3列 #define ROW 3,#define COL 3,玩家落子为’x‘,电脑落子为’o‘

主函数main.c

int main() {
	int quit=0;
	while (!quit) {
		int select;
		Menu();
		printf("请输入你的选项\n");
		scanf("%d", &select);
		switch (select) {
		case 1:
			Game();
			break;
		case 2:
			printf("退出!");
			quit =1 ;	
			break;
		default:
			printf("你输入的有误,请重新输入\n");
			break;
		}
	}
	printf("Bye,Bye!\n");
	system("pause");
	return 0;
}	

主函数为整个游戏的控制部分,通过玩家输入的数字来执行各部分代码。

游戏文件game.c

棋盘显示函数

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

对棋盘进行显示,在每一行每一列标上序号,并且棋盘内容为空。
显示如下
在这里插入图片描述

玩家落子函数

void  PlayMove(char board[][COL], int row, int col) {
	int x = 0;
	int y = 0;
	while (1) {
		printf("请输入你下一步的位置");
		scanf("%d %d", &x, &y);
		if (x < 1 || x>3 || y < 1 || y>3) {
			printf("输入有误,请重新输入\n");
			continue;
		}
		if (board[x - 1][y - 1] != ' ') {
			printf("该位置已有棋子,请重新输入\n");
			continue;
		}
		board[x - 1][y - 1] = P_COLOR;
		return;
	}
}

玩家通过键盘输入落子的左边,代码判断此位置是否输入正确,输入超过棋盘范围会让玩家重新输入,如该位置已有棋子,也会让玩家重新输入,若判断都没有问题,则在棋盘该位置落子。

电脑落子函数

void ComputerMove(char board[][COL], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ') {
			board[x][y] = C_COLOR;
			break;
		}
	}
}

电脑落子的位置用<time.h>头文件的srand()函数的随机数种子生成随机数并取横竖列的模除来满足上述条件。并且在该位置为空的情况下落子。

判断函数

char Judge(char board[][COL], int row, int col) {
	for (int 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 (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[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && \
		board[1][1] == board[2][0] && \
		board[2][0] != ' ')
		return board[0][2];

	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 'N';
			}
		}
	}
	return 'P';
}

三子棋获胜的条件是横或者竖或交叉连续三个棋子一样则为获胜,若棋盘满后还未分出胜负,则为平局。满足获胜条件返回’N‘,平局则返回’P‘
在这里插入图片描述

具体代码

// game.h
#ifndef _GAME_H_
#define _GAME_H_

#include<stdio.h>
#include<time.h>
#include<windows.h>

#define ROW 3
#define COL 3

#define P_COLOR 'X'
#define C_COLOR 'O'

void Menu();                                                  //菜单显示函数
void DrawBoard(char board[][COL], int row, int col);          //棋盘显示函数
void PlayMove(char board[][COL], int row, int col);           //玩家走
void ComputerMove(char board[][COL], int row, int col);       //电脑走	
char Judge(char board[][COL], int row, int col);              //判断哪一方胜出函数
void Game();                                                  //主游戏函数

#pragma warning(disable:4996)

#endif
// game.c
#include"game.h"


void Menu() {
	printf("------------------------------\n");
	printf("------1.Enter Game------------\n");
	printf("------2.Quit------------------\n");
	printf("------------------------------\n");
}


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


void  PlayMove(char board[][COL], int row, int col) {
	int x = 0;
	int y = 0;
	while (1) {
		printf("请输入你下一步的位置");
		scanf("%d %d", &x, &y);
		if (x < 1 || x>3 || y < 1 || y>3) {
			printf("输入有误,请重新输入\n");
			continue;
		}
		if (board[x - 1][y - 1] != ' ') {
			printf("该位置已有棋子,请重新输入\n");
			continue;
		}
		board[x - 1][y - 1] = P_COLOR;
		return;
	}
	
}


void ComputerMove(char board[][COL], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ') {
			board[x][y] = C_COLOR;
			break;
		}
	}
}

char Judge(char board[][COL], int row, int col) {
	for (int 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 (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[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && \
		board[1][1] == board[2][0] && \
		board[2][0] != ' ')
		return board[0][2];

	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 'N';
			}
		}
	}

	return 'P';

}


void Game() {
	srand((unsigned long)time(NULL));
	char board[ROW][COL];
	memset(board, ' ',sizeof(board));
	char win = '\0';
	do {
		DrawBoard(board, ROW, COL);
		PlayMove(board, ROW, COL);
		win = Judge(board, ROW, COL);
		if (win != 'N') {
			break;
		}
		ComputerMove(board, ROW, COL);
		win = Judge(board, ROW, COL);
		if (win != 'N') {
			break;
		}
	} while (1);
	switch (win) {
	case(P_COLOR):
		printf("You win\n");
		break;
	case(C_COLOR):
		printf("You lose\n");
		break;
	case('P'):
		printf("平局\n");
	default:
		break;
	}
	DrawBoard(board, ROW, COL);
	return;

}
// main.c
#include "game.h"

int main() {
	int quit=0;
	while (!quit) {
		int select;
		Menu();
		printf("请输入你的选项\n");
		scanf("%d", &select);
		switch (select) {
		case 1:
			Game();
			break;
		case 2:
			printf("退出!");
			quit =1 ;	
			break;
		default:
			printf("你输入的有误,请重新输入\n");
			break;
		}
	}
	printf("Bye,Bye!\n");
	system("pause");
	return 0;
}	
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值