C語言實現(xiàn)簡單的三子棋
本文實例為大家分享了C語言實現(xiàn)簡單三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
一、主要思想
1、創(chuàng)建一個3*3的棋盤(使用字符數(shù)組)
2、初始化棋盤(用空格填充)
3、打印棋盤(使其有可見的邊框)
4、玩家落子,用x表示(檢驗是否越界,是否已經(jīng)落子,是否贏)
5、電腦落子,用o表示(檢驗是否已經(jīng)落子,是否贏) 注:電腦在有效范圍內(nèi)隨機落子,使用當前時間戳設置隨機種子即srand(time(0))
6、三種情況:玩家贏,電腦贏,和棋
二、代碼實現(xiàn)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定義宏,棋盤的最大行數(shù)和最大列數(shù)為3
#define MAX_ROW 3
#define MAX_COL 3
//無論是玩家落子還是電腦落子,都需確定落子的行和列,以此確定在棋盤上的位置
//玩家落子
//玩家輸入之后,需要檢驗是否輸入越界,該位置是否已經(jīng)落子
//若無這兩種情況,就將該位置賦值為'x',否則重新輸入
char playermove(char chessboard[MAX_ROW][MAX_COL])
{
int row = 0;
int col = 0;
while (1){
printf("請輸入您落子的位置:(row col)");
scanf("%d %d", &row, &col);
//校驗
//校驗輸入是否輸入有誤
if (row < 0 || row >= MAX_ROW || col<0 || col>=MAX_COL){
printf("您的輸入越界!!\n");
continue;
}else if (chessboard[row][col]!=' '){
printf("該位置已落子!!\n");
continue;
}else{
chessboard[row][col] = 'x';
return chessboard[row][col];
}
}
}
//電腦落子
//需要檢驗該位置是否落子(無需檢驗是否越界,因為我們設置的落子范圍為有效范圍)
//若無以上情況,就將該位置賦值為'o',否則,重新獲取隨機值
void computermove(char chessboard[MAX_ROW][MAX_COL])
{
while (1){
int row = rand() % MAX_ROW; //獲取一個0~2范圍內(nèi)的隨機行數(shù)
int col = rand() % MAX_COL; //獲取一個0~2范圍內(nèi)的隨機列數(shù)
//校驗落子位置是否已經(jīng)落子
if (chessboard[row][col] != ' '){
continue;
}
chessboard[row][col] = 'o';
break;
}
}
//判斷是否為和棋,即判斷棋盤是否滿
//找到空格代表未滿,找不到,則滿了(因為我們初始化的時候?qū)⑵灞P初始化為空格' ')
//滿返回1,未滿返回0
char isFull(char chessboard[MAX_ROW][MAX_COL])
{
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
//找到空格
if (chessboard[row][col] == ' '){
return 0;
}
}
}
//未找到,即滿了
return 1;
}
//判斷是否贏
//'x'表示玩家獲勝
//'o'表示電腦獲勝
//' '表示勝負未分
//'h'表示和棋
char isWin(char chessboard[MAX_ROW][MAX_COL])
{
//同一行相同
//注意:相同應排除空格相同的情況,以下同
for (int row = 0; row < MAX_ROW; row++){
if (chessboard[row][0]!=' '
&&(chessboard[row][0] ==chessboard[row][1])
&&(chessboard[row][0]== chessboard[row][2])){
return chessboard[row][0];
}
}
//同一列相同
for (int col = 0; col < MAX_COL; col++){
if (chessboard[0][col]!=' '
&&(chessboard[0][col] == chessboard[1][col])
&&(chessboard[0][col] == chessboard[2][col])){
return chessboard[0][col];
}
}
//對角線相同
if (chessboard[0][0] != ' '
&& (chessboard[0][0] == chessboard[1][1])
&& (chessboard[0][0] == chessboard[2][2])){
return chessboard[0][0];
}
if (chessboard[0][2] != ' '
&&(chessboard[0][2] == chessboard[1][1])
&&(chessboard[0][2] == chessboard[2][0])){
return chessboard[0][2];
}
//和棋
if (isFull(chessboard)){
return 'h';
}
return ' ';
}
//初始化棋盤,初始化為空格' '
void init(char chessboard[MAX_ROW][MAX_COL])
{
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
chessboard[row][col] = ' ';
}
}
}
//打印棋盤
void printchessboard(char chessboard[MAX_ROW][MAX_COL])
{
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++){
printf("| %c | %c | %c |\n", chessboard[row][0], chessboard[row][1], chessboard[row][2]);
printf("+---+---+---+\n");
}
}
//游戲
void game()
{
char chessboard[MAX_ROW][MAX_COL] = {0};
init(chessboard);//初始化棋盤
char winner = ' ';
while (1){
printchessboard(chessboard);//打印棋盤
playermove(chessboard);//玩家落子
//校驗,是否贏是否和棋
winner = isWin(chessboard);
if (winner != ' '){
break;
}
computermove(chessboard);//電腦落子
winner = isWin(chessboard);
if (winner != ' '){
break;
}
}
if (winner == 'x'){
printchessboard(chessboard);
printf("恭喜您贏了!\n");
}else if (winner == 'o'){
printchessboard(chessboard);
printf("很遺憾您輸了!\n");
}else if (winner == 'h'){
printchessboard(chessboard);
printf("和棋!您和電腦棋技相當~\n");
}
}
//菜單
int menue(int choice)
{
printf("************************\n");
printf("1.開始游戲\n");
printf("0.結(jié)束游戲\n");
printf("************************\n");
printf("請輸入您的選擇:");
scanf("%d", &choice);
return choice;
}
//主函數(shù)
int main()
{
srand(time(0));
int choice = 0;
while (1){
choice=menue(choice);
if (choice == 1){
game();
}else if (choice == 0){
break;
}else{
printf("您的輸入有誤,請重新輸入\n");
continue;
}
}
system("pause");
return 0;
}
三、運行結(jié)果

大概框架如此,也可以進行優(yōu)化,比如system("cls")清屏等
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++11右值引用和轉(zhuǎn)發(fā)型引用教程詳解
這篇文章主要介紹了C++11右值引用和轉(zhuǎn)發(fā)型引用教程詳解,需要的朋友可以參考下2018-03-03
C語言小項目計時器的實現(xiàn)思路(倒計時+報警提示)
這篇文章主要介紹了C語言小項目計時器(倒計時+報警提示)的實現(xiàn)思路,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11

