c语言"黑框框"下不忍直视的三子棋实现

今天发一个界面丑到爆,无比Low的三子棋程序

同样,win32 无图形界面

输入坐标进行交互,

X代表玩家下子,0代表电脑下子(rand()函数随机产生合法坐标落子),率先连成三子则胜利。棋盘满未连成三子则平局。

程序比较简单直接发源码.三个块,game.h代表程序所需头文件、宏定义、函数声明,test.c代表程序游戏逻辑,game.c代表程序定义函数实现.

代码未优化,尽请见谅.

game.h:

/*
此头文件包含test.c所需头文件及相关函数声明
*/

#ifndef __GAME_H__
#define __GAME_H__

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

//定义棋盘的行数与列数
#define ROWS 3
#define COLS 3

//打印菜单
void menu(void);

//初始化棋盘
void init(char board[][COLS], int rows);	

//打印棋盘
void print(char board[][COLS], int rows);

//游戏环节
void play(char board[][COLS], int rows);						

//通过检查棋盘是否已满判断是否和棋
int checkfull(char board[][COLS], int rows);

//检查是否有人获胜
int checkwin(char board[][COLS], int rows);

//玩家玩
void player(char board[][COLS], int rows);	

//电脑玩
void computer(char board[][COLS], int rows);	

//检查是否有人获胜or平局
int check(char board[][COLS], int rows);	

#endif

test.c:

/*
三子棋游戏逻辑
*/

#include "game.h"

int main(void)
{

	int input;								//存放用户输入选项 

	char board[ROWS][COLS];							//存放棋盘

	menu();									//打印菜单

	scanf("%d", &input);							//接受用户输入

	while( input )
	{
		init(board, ROWS);						//初始化棋盘

		print(board, ROWS);						//打印棋盘

		play(board, ROWS);						//进行游戏

		menu();								//打印菜单

		scanf("%d", &input);						//再次接受用户输入
	}
										//游戏结束

	printf("\nBye!\n");							//程序结束

	return 0;

}

game.c:

/*
此源代码包含test.c函数实现
*/

#include "game.h"

//打印菜单
void menu(void)
{
	printf("**********************\n");
	printf("*****   1.play   *****\n");
	printf("*****   0.exit   *****\n");
	printf("**********************\n");
}

//初始化棋盘
void init(char board[][COLS], int rows)
{
	int r;
	int c;

	for( r = 0; r < rows; r++ )
		for( c = 0; c < COLS; c++ )
			board[r][c] = ' ';							//游戏未开始时将棋子所在位置初始化为空格
}

//打印棋盘
void print(char board[][COLS], int rows)
{
	int r;
	int c;

	for( r = 0; r < rows; r++)
	{
		for( c = 0; c < COLS; c++)
		{
			printf(" %c ", board[r][c]);

			if( c < 2 )								//打印两次 "|"
				printf("|");
		}

		printf("\n");

		if( r == 2 )									//打印棋盘最后一行时规则不同
			printf("   |   |   ");
		else
			printf("___|___|___");

		printf("\n");
	}
}

//检查是否有人获胜or平局
int check(char board[][COLS], int rows)
{
		int ret;									//接受棋盘是否已满返回值
		int flag;									//接受是否获胜返回值

		flag = checkwin(board, rows);					<span style="white-space:pre">		</span>//检查是否有人获胜

		if( flag == 1 )									//flag为1玩家胜
		{
			printf("你赢了!\n");
			return 1;
		}
		else if( flag == 0 )							<span style="white-space:pre">	</span>//flag为0电脑胜
		{
			printf("呵呵!\n");
			return 1;
		}

		ret = checkfull(board, rows);					<span style="white-space:pre">		</span>//如若前面为无人获胜,则此处通过检查棋盘是否已满判断是否和棋

		if( ret == 1 )									//ret为1 则棋盘满 和棋
		{
			printf("和棋!\n");
			return 1;
		}

		return 0;									//返回1 则此局结束, 返回0 则此局未结束!
}

