用C语言编写三子棋小游戏
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写三子棋小游戏相关的知识,希望对你有一定的参考价值。
一.前言
代码中运用多文件编码方式,调用函数,运用数组进行传参。加深对多文件编码和对数组的理解。
二.实现功能
首先给出菜单,通过用户输入指定玩游戏或者退出。当用户选择退出时,程序运行结束。当用过户选择玩游戏时,输出棋盘,用户需要输入要落子的坐标,然后电脑会随机在棋盘上落子。显示棋盘,直到棋盘上有三子连成一条线或者棋盘上下完,没有一子,三子连成一条线。输出赢家或和棋。
三.代码编写
在编写程序时,首先我们要进行主函数的编写,确定主要逻辑。代码块如下:
#include"threechess.h"
int main(){
int quit = 0;//是否结束标志
while (!quit){
Menu();
int select = 0;
printf("Please Enter Your Select#");
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 2:
quit = 1;
break;
default:
printf("Enter error!\\n");
break;
}
}
printf("Byebye!\\n");
system("pause");
return 0;
}
在主函数中首先我们要编写一个菜单函数Menu(),供用户选择是否玩游戏。
void Menu(){
printf("+--------------------+\\n");
printf("|-1.Play 2.Exit-|\\n");
printf("+--------------------+\\n");
}
当用户选择玩游戏时,我们要进行对Game()函数的编写来确定游戏函数的编写逻辑。
首先我们要确定三子棋中棋子保存在一个二维数值中。然后要将棋盘显示并且将棋盘中的棋子初始化。当用户确定落子坐标时,我们要考虑 1.落子位置是否已经有子了,2.是否超过了棋盘。然后要进行判断,是否有三子连线,当电脑落子后也要进行这一判断。直到有人胜出或者和棋。
void Game(){
srand((unsigned long)time(NULL));//生成随机数种子
char board[ROW][COL];
char result = 0;
memset(board, INIT, sizeof(board));//将数组初始化为INIT
while (1){
Showboard(board, ROW, COL);
Playmove(board, ROW, COL);
result = Judgeboard(board, ROW, COL);
if (result != NEXT){
break;
}
Showboard(board, ROW, COL);
Computermove(board, ROW, COL);
result = Judgeboard(board, ROW, COL);
if (result != NEXT){
break;
}
}
Showboard(board, ROW, COL);
switch (result){
case COM:
printf("You Lose!\\n");
break;
case PLAY:
printf("You Win!\\n");
break;
case DRAW:
printf("Tie Game!\\n");
break;
default:
printf("BUG!\\n");
break;
}
}
在游戏函数中
用的memset函数初始化棋盘,注意是按字节初始化的。
memset(board, INIT, sizeof(board));//将数组初始化为INIT
void Showboard;用来展示棋盘。
static void DrawLine(int col){ //棋盘画线函数
for (int i = 0; i < col; i++){
printf("----");
}
printf("\\n");
}
static void Showboard(char board[][COL],int row,int col){ //画棋盘
system("cls"); //清屏
printf(" ");
for (int i = 1; i < row + 1; i++){
printf("|%d ", i);
}
printf("\\n");
DrawLine(col);
for (int i = 1; i < row + 1; i++){
printf("%-2d", i);
for (int j = 1; j < col+1; j++){
printf("|%c ", board[i-1][j-1]);
}
printf("\\n");
DrawLine(col);
}
}
void Computermove;函数用来电脑落子,通过电脑产生随机数对3取模,形成坐标。
static void Computermove(char board[][COL], int row, int col){//电脑下棋
int x = 0;
int y = 0;
while (1){
x = rand() % row; //时间随机数 余3,只可能为0 1 2
y = rand() % col;
if (board[x][y] == INIT){ //判断是否未落子
break;
}
}
board[x][y] = COM;
}
char Judgeboard;此函数用来进行判断是否有三子连线,是否棋盘被下满了。若有三子相同返回对应的棋子,和棋返回‘DRAW',继续往下下返回‘NEXT’。注意相同时要去除 ‘ ’ 情况。
static char Judgeboard(char board[][COL], int row, int col){//判断情况,行 列 对角线是否有三子连线
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && \\
board[i][0] == board[i][2] && \\
board[i][0] != INIT){
return board[i][0];
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j] && \\
board[0][j] == board[2][j] && \\
board[0][j] != INIT){
return board[0][j];
}
}
if (board[0][0] == board[1][1] && \\
board[1][1] == board[2][2] && \\
board[1][1] != INIT){
return board[1][1];
}
if (board[2][0] == board[1][1] && \\
board[1][1] == board[0][2] && \\
board[1][1] != INIT){
return board[1][1];
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == INIT){
return NEXT;
}
}
}
return DRAW;
}
由于运用多文件编码的方法,还需要对头文件,函数变量进行声明。
#ifndef __THREECHESS_H__//防止头文件被重复包含
#define __THREECHESS_H__
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#define ROW 3//行数
#define COL 3//列数
#define INIT ' '//棋盘初始值
#define DRAW 'P' //和局
#define COM 'X' //电脑棋子,电脑赢
#define PLAY 'O'//玩家棋子,玩家赢
#define NEXT 'N'//棋盘未下完,继续往下下
extern void Menu();
extern void Game();
#endif
如需使用直接将上面代码复制即可。
以上是关于用C语言编写三子棋小游戏的主要内容,如果未能解决你的问题,请参考以下文章