C語言實(shí)現(xiàn)簡單三子棋游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡單三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
游戲介紹:使用C語言中二維數(shù)組和函數(shù)的基本知識(shí)實(shí)現(xiàn)一個(gè)三子棋游戲,這個(gè)游戲要實(shí)現(xiàn)的基本功能有初始化棋盤、棋盤的打印、玩家下棋、電腦下棋、判斷輸贏。
代碼框架:
1.頭文件(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 //聲明函數(shù) //初始化棋盤 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 check_win(char board[ROW][COL], int row, int col); //判斷棋盤是否為滿 int is_full(char board[ROW][COL], int row, int col);
2.函數(shù)實(shí)現(xiàn)(game.c)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
// int i = 0;
// for (i = 0; i < row; i++)
// {
// //打印數(shù)據(jù)
// printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
// //打印分割行
// if (i<row-1)
// printf("---|---|---\n");
// }
//}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印數(shù)據(jù)
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("玩家走:>");
while(1)
{
printf("請(qǐng)輸入坐標(biāo):>");
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] = '*';
break;
}
else
{
printf("該坐標(biāo)被占用,請(qǐng)重新輸入\n");
}
}
else
{
printf("坐標(biāo)非法,清重新輸入\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] = '#';
break;
}
}
}
int is_full(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 check_win(char board[ROW][COL], int row, int col)
{
int i = 0;
//檢測(cè)行是否相同
for (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];
}
}
//檢測(cè)列是否相同
for (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];
}
}
//檢測(cè)對(duì)角線
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[0][2] != ' ')
{
return board[0][2];
}
//檢測(cè)是否為平局
if (is_full(board,row,col))
{
return 'Q';//平局
}
return ' ';//繼續(xù)玩
}
3.測(cè)試文件(test.c)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("****************************\n");
printf("********* 1.play *********\n");
printf("********* 0.exit *********\n");
printf("****************************\n");
}
void game()
{
int x = 0;
int y = 0;
char ret = 0;
//設(shè)計(jì)三子棋游戲
//數(shù)組應(yīng)該初始化為空格
char board[ROW][COL] = { 0 };//存儲(chǔ)數(shù)據(jù)
InitBoard(board , ROW , COL);//初始化棋盤--空格
//打印棋盤
DisplayBoard(board,ROW,COL);
while (1)
{
PlayerMove(board,ROW,COL);
if ((ret = check_win(board, ROW, COL)) != ' ')
break;
DisplayBoard(board, ROW, COL);
ComputerMove(board,ROW,COL);
if ((ret = check_win(board, ROW, COL)) != ' ')
break;
DisplayBoard(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家贏\n");
}
else if (ret == '#')
{
printf("電腦贏\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請(qǐng)選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
} while (input);
return 0;
}
4.游戲結(jié)果示例


以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Matlab控制電腦攝像實(shí)現(xiàn)實(shí)時(shí)人臉檢測(cè)和識(shí)別詳解
人臉識(shí)別過程主要由四個(gè)階段組成:人臉檢測(cè)、圖像預(yù)處理、面部特征提取和特征識(shí)別。這篇文章主要介紹了如何使用MATLAB控制筆記本電腦的攝像頭,并進(jìn)行實(shí)時(shí)人臉檢測(cè)和識(shí)別,需要的可以參考一下2022-10-10
C語言中數(shù)據(jù)結(jié)構(gòu)之鏈表歸并排序?qū)嵗a
這篇文章主要介紹了C語言中數(shù)據(jù)結(jié)構(gòu)之鏈表歸并排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下2017-05-05
深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指針)
本篇文章是對(duì)const int *p與int * const p的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
淺談C++基類的析構(gòu)函數(shù)為虛函數(shù)
本文重點(diǎn):應(yīng)該為多態(tài)基類聲明虛析構(gòu)器。一旦一個(gè)類包含虛函數(shù),它就應(yīng)該包含一個(gè)虛析構(gòu)器。如果一個(gè)類不用作基類或者不需具有多態(tài)性,便不應(yīng)該為它聲明虛析構(gòu)器。2015-10-10
基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)
下面小編就為大家?guī)硪黄贑++ bitset常用函數(shù)及運(yùn)算符(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
C++實(shí)現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法
這篇文章主要介紹了C++實(shí)現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法,對(duì)于C++程序算法設(shè)計(jì)有一定的借鑒價(jià)值,需要的朋友可以參考下2014-09-09
Matlab制作視頻并轉(zhuǎn)換成gif動(dòng)態(tài)圖的兩種方法
這篇文章主要介紹了Matlab制作視頻并轉(zhuǎn)換成gif動(dòng)態(tài)圖的兩種方法,第一種方法使用movie(f)直接取生成AVI視頻文件,相對(duì)來說比較簡單,需要的朋友可以參考下2018-08-08