//通过检查棋盘是否已满判断是否和棋
int checkfull(char board[][COLS], int rows)
{
	int r;
	int c;

	for( r = 0; r < rows; r++ )
		for( c = 0; c < COLS; c++ )
			if( ' ' == board[r][c])
				return 0;							//返回0 代表棋盘未满

	return 1;										//返回1 代表棋盘已满
}

//检查是否有人获胜
int checkwin(char board[][COLS], int rows)
{
	int r;
	int c;

	for( r = 0; r < rows; r++ )							<span style="white-space:pre">	</span>//判断3行情况下是否有人获胜
	{
		if( (board[r][0] == board[r][1])
			&& (board[r][1] == board[r][2])
			&& (board[r][2] == 'x') )					<span style="white-space:pre">	</span>//x为玩家落子
			return 1;								//返回1 玩家胜

		if( (board[r][0] == board[r][1])
			&& (board[r][1] == board[r][2])
			&& (board[r][2] == '0') )				<span style="white-space:pre">		</span>//0为电脑落子
			return 0;								//返回0 电脑胜
	}

	for( c = 0; c < COLS; c++ )					    	<span style="white-space:pre">		</span>//判断3列情况下是否有人获胜
	{
		if( (board[0][c] == board[1][c])
			&& (board[1][c] == board[2][c])
			&& (board[2][c] == 'x') )					<span style="white-space:pre">	</span>//x为玩家落子
			return 1;								//返回1 玩家胜

		if( (board[0][c] == board[1][c])
			&& (board[1][c] == board[2][c])
			&& (board[2][c] == '0') )					<span style="white-space:pre">	</span>//0为电脑落子
			return 0;								//返回0 电脑胜
	}

		if( (board[0][0] == board[1][1])				<span style="white-space:pre">		</span>//下面为判断对角线情况是否有人获胜
			&& (board[1][1] == board[2][2])
			&& (board[2][2] == 'x') )
			return 1;

		if( (board[0][0] == board[1][1])
			&& (board[1][1] == board[2][2])
			&& (board[2][2] == '0') )
			return 0;

		if( (board[0][2] == board[1][1])
			&& (board[1][1] == board[2][0])
			&& (board[2][0] == 'x') )
			return 1;

		if( (board[0][2] == board[1][1])
			&& (board[1][1] == board[2][0])
			&& (board[2][0] == '0') )
			return 0;
}

//玩家玩
void player(char board[][COLS], int rows)
{
	int x;
	int y;

	while( 1 )
	{
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);

		if( board[x - 1][y - 1] == ' ' )				<span style="white-space:pre">	</span>//玩家会将数组位置 0.0 视为 1.1 所以此处对 x y 分别减1
		{
			board[x - 1][y - 1] = 'x';

			break;
		}
		else
		{
			printf("位置不合法!\n");
		}
	}//退出while循环

	print(board, rows);								//打印更新后棋盘
}

//电脑玩
void computer(char board[][COLS], int rows)
{
	int x;
	int y;

	srand((unsigned)time(NULL));

	while( 1 )
	{

		x = rand() % 3;
		y = rand() % 3;

		if( board[x][y] == ' ' )
		{
			board[x][y] = '0';

			break;
		}

	}//退出循环

	printf("电脑玩!\n");
	print(board, rows);								//打印更新后的棋盘
}

//游戏环节
void play(char board[][COLS], int rows)
{
	while(1)
	{

		player(board, rows);							//玩家玩

		if( check(board, rows) )						//检查是否有人获胜or平局
			break;								

		computer(board, rows);							//电脑玩

		if( check(board, rows) )						//检查是否有人获胜or平局
			break;										

	}//退出while循环
}
时间: 2024-10-13 01:18:41

c语言"黑框框"下不忍直视的三子棋实现的相关文章

三子棋分析与实现——C语言

三子棋作为一款经典的小游戏,对于初学C语言的我们如果 可以熟练了解并可以实现其游戏功能,则对于以后更系统的学习C语言有很好帮助.下来我分享一下我在编程时的感悟和代码 首先介绍一下三子棋规则:只要将自己的棋连成一条线(行,列,斜线),即为赢如图: 先根据图和玩法大致有个思路: 1.我们可以将棋盘看做是一个三行三列的二维数组,且每行每列用线隔开以便区分2.分为电脑下棋和玩家下棋(电脑先下和玩家先下)3.判断输赢(玩家赢,电脑赢和平局) 大致思路即为上面分析,下面开始写代码: 创建tset.c,gam

C,C++,使得控制台的黑框框全屏显示

有时候C,C++运行的结果有比较多的数据,或者大一新生要做个学生管理系统界面时,运行C,C++出来的黑框框控制台,是不是觉得很小?下面是一个全屏的函数,只要在主函数中第一行调用它,就可以了.然后其他基本不影响.(该函数只要吧windows.h包含进来即可) 1 void FullScreen(){ 2 HWND hwnd=GetForegroundWindow(); 3 int x=GetSystemMetrics(SM_CXSCREEN)+300; 4 int y=GetSystemMetri

C语言 三子棋 小游戏

//C语言 三子棋 小游戏 //棋盘为3x3大小,电脑棋子 X ,玩家 O : //用命令窗口模拟3子棋,玩家与电脑轮流下,先连成3子判赢:无路可走判平局 #include<stdio.h> #include<string.h> #include<windows.h> int judge_is_moved(char arr[][12], int place); void print_chessboard(char arr[][12])//输出棋盘 { int i = 0

空闲时间用C语言写了下2048游戏

本身这个游戏逻辑挺简单的,所以,不多说了,直接上代码吧 #include <climits> #include <cstdio> #include <cstring> #include <stack> #include <string> #include <map> #include <vector> #include <cmath> using namespace std; const int MAXX =

Java语言Lang包下常用的工具类介绍_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现. 在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Webs

每天一点GO语言——Linux环境下安装Go语言环境以及编写Go语言程序初体验

每天一点GO语言--Linux环境下安装Go语言环境以及编写Go语言程序初体验 一.安装Go语言环境 [[email protected] opt]# yum -y install wget git [[email protected] opt]# wget -c https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz [[email protected] opt]# tar -zxvf go1.10.3.linux-amd64

写一个三子棋小游戏的感悟

在写之前,我已经把函数的结构设计出来,主要由以下几个函数实现: 1:初始化棋框 2:玩家下棋 3:电脑下棋 4:判断胜负 5:更新棋框 6:主函数 在写的过程中碰到了不能将玩家下的位置放入棋框中,原因是在函数定义过程中没有将二维数组引入, 导致棋框更新不正确,在函数中引用二维数组时,因为c语言编译系统不检查第一维的大小,只要第二维大小相同,形参数组第一维可以与实参不同,因此在函数定义时只需要写int qk(arr[][i]),i为常数,在主函数调用时只需要写qk(arr)即可,因为数组名本身就是

三子棋(微智能)

今天总结了这一段时间来的学习,写了一个三子棋的程序,纯C语言的小游戏,简单易写,这也花了我两三天时间,整个程序主要分为:测试程序test.c,游戏程序game.c,头文件引用game.h;主要的函数有:初始化棋盘 void init_board,打印棋盘print_board,玩家移动player_move,电脑移动computer_move,判断是否有胜利IsWin,判断棋盘是否满了IsFull:话不多说,上代码test.c#define _CRT_SECURE_NO_WARNINGS 1#i

P1838 三子棋I

题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 由于小a比较愚蠢,uim总是让他先. 我们用9个数字表示棋盘位置: 123 456 789 所有的棋谱都是已经结束的棋局,要么一方获胜,要么平局. 今天,他们下了一下午的棋,小a为了提高技术,录下了很多棋谱.他想知道,一盘棋结束时,到底是谁赢. 输入输出格式 输入格式: 一行,一串数字,表示落子的地点.小a总是先下 输出格式: 一行,如果小a赢,输出"xiaoa wins.&